@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.
Files changed (64) hide show
  1. package/dist/cjs/providers/index.d.ts +1 -0
  2. package/dist/cjs/providers/index.js +1 -0
  3. package/dist/cjs/providers/index.js.map +1 -1
  4. package/dist/cjs/providers/retryProvider.d.ts +6 -1
  5. package/dist/cjs/providers/retryProvider.js +27 -11
  6. package/dist/cjs/providers/retryProvider.js.map +1 -1
  7. package/dist/cjs/providers/solana/baseRpcFactories.d.ts +11 -0
  8. package/dist/cjs/providers/solana/baseRpcFactories.js +30 -0
  9. package/dist/cjs/providers/solana/baseRpcFactories.js.map +1 -0
  10. package/dist/cjs/providers/solana/defaultRpcFactory.d.ts +6 -0
  11. package/dist/cjs/providers/solana/defaultRpcFactory.js +22 -0
  12. package/dist/cjs/providers/solana/defaultRpcFactory.js.map +1 -0
  13. package/dist/cjs/providers/solana/index.d.ts +4 -0
  14. package/dist/cjs/providers/solana/index.js +8 -0
  15. package/dist/cjs/providers/solana/index.js.map +1 -0
  16. package/dist/cjs/providers/solana/rateLimitedRpcFactory.d.ts +16 -0
  17. package/dist/cjs/providers/solana/rateLimitedRpcFactory.js +105 -0
  18. package/dist/cjs/providers/solana/rateLimitedRpcFactory.js.map +1 -0
  19. package/dist/cjs/providers/solana/utils.d.ts +6 -0
  20. package/dist/cjs/providers/solana/utils.js +3 -0
  21. package/dist/cjs/providers/solana/utils.js.map +1 -0
  22. package/dist/esm/providers/index.d.ts +1 -0
  23. package/dist/esm/providers/index.js +1 -0
  24. package/dist/esm/providers/index.js.map +1 -1
  25. package/dist/esm/providers/retryProvider.d.ts +17 -1
  26. package/dist/esm/providers/retryProvider.js +42 -17
  27. package/dist/esm/providers/retryProvider.js.map +1 -1
  28. package/dist/esm/providers/solana/baseRpcFactories.d.ts +11 -0
  29. package/dist/esm/providers/solana/baseRpcFactories.js +31 -0
  30. package/dist/esm/providers/solana/baseRpcFactories.js.map +1 -0
  31. package/dist/esm/providers/solana/defaultRpcFactory.d.ts +6 -0
  32. package/dist/esm/providers/solana/defaultRpcFactory.js +20 -0
  33. package/dist/esm/providers/solana/defaultRpcFactory.js.map +1 -0
  34. package/dist/esm/providers/solana/index.d.ts +4 -0
  35. package/dist/esm/providers/solana/index.js +5 -0
  36. package/dist/esm/providers/solana/index.js.map +1 -0
  37. package/dist/esm/providers/solana/rateLimitedRpcFactory.d.ts +16 -0
  38. package/dist/esm/providers/solana/rateLimitedRpcFactory.js +116 -0
  39. package/dist/esm/providers/solana/rateLimitedRpcFactory.js.map +1 -0
  40. package/dist/esm/providers/solana/utils.d.ts +9 -0
  41. package/dist/esm/providers/solana/utils.js +2 -0
  42. package/dist/esm/providers/solana/utils.js.map +1 -0
  43. package/dist/types/providers/index.d.ts +1 -0
  44. package/dist/types/providers/index.d.ts.map +1 -1
  45. package/dist/types/providers/retryProvider.d.ts +17 -1
  46. package/dist/types/providers/retryProvider.d.ts.map +1 -1
  47. package/dist/types/providers/solana/baseRpcFactories.d.ts +12 -0
  48. package/dist/types/providers/solana/baseRpcFactories.d.ts.map +1 -0
  49. package/dist/types/providers/solana/defaultRpcFactory.d.ts +7 -0
  50. package/dist/types/providers/solana/defaultRpcFactory.d.ts.map +1 -0
  51. package/dist/types/providers/solana/index.d.ts +5 -0
  52. package/dist/types/providers/solana/index.d.ts.map +1 -0
  53. package/dist/types/providers/solana/rateLimitedRpcFactory.d.ts +17 -0
  54. package/dist/types/providers/solana/rateLimitedRpcFactory.d.ts.map +1 -0
  55. package/dist/types/providers/solana/utils.d.ts +10 -0
  56. package/dist/types/providers/solana/utils.d.ts.map +1 -0
  57. package/package.json +3 -1
  58. package/src/providers/index.ts +1 -0
  59. package/src/providers/retryProvider.ts +44 -17
  60. package/src/providers/solana/baseRpcFactories.ts +25 -0
  61. package/src/providers/solana/defaultRpcFactory.ts +13 -0
  62. package/src/providers/solana/index.ts +4 -0
  63. package/src/providers/solana/rateLimitedRpcFactory.ts +101 -0
  64. 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,4 @@
1
+ export * from "./baseRpcFactories";
2
+ export * from "./defaultRpcFactory";
3
+ export * from "./rateLimitedRpcFactory";
4
+ export * from "./utils";
@@ -0,0 +1,5 @@
1
+ export * from "./baseRpcFactories";
2
+ export * from "./defaultRpcFactory";
3
+ export * from "./rateLimitedRpcFactory";
4
+ export * from "./utils";
5
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/providers/solana/utils.ts"],"names":[],"mappings":""}
@@ -6,4 +6,5 @@ export * from "./constants";
6
6
  export * from "./types";
7
7
  export * from "./utils";
8
8
  export * as mocks from "./mockProvider";
9
+ export * from "./solana";
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -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
- protected callReverted(method: string, error: unknown): boolean;
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;IAmBnB,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO;IA8BzD,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"}
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,5 @@
1
+ export * from "./baseRpcFactories";
2
+ export * from "./defaultRpcFactory";
3
+ export * from "./rateLimitedRpcFactory";
4
+ export * from "./utils";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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.14",
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",
@@ -6,3 +6,4 @@ export * from "./constants";
6
6
  export * from "./types";
7
7
  export * from "./utils";
8
8
  export * as mocks from "./mockProvider";
9
+ export * from "./solana";
@@ -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.callReverted(method, err)) {
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
- // For an error emitted in response to an eth_call or eth_estimateGas request, determine
262
- // whether the response body indicates that the call reverted during execution.
263
- protected callReverted(method: string, error: unknown): boolean {
264
- if (!(method === "eth_call" || method === "eth_estimateGas") || !RpcError.is(error)) {
265
- return false;
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
- // The exact RPC responses returned can vary, but `error.body` has reliably included both
271
- // the code (typically 3 on revert) and the error message indicating "execution reverted".
272
- response = JSON.parse(error.body);
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 false;
279
+ return;
275
280
  }
281
+ }
276
282
 
277
- if (!JsonRpcError.is(response)) {
278
- return false;
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 (response.error.code >= -32768 && response.error.code <= -32100) {
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 response.error.message.toLowerCase().includes("revert");
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.callReverted(method, settled.reason)) {
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
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./baseRpcFactories";
2
+ export * from "./defaultRpcFactory";
3
+ export * from "./rateLimitedRpcFactory";
4
+ export * from "./utils";