@across-protocol/sdk 4.1.14 → 4.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/providers/index.d.ts +1 -0
- package/dist/cjs/providers/index.js +1 -0
- package/dist/cjs/providers/index.js.map +1 -1
- package/dist/cjs/providers/retryProvider.d.ts +6 -1
- package/dist/cjs/providers/retryProvider.js +27 -11
- package/dist/cjs/providers/retryProvider.js.map +1 -1
- package/dist/cjs/providers/solana/baseRpcFactories.d.ts +11 -0
- package/dist/cjs/providers/solana/baseRpcFactories.js +30 -0
- package/dist/cjs/providers/solana/baseRpcFactories.js.map +1 -0
- package/dist/cjs/providers/solana/defaultRpcFactory.d.ts +6 -0
- package/dist/cjs/providers/solana/defaultRpcFactory.js +22 -0
- package/dist/cjs/providers/solana/defaultRpcFactory.js.map +1 -0
- package/dist/cjs/providers/solana/index.d.ts +4 -0
- package/dist/cjs/providers/solana/index.js +8 -0
- package/dist/cjs/providers/solana/index.js.map +1 -0
- package/dist/cjs/providers/solana/rateLimitedRpcFactory.d.ts +16 -0
- package/dist/cjs/providers/solana/rateLimitedRpcFactory.js +105 -0
- package/dist/cjs/providers/solana/rateLimitedRpcFactory.js.map +1 -0
- package/dist/cjs/providers/solana/utils.d.ts +6 -0
- package/dist/cjs/providers/solana/utils.js +3 -0
- package/dist/cjs/providers/solana/utils.js.map +1 -0
- package/dist/esm/providers/index.d.ts +1 -0
- package/dist/esm/providers/index.js +1 -0
- package/dist/esm/providers/index.js.map +1 -1
- package/dist/esm/providers/retryProvider.d.ts +17 -1
- package/dist/esm/providers/retryProvider.js +42 -17
- package/dist/esm/providers/retryProvider.js.map +1 -1
- package/dist/esm/providers/solana/baseRpcFactories.d.ts +11 -0
- package/dist/esm/providers/solana/baseRpcFactories.js +31 -0
- package/dist/esm/providers/solana/baseRpcFactories.js.map +1 -0
- package/dist/esm/providers/solana/defaultRpcFactory.d.ts +6 -0
- package/dist/esm/providers/solana/defaultRpcFactory.js +20 -0
- package/dist/esm/providers/solana/defaultRpcFactory.js.map +1 -0
- package/dist/esm/providers/solana/index.d.ts +4 -0
- package/dist/esm/providers/solana/index.js +5 -0
- package/dist/esm/providers/solana/index.js.map +1 -0
- package/dist/esm/providers/solana/rateLimitedRpcFactory.d.ts +16 -0
- package/dist/esm/providers/solana/rateLimitedRpcFactory.js +116 -0
- package/dist/esm/providers/solana/rateLimitedRpcFactory.js.map +1 -0
- package/dist/esm/providers/solana/utils.d.ts +9 -0
- package/dist/esm/providers/solana/utils.js +2 -0
- package/dist/esm/providers/solana/utils.js.map +1 -0
- package/dist/types/providers/index.d.ts +1 -0
- package/dist/types/providers/index.d.ts.map +1 -1
- package/dist/types/providers/retryProvider.d.ts +17 -1
- package/dist/types/providers/retryProvider.d.ts.map +1 -1
- package/dist/types/providers/solana/baseRpcFactories.d.ts +12 -0
- package/dist/types/providers/solana/baseRpcFactories.d.ts.map +1 -0
- package/dist/types/providers/solana/defaultRpcFactory.d.ts +7 -0
- package/dist/types/providers/solana/defaultRpcFactory.d.ts.map +1 -0
- package/dist/types/providers/solana/index.d.ts +5 -0
- package/dist/types/providers/solana/index.d.ts.map +1 -0
- package/dist/types/providers/solana/rateLimitedRpcFactory.d.ts +17 -0
- package/dist/types/providers/solana/rateLimitedRpcFactory.d.ts.map +1 -0
- package/dist/types/providers/solana/utils.d.ts +10 -0
- package/dist/types/providers/solana/utils.d.ts.map +1 -0
- package/package.json +3 -1
- package/src/providers/index.ts +1 -0
- package/src/providers/retryProvider.ts +44 -17
- package/src/providers/solana/baseRpcFactories.ts +25 -0
- package/src/providers/solana/defaultRpcFactory.ts +13 -0
- package/src/providers/solana/index.ts +4 -0
- package/src/providers/solana/rateLimitedRpcFactory.ts +101 -0
- package/src/providers/solana/utils.ts +14 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { __extends } from "tslib";
|
|
2
|
+
import { createSolanaRpcFromTransport } from "@solana/web3.js";
|
|
3
|
+
// This is abstract base class for creating Solana RPC clients and transports.
|
|
4
|
+
var SolanaBaseRpcFactory = /** @class */ (function () {
|
|
5
|
+
function SolanaBaseRpcFactory(chainId) {
|
|
6
|
+
this.chainId = chainId;
|
|
7
|
+
}
|
|
8
|
+
// This method creates a Solana RPC client from the implemented transport.
|
|
9
|
+
SolanaBaseRpcFactory.prototype.createRpcClient = function () {
|
|
10
|
+
return createSolanaRpcFromTransport(this.createTransport());
|
|
11
|
+
};
|
|
12
|
+
return SolanaBaseRpcFactory;
|
|
13
|
+
}());
|
|
14
|
+
export { SolanaBaseRpcFactory };
|
|
15
|
+
// Enhanced class for creating Solana RPC clients and transports storing additional cluster info.
|
|
16
|
+
// This can be used by derived classes that are connected to a single base transport.
|
|
17
|
+
var SolanaClusterRpcFactory = /** @class */ (function (_super) {
|
|
18
|
+
__extends(SolanaClusterRpcFactory, _super);
|
|
19
|
+
function SolanaClusterRpcFactory(clusterUrl) {
|
|
20
|
+
var baseConstructorParams = [];
|
|
21
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
22
|
+
baseConstructorParams[_i - 1] = arguments[_i];
|
|
23
|
+
}
|
|
24
|
+
var _this = _super.apply(this, baseConstructorParams) || this;
|
|
25
|
+
_this.clusterUrl = clusterUrl;
|
|
26
|
+
return _this;
|
|
27
|
+
}
|
|
28
|
+
return SolanaClusterRpcFactory;
|
|
29
|
+
}(SolanaBaseRpcFactory));
|
|
30
|
+
export { SolanaClusterRpcFactory };
|
|
31
|
+
//# sourceMappingURL=baseRpcFactories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseRpcFactories.js","sourceRoot":"","sources":["../../../../src/providers/solana/baseRpcFactories.ts"],"names":[],"mappings":";AAAA,OAAO,EAAc,4BAA4B,EAAgB,MAAM,iBAAiB,CAAC;AAEzF,8EAA8E;AAC9E;IACE,8BAAqB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAKxC,0EAA0E;IACnE,8CAAe,GAAtB;QACE,OAAO,4BAA4B,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9D,CAAC;IACH,2BAAC;AAAD,CAAC,AAVD,IAUC;;AAED,iGAAiG;AACjG,qFAAqF;AACrF;IAAsD,2CAAoB;IACxE,iCACW,UAAsB;QAC/B,+BAA4E;aAA5E,UAA4E,EAA5E,qBAA4E,EAA5E,IAA4E;YAA5E,8CAA4E;;QAF9E,+BAIW,qBAAqB,UAC/B;QAJU,gBAAU,GAAV,UAAU,CAAY;;IAIjC,CAAC;IACH,8BAAC;AAAD,CAAC,AAPD,CAAsD,oBAAoB,GAOzE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RpcTransport } from "@solana/web3.js";
|
|
2
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
3
|
+
export declare class SolanaDefaultRpcFactory extends SolanaClusterRpcFactory {
|
|
4
|
+
constructor(...clusterConstructorParams: ConstructorParameters<typeof SolanaClusterRpcFactory>);
|
|
5
|
+
createTransport(): RpcTransport;
|
|
6
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { __extends } from "tslib";
|
|
2
|
+
import { createDefaultRpcTransport } from "@solana/web3.js";
|
|
3
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
4
|
+
// Exposes default RPC transport for Solana in the SolanaClusterRpcFactory class.
|
|
5
|
+
var SolanaDefaultRpcFactory = /** @class */ (function (_super) {
|
|
6
|
+
__extends(SolanaDefaultRpcFactory, _super);
|
|
7
|
+
function SolanaDefaultRpcFactory() {
|
|
8
|
+
var clusterConstructorParams = [];
|
|
9
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
10
|
+
clusterConstructorParams[_i] = arguments[_i];
|
|
11
|
+
}
|
|
12
|
+
return _super.apply(this, clusterConstructorParams) || this;
|
|
13
|
+
}
|
|
14
|
+
SolanaDefaultRpcFactory.prototype.createTransport = function () {
|
|
15
|
+
return createDefaultRpcTransport({ url: this.clusterUrl });
|
|
16
|
+
};
|
|
17
|
+
return SolanaDefaultRpcFactory;
|
|
18
|
+
}(SolanaClusterRpcFactory));
|
|
19
|
+
export { SolanaDefaultRpcFactory };
|
|
20
|
+
//# sourceMappingURL=defaultRpcFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/solana/defaultRpcFactory.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,yBAAyB,EAAgB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,iFAAiF;AACjF;IAA6C,2CAAuB;IAClE;QAAY,kCAAkF;aAAlF,UAAkF,EAAlF,qBAAkF,EAAlF,IAAkF;YAAlF,6CAAkF;;kCACnF,wBAAwB;IACnC,CAAC;IAEM,iDAAe,GAAtB;QACE,OAAO,yBAAyB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IACH,8BAAC;AAAD,CAAC,AARD,CAA6C,uBAAuB,GAQnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/solana/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RpcResponse } from "@solana/web3.js";
|
|
2
|
+
import { Logger } from "winston";
|
|
3
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
4
|
+
import { SolanaDefaultRpcFactory } from "./defaultRpcFactory";
|
|
5
|
+
export declare class RateLimitedSolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
6
|
+
readonly pctRpcCallsLogged: number;
|
|
7
|
+
readonly logger: Logger;
|
|
8
|
+
private queue;
|
|
9
|
+
private readonly defaultTransport;
|
|
10
|
+
constructor(maxConcurrency: number, pctRpcCallsLogged: number, logger: Logger, ...defaultConstructorParams: ConstructorParameters<typeof SolanaDefaultRpcFactory>);
|
|
11
|
+
private wrapSendWithLog;
|
|
12
|
+
createTransport(): <TResponse>(config: Readonly<{
|
|
13
|
+
payload: unknown;
|
|
14
|
+
signal?: AbortSignal | undefined;
|
|
15
|
+
}>) => Promise<TResponse>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { __assign, __awaiter, __extends, __generator, __spreadArray } from "tslib";
|
|
2
|
+
import { queue } from "async";
|
|
3
|
+
import winston from "winston";
|
|
4
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
5
|
+
import { SolanaDefaultRpcFactory } from "./defaultRpcFactory";
|
|
6
|
+
import { getOriginFromURL } from "../../utils";
|
|
7
|
+
// This factory is a very small addition to the SolanaDefaultRpcFactory that ensures that no more than maxConcurrency
|
|
8
|
+
// requests are ever in flight. It uses the async/queue library to manage this.
|
|
9
|
+
var RateLimitedSolanaRpcFactory = /** @class */ (function (_super) {
|
|
10
|
+
__extends(RateLimitedSolanaRpcFactory, _super);
|
|
11
|
+
// Takes the same arguments as the SolanaDefaultRpcFactory, but it has an additional parameters to control
|
|
12
|
+
// concurrency and logging at the beginning of the list.
|
|
13
|
+
function RateLimitedSolanaRpcFactory(maxConcurrency, pctRpcCallsLogged, logger) {
|
|
14
|
+
if (logger === void 0) { logger = winston.createLogger({
|
|
15
|
+
transports: [new winston.transports.Console()],
|
|
16
|
+
}); }
|
|
17
|
+
var defaultConstructorParams = [];
|
|
18
|
+
for (var _i = 3; _i < arguments.length; _i++) {
|
|
19
|
+
defaultConstructorParams[_i - 3] = arguments[_i];
|
|
20
|
+
}
|
|
21
|
+
var _this = _super.apply(this, defaultConstructorParams) || this;
|
|
22
|
+
_this.pctRpcCallsLogged = pctRpcCallsLogged;
|
|
23
|
+
_this.logger = logger;
|
|
24
|
+
_this.defaultTransport = new (SolanaDefaultRpcFactory.bind.apply(SolanaDefaultRpcFactory, __spreadArray([void 0], defaultConstructorParams, false)))().createTransport();
|
|
25
|
+
// This sets up the queue. Each task is executed by forwarding the RPC request to the underlying base transport.
|
|
26
|
+
// This queue sends out requests concurrently, but stops once the concurrency limit is reached. The maxConcurrency
|
|
27
|
+
// is configured here.
|
|
28
|
+
_this.queue = queue(function (_a, callback) {
|
|
29
|
+
var rpcArgs = _a.rpcArgs, resolve = _a.resolve, reject = _a.reject;
|
|
30
|
+
return __awaiter(_this, void 0, void 0, function () {
|
|
31
|
+
return __generator(this, function (_b) {
|
|
32
|
+
switch (_b.label) {
|
|
33
|
+
case 0: return [4 /*yield*/, this.wrapSendWithLog.apply(this, rpcArgs).then(resolve)
|
|
34
|
+
.catch(reject)];
|
|
35
|
+
case 1:
|
|
36
|
+
_b.sent();
|
|
37
|
+
// we need this for the queue to know that the task is done
|
|
38
|
+
// @see: https://caolan.github.io/async/v3/global.html
|
|
39
|
+
callback();
|
|
40
|
+
return [2 /*return*/];
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}, maxConcurrency);
|
|
45
|
+
return _this;
|
|
46
|
+
}
|
|
47
|
+
RateLimitedSolanaRpcFactory.prototype.wrapSendWithLog = function () {
|
|
48
|
+
var rpcArgs = [];
|
|
49
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
50
|
+
rpcArgs[_i] = arguments[_i];
|
|
51
|
+
}
|
|
52
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
53
|
+
var payload, loggerArgs, startTime, result, elapsedTimeS, error_1, elapsedTimeS;
|
|
54
|
+
return __generator(this, function (_a) {
|
|
55
|
+
switch (_a.label) {
|
|
56
|
+
case 0:
|
|
57
|
+
if (!(this.pctRpcCallsLogged <= 0 || Math.random() > this.pctRpcCallsLogged / 100)) return [3 /*break*/, 2];
|
|
58
|
+
return [4 /*yield*/, this.defaultTransport.apply(this, rpcArgs)];
|
|
59
|
+
case 1:
|
|
60
|
+
// Non sample path: no logging or timing, just issue the request.
|
|
61
|
+
return [2 /*return*/, _a.sent()];
|
|
62
|
+
case 2:
|
|
63
|
+
payload = rpcArgs[0].payload;
|
|
64
|
+
loggerArgs = {
|
|
65
|
+
at: "SolanaProviderUtils",
|
|
66
|
+
message: "Solana provider response sample",
|
|
67
|
+
provider: getOriginFromURL(this.clusterUrl),
|
|
68
|
+
method: payload.method,
|
|
69
|
+
params: payload.params,
|
|
70
|
+
chainId: this.chainId,
|
|
71
|
+
datadog: true,
|
|
72
|
+
};
|
|
73
|
+
startTime = performance.now();
|
|
74
|
+
_a.label = 3;
|
|
75
|
+
case 3:
|
|
76
|
+
_a.trys.push([3, 5, , 6]);
|
|
77
|
+
return [4 /*yield*/, this.defaultTransport.apply(this, rpcArgs)];
|
|
78
|
+
case 4:
|
|
79
|
+
result = _a.sent();
|
|
80
|
+
elapsedTimeS = (performance.now() - startTime) / 1000;
|
|
81
|
+
this.logger.debug(__assign(__assign({}, loggerArgs), { success: true, timeElapsed: elapsedTimeS }));
|
|
82
|
+
return [2 /*return*/, result];
|
|
83
|
+
case 5:
|
|
84
|
+
error_1 = _a.sent();
|
|
85
|
+
elapsedTimeS = (performance.now() - startTime) / 1000;
|
|
86
|
+
this.logger.debug(__assign(__assign({}, loggerArgs), { success: false, timeElapsed: elapsedTimeS }));
|
|
87
|
+
throw error_1;
|
|
88
|
+
case 6: return [2 /*return*/];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
RateLimitedSolanaRpcFactory.prototype.createTransport = function () {
|
|
94
|
+
var _this = this;
|
|
95
|
+
return function () {
|
|
96
|
+
var args = [];
|
|
97
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
98
|
+
args[_i] = arguments[_i];
|
|
99
|
+
}
|
|
100
|
+
// This simply creates a promise and adds the arguments and resolve and reject handlers to the task.
|
|
101
|
+
return new Promise(function (resolve, reject) {
|
|
102
|
+
var task = {
|
|
103
|
+
rpcArgs: args,
|
|
104
|
+
resolve: resolve,
|
|
105
|
+
reject: reject,
|
|
106
|
+
};
|
|
107
|
+
// We didn't previously wait for this push so we can emulate
|
|
108
|
+
// the same behavior with the `void` keyword.
|
|
109
|
+
void _this.queue.push(task);
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
return RateLimitedSolanaRpcFactory;
|
|
114
|
+
}(SolanaClusterRpcFactory));
|
|
115
|
+
export { RateLimitedSolanaRpcFactory };
|
|
116
|
+
//# sourceMappingURL=rateLimitedRpcFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimitedRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/solana/rateLimitedRpcFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RpcTransport } from "@solana/rpc-spec";
|
|
2
|
+
/**
|
|
3
|
+
* This is the type we pass to define a Solana RPC request "task".
|
|
4
|
+
*/
|
|
5
|
+
export interface SolanaRateLimitTask {
|
|
6
|
+
rpcArgs: Parameters<RpcTransport>;
|
|
7
|
+
resolve: (result: unknown) => void;
|
|
8
|
+
reject: (err: unknown) => void;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/providers/solana/utils.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,cAAc,UAAU,CAAC"}
|
|
@@ -12,7 +12,23 @@ export declare class RetryProvider extends ethers.providers.StaticJsonRpcProvide
|
|
|
12
12
|
send(method: string, params: Array<unknown>): Promise<unknown>;
|
|
13
13
|
_validateResponse(method: string, _: Array<unknown>, response: unknown): boolean;
|
|
14
14
|
_sendAndValidate(provider: ethers.providers.StaticJsonRpcProvider, method: string, params: Array<unknown>): Promise<unknown>;
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Validate and parse a possible JSON-RPC error response.
|
|
17
|
+
* @param error An unknown error object received in response to a JSON-RPC request.
|
|
18
|
+
* @returns A JSON-RPC error object, or undefined.
|
|
19
|
+
*/
|
|
20
|
+
protected parseError(response: unknown): {
|
|
21
|
+
code: number;
|
|
22
|
+
message: string;
|
|
23
|
+
data?: unknown;
|
|
24
|
+
} | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Determine whether a JSON-RPC error response indicates an unrecoverable error.
|
|
27
|
+
* @param method JSON-RPC method that produced the error.
|
|
28
|
+
* @param error JSON-RPC error instance.
|
|
29
|
+
* @returns True if the request should be aborted immediately, otherwise false.
|
|
30
|
+
*/
|
|
31
|
+
protected failImmediate(method: string, response: unknown): boolean;
|
|
16
32
|
_trySend(provider: ethers.providers.StaticJsonRpcProvider, method: string, params: Array<unknown>): Promise<unknown>;
|
|
17
33
|
_getQuorum(method: string, params: Array<unknown>): number;
|
|
18
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/retryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAQ1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,qBAAa,aAAc,SAAQ,MAAM,CAAC,SAAS,CAAC,qBAAqB;IAKrE,QAAQ,CAAC,mBAAmB,EAAE,MAAM;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM;IAO/B,QAAQ,CAAC,MAAM,CAAC;IAdlB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;gBAE3D,MAAM,EAAE,qBAAqB,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAAE,EAC9E,OAAO,EAAE,MAAM,EACN,mBAAmB,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,EAC/B,sBAAsB,EAAE,MAAM,EAC9B,iBAAiB,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,yBAAyB,EACvC,wBAAwB,CAAC,EAAE,MAAM,EACjC,kBAAkB,CAAC,EAAE,MAAM,EAC3B,gBAAgB,SAAqB,EAC5B,MAAM,CAAC,oBAAQ;IA2CX,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAmK7E,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO;IAO1E,gBAAgB,CACpB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAChD,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"retryProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/retryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAQ1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,qBAAa,aAAc,SAAQ,MAAM,CAAC,SAAS,CAAC,qBAAqB;IAKrE,QAAQ,CAAC,mBAAmB,EAAE,MAAM;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM;IAO/B,QAAQ,CAAC,MAAM,CAAC;IAdlB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;gBAE3D,MAAM,EAAE,qBAAqB,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAAE,EAC9E,OAAO,EAAE,MAAM,EACN,mBAAmB,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,EAC/B,sBAAsB,EAAE,MAAM,EAC9B,iBAAiB,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,yBAAyB,EACvC,wBAAwB,CAAC,EAAE,MAAM,EACjC,kBAAkB,CAAC,EAAE,MAAM,EAC3B,gBAAgB,SAAqB,EAC5B,MAAM,CAAC,oBAAQ;IA2CX,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAmK7E,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO;IAO1E,gBAAgB,CACpB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAChD,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,OAAO,CAAC;IAiBnB;;;;OAIG;IACH,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS;IAiBtG;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO;IA+B7D,QAAQ,CACZ,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAChD,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,OAAO,CAAC;IAiBnB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM;CAqB3D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ClusterUrl, RpcTransport } from "@solana/web3.js";
|
|
2
|
+
export declare abstract class SolanaBaseRpcFactory {
|
|
3
|
+
readonly chainId: number;
|
|
4
|
+
constructor(chainId: number);
|
|
5
|
+
abstract createTransport(): RpcTransport;
|
|
6
|
+
createRpcClient(): import("@solana/web3.js").Rpc<import("@solana/web3.js").RequestAirdropApi & import("@solana/web3.js").GetAccountInfoApi & import("@solana/web3.js").GetBalanceApi & import("@solana/web3.js").GetBlockApi & import("@solana/web3.js").GetBlockCommitmentApi & import("@solana/web3.js").GetBlockHeightApi & import("@solana/web3.js").GetBlockProductionApi & import("@solana/web3.js").GetBlocksApi & import("@solana/web3.js").GetBlocksWithLimitApi & import("@solana/web3.js").GetBlockTimeApi & import("@solana/web3.js").GetClusterNodesApi & import("@solana/web3.js").GetEpochInfoApi & import("@solana/web3.js").GetEpochScheduleApi & import("@solana/web3.js").GetFeeForMessageApi & import("@solana/web3.js").GetFirstAvailableBlockApi & import("@solana/web3.js").GetGenesisHashApi & import("@solana/web3.js").GetHealthApi & import("@solana/web3.js").GetHighestSnapshotSlotApi & import("@solana/web3.js").GetIdentityApi & import("@solana/web3.js").GetInflationGovernorApi & import("@solana/web3.js").GetInflationRateApi & import("@solana/web3.js").GetInflationRewardApi & import("@solana/web3.js").GetLargestAccountsApi & import("@solana/web3.js").GetLatestBlockhashApi & import("@solana/web3.js").GetLeaderScheduleApi & import("@solana/web3.js").GetMaxRetransmitSlotApi & import("@solana/web3.js").GetMaxShredInsertSlotApi & import("@solana/web3.js").GetMinimumBalanceForRentExemptionApi & import("@solana/web3.js").GetMultipleAccountsApi & import("@solana/web3.js").GetProgramAccountsApi & import("@solana/web3.js").GetRecentPerformanceSamplesApi & import("@solana/web3.js").GetRecentPrioritizationFeesApi & import("@solana/web3.js").GetSignaturesForAddressApi & import("@solana/web3.js").GetSignatureStatusesApi & import("@solana/web3.js").GetSlotApi & import("@solana/web3.js").GetSlotLeaderApi & import("@solana/web3.js").GetSlotLeadersApi & import("@solana/web3.js").GetStakeMinimumDelegationApi & import("@solana/web3.js").GetSupplyApi & import("@solana/web3.js").GetTokenAccountBalanceApi & import("@solana/web3.js").GetTokenAccountsByDelegateApi & import("@solana/web3.js").GetTokenAccountsByOwnerApi & import("@solana/web3.js").GetTokenLargestAccountsApi & import("@solana/web3.js").GetTokenSupplyApi & import("@solana/web3.js").GetTransactionApi & import("@solana/web3.js").GetTransactionCountApi & import("@solana/web3.js").GetVersionApi & import("@solana/web3.js").GetVoteAccountsApi & import("@solana/web3.js").IsBlockhashValidApi & import("@solana/web3.js").MinimumLedgerSlotApi & import("@solana/web3.js").SendTransactionApi & import("@solana/web3.js").SimulateTransactionApi>;
|
|
7
|
+
}
|
|
8
|
+
export declare abstract class SolanaClusterRpcFactory extends SolanaBaseRpcFactory {
|
|
9
|
+
readonly clusterUrl: ClusterUrl;
|
|
10
|
+
constructor(clusterUrl: ClusterUrl, ...baseConstructorParams: ConstructorParameters<typeof SolanaBaseRpcFactory>);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=baseRpcFactories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseRpcFactories.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/baseRpcFactories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgC,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGzF,8BAAsB,oBAAoB;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;aAGpB,eAAe,IAAI,YAAY;IAGxC,eAAe;CAGvB;AAID,8BAAsB,uBAAwB,SAAQ,oBAAoB;IAEtE,QAAQ,CAAC,UAAU,EAAE,UAAU;gBAAtB,UAAU,EAAE,UAAU,EAC/B,GAAG,qBAAqB,EAAE,qBAAqB,CAAC,OAAO,oBAAoB,CAAC;CAI/E"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RpcTransport } from "@solana/web3.js";
|
|
2
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
3
|
+
export declare class SolanaDefaultRpcFactory extends SolanaClusterRpcFactory {
|
|
4
|
+
constructor(...clusterConstructorParams: ConstructorParameters<typeof SolanaClusterRpcFactory>);
|
|
5
|
+
createTransport(): RpcTransport;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=defaultRpcFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultRpcFactory.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/defaultRpcFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,qBAAa,uBAAwB,SAAQ,uBAAuB;gBACtD,GAAG,wBAAwB,EAAE,qBAAqB,CAAC,OAAO,uBAAuB,CAAC;IAIvF,eAAe,IAAI,YAAY;CAGvC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RpcResponse } from "@solana/web3.js";
|
|
2
|
+
import { Logger } from "winston";
|
|
3
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
4
|
+
import { SolanaDefaultRpcFactory } from "./defaultRpcFactory";
|
|
5
|
+
export declare class RateLimitedSolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
6
|
+
readonly pctRpcCallsLogged: number;
|
|
7
|
+
readonly logger: Logger;
|
|
8
|
+
private queue;
|
|
9
|
+
private readonly defaultTransport;
|
|
10
|
+
constructor(maxConcurrency: number, pctRpcCallsLogged: number, logger: Logger, ...defaultConstructorParams: ConstructorParameters<typeof SolanaDefaultRpcFactory>);
|
|
11
|
+
private wrapSendWithLog;
|
|
12
|
+
createTransport(): <TResponse>(config: Readonly<{
|
|
13
|
+
payload: unknown;
|
|
14
|
+
signal?: AbortSignal | undefined;
|
|
15
|
+
}>) => Promise<TResponse>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=rateLimitedRpcFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimitedRpcFactory.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/rateLimitedRpcFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAgB,MAAM,iBAAiB,CAAC;AAE5D,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAM9D,qBAAa,2BAA4B,SAAQ,uBAAuB;IAWpE,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM;IAVzB,OAAO,CAAC,KAAK,CAAmC;IAGhD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAe;gBAK9C,cAAc,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAEf,EACF,GAAG,wBAAwB,EAAE,qBAAqB,CAAC,OAAO,uBAAuB,CAAC;YAkBtE,eAAe;IA0CtB,eAAe;;;;CAevB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RpcTransport } from "@solana/rpc-spec";
|
|
2
|
+
/**
|
|
3
|
+
* This is the type we pass to define a Solana RPC request "task".
|
|
4
|
+
*/
|
|
5
|
+
export interface SolanaRateLimitTask {
|
|
6
|
+
rpcArgs: Parameters<RpcTransport>;
|
|
7
|
+
resolve: (result: unknown) => void;
|
|
8
|
+
reject: (err: unknown) => void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAElC,OAAO,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IAIlC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAChC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@across-protocol/sdk",
|
|
3
3
|
"author": "UMA Team",
|
|
4
|
-
"version": "4.1.
|
|
4
|
+
"version": "4.1.16",
|
|
5
5
|
"license": "AGPL-3.0",
|
|
6
6
|
"homepage": "https://docs.across.to/reference/sdk",
|
|
7
7
|
"files": [
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
}
|
|
49
49
|
],
|
|
50
50
|
"devDependencies": {
|
|
51
|
+
"@coral-xyz/borsh": "^0.30.1",
|
|
51
52
|
"@defi-wonderland/smock": "^2.3.5",
|
|
52
53
|
"@eth-optimism/contracts": "^0.5.37",
|
|
53
54
|
"@nomiclabs/hardhat-ethers": "^2.2.1",
|
|
@@ -104,6 +105,7 @@
|
|
|
104
105
|
"@eth-optimism/sdk": "^3.3.1",
|
|
105
106
|
"@ethersproject/bignumber": "^5.7.0",
|
|
106
107
|
"@pinata/sdk": "^2.1.0",
|
|
108
|
+
"@solana/web3.js": "^2.0.0",
|
|
107
109
|
"@types/mocha": "^10.0.1",
|
|
108
110
|
"@uma/sdk": "^0.34.10",
|
|
109
111
|
"arweave": "^1.14.4",
|
package/src/providers/index.ts
CHANGED
|
@@ -94,7 +94,7 @@ export class RetryProvider extends ethers.providers.StaticJsonRpcProvider {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
// If one RPC provider reverted, others likely will too. Skip them.
|
|
97
|
-
if (quorumThreshold === 1 && this.
|
|
97
|
+
if (quorumThreshold === 1 && this.failImmediate(method, err)) {
|
|
98
98
|
throw err;
|
|
99
99
|
}
|
|
100
100
|
|
|
@@ -258,24 +258,38 @@ export class RetryProvider extends ethers.providers.StaticJsonRpcProvider {
|
|
|
258
258
|
return response;
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
261
|
+
/**
|
|
262
|
+
* Validate and parse a possible JSON-RPC error response.
|
|
263
|
+
* @param error An unknown error object received in response to a JSON-RPC request.
|
|
264
|
+
* @returns A JSON-RPC error object, or undefined.
|
|
265
|
+
*/
|
|
266
|
+
protected parseError(response: unknown): { code: number; message: string; data?: unknown } | undefined {
|
|
267
|
+
if (!RpcError.is(response)) {
|
|
268
|
+
return;
|
|
266
269
|
}
|
|
267
270
|
|
|
268
|
-
let response: unknown;
|
|
269
271
|
try {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
272
|
+
const error = JSON.parse(response.body);
|
|
273
|
+
if (!JsonRpcError.is(error)) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return error.error;
|
|
273
278
|
} catch {
|
|
274
|
-
return
|
|
279
|
+
return;
|
|
275
280
|
}
|
|
281
|
+
}
|
|
276
282
|
|
|
277
|
-
|
|
278
|
-
|
|
283
|
+
/**
|
|
284
|
+
* Determine whether a JSON-RPC error response indicates an unrecoverable error.
|
|
285
|
+
* @param method JSON-RPC method that produced the error.
|
|
286
|
+
* @param error JSON-RPC error instance.
|
|
287
|
+
* @returns True if the request should be aborted immediately, otherwise false.
|
|
288
|
+
*/
|
|
289
|
+
protected failImmediate(method: string, response: unknown): boolean {
|
|
290
|
+
const err = this.parseError(response);
|
|
291
|
+
if (!err) {
|
|
292
|
+
return false; // Not a JSON-RPC error.
|
|
279
293
|
}
|
|
280
294
|
|
|
281
295
|
// [-32768, -32100] is reserved by the JSON-RPC spec.
|
|
@@ -283,11 +297,24 @@ export class RetryProvider extends ethers.providers.StaticJsonRpcProvider {
|
|
|
283
297
|
// Everything else is available for use by the application space.
|
|
284
298
|
// Most node implementations return 3 for an eth_call revert, but some return -32000.
|
|
285
299
|
// See also https://www.jsonrpc.org/specification
|
|
286
|
-
if (
|
|
287
|
-
return false;
|
|
300
|
+
if (err.code >= -32768 && err.code <= -32100) {
|
|
301
|
+
return false; // Cannot handle these errors.
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// The `data` member of err _may_ be populated but would need to be verified.
|
|
305
|
+
const message = err.message.toLowerCase();
|
|
306
|
+
switch (method) {
|
|
307
|
+
case "eth_call":
|
|
308
|
+
case "eth_estimateGas":
|
|
309
|
+
return message.includes("revert"); // Transaction will fail.
|
|
310
|
+
case "eth_sendRawTransaction":
|
|
311
|
+
// Nonce too low or gas price is too low.
|
|
312
|
+
return message.includes("nonce") || message.includes("underpriced");
|
|
313
|
+
default:
|
|
314
|
+
break;
|
|
288
315
|
}
|
|
289
316
|
|
|
290
|
-
return
|
|
317
|
+
return false;
|
|
291
318
|
}
|
|
292
319
|
|
|
293
320
|
async _trySend(
|
|
@@ -304,7 +331,7 @@ export class RetryProvider extends ethers.providers.StaticJsonRpcProvider {
|
|
|
304
331
|
return settled.value;
|
|
305
332
|
}
|
|
306
333
|
|
|
307
|
-
if (retries-- <= 0 || this.
|
|
334
|
+
if (retries-- <= 0 || this.failImmediate(method, settled.reason)) {
|
|
308
335
|
throw settled.reason;
|
|
309
336
|
}
|
|
310
337
|
await delay(this.delay);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ClusterUrl, createSolanaRpcFromTransport, RpcTransport } from "@solana/web3.js";
|
|
2
|
+
|
|
3
|
+
// This is abstract base class for creating Solana RPC clients and transports.
|
|
4
|
+
export abstract class SolanaBaseRpcFactory {
|
|
5
|
+
constructor(readonly chainId: number) {}
|
|
6
|
+
|
|
7
|
+
// This method must be implemented by the derived class to create a transport.
|
|
8
|
+
public abstract createTransport(): RpcTransport;
|
|
9
|
+
|
|
10
|
+
// This method creates a Solana RPC client from the implemented transport.
|
|
11
|
+
public createRpcClient() {
|
|
12
|
+
return createSolanaRpcFromTransport(this.createTransport());
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Enhanced class for creating Solana RPC clients and transports storing additional cluster info.
|
|
17
|
+
// This can be used by derived classes that are connected to a single base transport.
|
|
18
|
+
export abstract class SolanaClusterRpcFactory extends SolanaBaseRpcFactory {
|
|
19
|
+
constructor(
|
|
20
|
+
readonly clusterUrl: ClusterUrl,
|
|
21
|
+
...baseConstructorParams: ConstructorParameters<typeof SolanaBaseRpcFactory>
|
|
22
|
+
) {
|
|
23
|
+
super(...baseConstructorParams);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createDefaultRpcTransport, RpcTransport } from "@solana/web3.js";
|
|
2
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
3
|
+
|
|
4
|
+
// Exposes default RPC transport for Solana in the SolanaClusterRpcFactory class.
|
|
5
|
+
export class SolanaDefaultRpcFactory extends SolanaClusterRpcFactory {
|
|
6
|
+
constructor(...clusterConstructorParams: ConstructorParameters<typeof SolanaClusterRpcFactory>) {
|
|
7
|
+
super(...clusterConstructorParams);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public createTransport(): RpcTransport {
|
|
11
|
+
return createDefaultRpcTransport({ url: this.clusterUrl });
|
|
12
|
+
}
|
|
13
|
+
}
|