@across-protocol/sdk 3.1.17 → 3.1.19

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 (96) hide show
  1. package/dist/cjs/index.d.ts +1 -0
  2. package/dist/cjs/index.js +2 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/providers/cachedProvider.d.ts +17 -0
  5. package/dist/cjs/providers/cachedProvider.js +149 -0
  6. package/dist/cjs/providers/cachedProvider.js.map +1 -0
  7. package/dist/cjs/providers/constants.d.ts +4 -0
  8. package/dist/cjs/providers/constants.js +8 -0
  9. package/dist/cjs/providers/constants.js.map +1 -0
  10. package/dist/cjs/providers/index.d.ts +5 -0
  11. package/dist/cjs/providers/index.js +9 -0
  12. package/dist/cjs/providers/index.js.map +1 -0
  13. package/dist/cjs/providers/rateLimitedProvider.d.ts +10 -0
  14. package/dist/cjs/providers/rateLimitedProvider.js +88 -0
  15. package/dist/cjs/providers/rateLimitedProvider.js.map +1 -0
  16. package/dist/cjs/providers/retryProvider.d.ts +16 -0
  17. package/dist/cjs/providers/retryProvider.js +224 -0
  18. package/dist/cjs/providers/retryProvider.js.map +1 -0
  19. package/dist/cjs/providers/utils.d.ts +21 -0
  20. package/dist/cjs/providers/utils.js +63 -0
  21. package/dist/cjs/providers/utils.js.map +1 -0
  22. package/dist/cjs/relayFeeCalculator/chain-queries/factory.d.ts +1 -1
  23. package/dist/cjs/relayFeeCalculator/chain-queries/factory.js +3 -0
  24. package/dist/cjs/relayFeeCalculator/chain-queries/factory.js.map +1 -1
  25. package/dist/cjs/relayFeeCalculator/chain-queries/polygon.d.ts +1 -1
  26. package/dist/cjs/relayFeeCalculator/chain-queries/polygon.js +3 -0
  27. package/dist/cjs/relayFeeCalculator/chain-queries/polygon.js.map +1 -1
  28. package/dist/cjs/utils/NetworkUtils.d.ts +1 -0
  29. package/dist/cjs/utils/NetworkUtils.js +10 -1
  30. package/dist/cjs/utils/NetworkUtils.js.map +1 -1
  31. package/dist/cjs/utils/ObjectUtils.js.map +1 -1
  32. package/dist/esm/index.d.ts +1 -0
  33. package/dist/esm/index.js +2 -0
  34. package/dist/esm/index.js.map +1 -1
  35. package/dist/esm/providers/cachedProvider.d.ts +17 -0
  36. package/dist/esm/providers/cachedProvider.js +167 -0
  37. package/dist/esm/providers/cachedProvider.js.map +1 -0
  38. package/dist/esm/providers/constants.d.ts +7 -0
  39. package/dist/esm/providers/constants.js +10 -0
  40. package/dist/esm/providers/constants.js.map +1 -0
  41. package/dist/esm/providers/index.d.ts +5 -0
  42. package/dist/esm/providers/index.js +6 -0
  43. package/dist/esm/providers/index.js.map +1 -0
  44. package/dist/esm/providers/rateLimitedProvider.d.ts +10 -0
  45. package/dist/esm/providers/rateLimitedProvider.js +101 -0
  46. package/dist/esm/providers/rateLimitedProvider.js.map +1 -0
  47. package/dist/esm/providers/retryProvider.d.ts +16 -0
  48. package/dist/esm/providers/retryProvider.js +249 -0
  49. package/dist/esm/providers/retryProvider.js.map +1 -0
  50. package/dist/esm/providers/utils.d.ts +39 -0
  51. package/dist/esm/providers/utils.js +89 -0
  52. package/dist/esm/providers/utils.js.map +1 -0
  53. package/dist/esm/relayFeeCalculator/chain-queries/factory.d.ts +1 -1
  54. package/dist/esm/relayFeeCalculator/chain-queries/factory.js +3 -1
  55. package/dist/esm/relayFeeCalculator/chain-queries/factory.js.map +1 -1
  56. package/dist/esm/relayFeeCalculator/chain-queries/polygon.d.ts +1 -1
  57. package/dist/esm/relayFeeCalculator/chain-queries/polygon.js +3 -0
  58. package/dist/esm/relayFeeCalculator/chain-queries/polygon.js.map +1 -1
  59. package/dist/esm/utils/NetworkUtils.d.ts +6 -0
  60. package/dist/esm/utils/NetworkUtils.js +13 -0
  61. package/dist/esm/utils/NetworkUtils.js.map +1 -1
  62. package/dist/esm/utils/ObjectUtils.js +1 -1
  63. package/dist/esm/utils/ObjectUtils.js.map +1 -1
  64. package/dist/types/index.d.ts +1 -0
  65. package/dist/types/index.d.ts.map +1 -1
  66. package/dist/types/providers/cachedProvider.d.ts +18 -0
  67. package/dist/types/providers/cachedProvider.d.ts.map +1 -0
  68. package/dist/types/providers/constants.d.ts +8 -0
  69. package/dist/types/providers/constants.d.ts.map +1 -0
  70. package/dist/types/providers/index.d.ts +6 -0
  71. package/dist/types/providers/index.d.ts.map +1 -0
  72. package/dist/types/providers/rateLimitedProvider.d.ts +11 -0
  73. package/dist/types/providers/rateLimitedProvider.d.ts.map +1 -0
  74. package/dist/types/providers/retryProvider.d.ts +17 -0
  75. package/dist/types/providers/retryProvider.d.ts.map +1 -0
  76. package/dist/types/providers/utils.d.ts +40 -0
  77. package/dist/types/providers/utils.d.ts.map +1 -0
  78. package/dist/types/relayFeeCalculator/chain-queries/factory.d.ts +1 -1
  79. package/dist/types/relayFeeCalculator/chain-queries/factory.d.ts.map +1 -1
  80. package/dist/types/relayFeeCalculator/chain-queries/polygon.d.ts +1 -1
  81. package/dist/types/relayFeeCalculator/chain-queries/polygon.d.ts.map +1 -1
  82. package/dist/types/utils/NetworkUtils.d.ts +6 -0
  83. package/dist/types/utils/NetworkUtils.d.ts.map +1 -1
  84. package/dist/types/utils/ObjectUtils.d.ts.map +1 -1
  85. package/package.json +6 -2
  86. package/src/index.ts +1 -0
  87. package/src/providers/cachedProvider.ts +155 -0
  88. package/src/providers/constants.ts +11 -0
  89. package/src/providers/index.ts +5 -0
  90. package/src/providers/rateLimitedProvider.ts +94 -0
  91. package/src/providers/retryProvider.ts +262 -0
  92. package/src/providers/utils.ts +119 -0
  93. package/src/relayFeeCalculator/chain-queries/factory.ts +4 -1
  94. package/src/relayFeeCalculator/chain-queries/polygon.ts +3 -0
  95. package/src/utils/NetworkUtils.ts +13 -0
  96. package/src/utils/ObjectUtils.ts +1 -0
@@ -0,0 +1,11 @@
1
+ import { ethers } from "ethers";
2
+ import { Logger } from "winston";
3
+ export declare class RateLimitedProvider extends ethers.providers.StaticJsonRpcProvider {
4
+ readonly pctRpcCallsLogged: number;
5
+ readonly logger: Logger;
6
+ private queue;
7
+ constructor(maxConcurrency: number, pctRpcCallsLogged: number, logger?: Logger, ...cacheConstructorParams: ConstructorParameters<typeof ethers.providers.StaticJsonRpcProvider>);
8
+ wrapSendWithLog(method: string, params: Array<unknown>): Promise<any>;
9
+ send(method: string, params: Array<unknown>): Promise<unknown>;
10
+ }
11
+ //# sourceMappingURL=rateLimitedProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimitedProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/rateLimitedProvider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKjC,qBAAa,mBAAoB,SAAQ,MAAM,CAAC,SAAS,CAAC,qBAAqB;IAQ3E,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM;IAPzB,OAAO,CAAC,KAAK,CAA6B;gBAKxC,cAAc,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,EACzB,MAAM,GAAE,MAAkB,EACnC,GAAG,sBAAsB,EAAE,qBAAqB,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAiB3F,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;IAwCnD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAaxE"}
@@ -0,0 +1,17 @@
1
+ import { ethers } from "ethers";
2
+ import { CachingMechanismInterface } from "../interfaces";
3
+ import { AugmentedLogger } from "@uma/logger";
4
+ export declare class RetryProvider extends ethers.providers.StaticJsonRpcProvider {
5
+ readonly nodeQuorumThreshold: number;
6
+ readonly retries: number;
7
+ readonly delay: number;
8
+ readonly maxConcurrency: number;
9
+ readonly providers: ethers.providers.StaticJsonRpcProvider[];
10
+ constructor(params: ConstructorParameters<typeof ethers.providers.StaticJsonRpcProvider>[], chainId: number, nodeQuorumThreshold: number, retries: number, delay: number, maxConcurrency: number, providerCacheNamespace: string, pctRpcCallsLogged: number, redisClient?: CachingMechanismInterface, standardTtlBlockDistance?: number, noTtlBlockDistance?: number, providerCacheTtl?: number, logger?: AugmentedLogger);
11
+ send(method: string, params: Array<unknown>): Promise<unknown>;
12
+ _validateResponse(method: string, _: Array<unknown>, response: unknown): boolean;
13
+ _sendAndValidate(provider: ethers.providers.StaticJsonRpcProvider, method: string, params: Array<unknown>): Promise<unknown>;
14
+ _trySend(provider: ethers.providers.StaticJsonRpcProvider, method: string, params: Array<unknown>): Promise<unknown>;
15
+ _getQuorum(method: string, params: Array<unknown>): number;
16
+ }
17
+ //# sourceMappingURL=retryProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retryProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/retryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAK1D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,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;IAPjC,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,EACrC,MAAM,CAAC,EAAE,eAAe;IAqCX,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IA+I7E,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,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM;CAqB3D"}
@@ -0,0 +1,40 @@
1
+ import { providers } from "ethers";
2
+ export declare function compareResultsAndFilterIgnoredKeys(ignoredKeys: string[], _objA: Record<string, unknown>, _objB: Record<string, unknown>): boolean;
3
+ export declare function compareArrayResultsWithIgnoredKeys(ignoredKeys: string[], objA: unknown[], objB: unknown[]): boolean;
4
+ /**
5
+ * This is the type we pass to define a request "task".
6
+ */
7
+ export interface RateLimitTask {
8
+ sendArgs: [string, Array<unknown>];
9
+ resolve: (result: unknown) => void;
10
+ reject: (err: unknown) => void;
11
+ }
12
+ /**
13
+ * A helper function to format an error message for a provider.
14
+ * @param provider The provider that failed.
15
+ * @param rawErrorText The raw error text.
16
+ * @returns The formatted error message.
17
+ */
18
+ export declare function formatProviderError(provider: providers.StaticJsonRpcProvider, rawErrorText: string): string;
19
+ export declare function createSendErrorWithMessage(message: string, sendError: Record<string, unknown>): {
20
+ name: string;
21
+ message: string;
22
+ stack?: string | undefined;
23
+ cause?: unknown;
24
+ };
25
+ /**
26
+ * Compares two RPC results, filtering out fields that are known to differ between providers.
27
+ * Note: this function references `IGNORED_ERROR_CODES` which is a record of error codes that correspond to fields
28
+ * that should be ignored when comparing RPC results.
29
+ * @param method The method that was called - conditionally filters out fields based on the method.
30
+ * @param rpcResultA The first RPC result.
31
+ * @param rpcResultB The second RPC result.
32
+ * @returns True if the results are equal, false otherwise.
33
+ */
34
+ export declare function compareRpcResults(method: string, rpcResultA: unknown, rpcResultB: unknown): boolean;
35
+ export declare enum CacheType {
36
+ NONE = 0,
37
+ WITH_TTL = 1,
38
+ NO_TTL = 2
39
+ }
40
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/providers/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAqBnC,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAOT;AAED,wBAAgB,kCAAkC,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAOnH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAE5B,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAInC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,qBAAqB,EAAE,YAAY,EAAE,MAAM,UAElG;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;EAG7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CA8BnG;AAED,oBAAY,SAAS;IACnB,IAAI,IAAA;IACJ,QAAQ,IAAA;IACR,MAAM,IAAA;CACP"}
@@ -201,6 +201,6 @@ export declare class QueryBase__factory {
201
201
  };
202
202
  coingeckoId: string;
203
203
  };
204
- }, spokePoolAddress?: string, simulatedRelayerAddress?: string, coingeckoProApiKey?: string, logger?: Logger, gasMarkup?: number, coingeckoBaseCurrency?: string): QueryBase;
204
+ }, spokePoolAddress?: string | undefined, simulatedRelayerAddress?: string, coingeckoProApiKey?: string, logger?: Logger, gasMarkup?: number, coingeckoBaseCurrency?: string): QueryBase;
205
205
  }
206
206
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/factory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAkB,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAU/D,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,MAAM,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAoB,EACjC,gBAAgB,SAA2C,EAC3D,uBAAuB,SAAoC,EAC3D,kBAAkB,CAAC,EAAE,MAAM,EAC3B,MAAM,GAAE,MAAuB,EAC/B,SAAS,SAAI,EACb,qBAAqB,SAAQ,GAC5B,SAAS;CA4Bb"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAkB,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAU/D,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,MAAM,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAoB,EACjC,gBAAgB,qBAA2C,EAC3D,uBAAuB,SAAoC,EAC3D,kBAAkB,CAAC,EAAE,MAAM,EAC3B,MAAM,GAAE,MAAuB,EAC/B,SAAS,SAAI,EACb,qBAAqB,SAAQ,GAC5B,SAAS;CA8Bb"}
@@ -201,7 +201,7 @@ export declare class PolygonQueries extends QueryBase {
201
201
  };
202
202
  coingeckoId: string;
203
203
  };
204
- }, spokePoolAddress?: string, simulatedRelayerAddress?: string, coingeckoProApiKey?: string, logger?: Logger, gasMarkup?: number);
204
+ }, spokePoolAddress?: string | undefined, simulatedRelayerAddress?: string, coingeckoProApiKey?: string, logger?: Logger, gasMarkup?: number);
205
205
  getTokenPrice(tokenSymbol: string): Promise<number>;
206
206
  }
207
207
  //# sourceMappingURL=polygon.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"polygon.d.ts","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/polygon.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,qBAAa,cAAe,SAAQ,SAAS;gBAEzC,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAoB,EACjC,gBAAgB,SAAqD,EACrE,uBAAuB,SAAoC,EAC3D,kBAAkB,CAAC,EAAE,MAAM,EAC3B,MAAM,GAAE,MAAuB,EAC/B,SAAS,SAAI;IAeA,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAcnE"}
1
+ {"version":3,"file":"polygon.d.ts","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/polygon.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAInC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,qBAAa,cAAe,SAAQ,SAAS;gBAEzC,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAoB,EACjC,gBAAgB,qBAAqD,EACrE,uBAAuB,SAAoC,EAC3D,kBAAkB,CAAC,EAAE,MAAM,EAC3B,MAAM,GAAE,MAAuB,EAC/B,SAAS,SAAI;IAgBA,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAcnE"}
@@ -64,4 +64,10 @@ export declare function chainIsCCTPEnabled(chainId: number): boolean;
64
64
  * @returns True if chainId requires manual L1 -> L2 finalization, otherwise false.
65
65
  */
66
66
  export declare function chainRequiresL1ToL2Finalization(chainId: number): boolean;
67
+ /**
68
+ * Returns the origin of a URL.
69
+ * @param url A URL.
70
+ * @returns The origin of the URL, or "UNKNOWN" if the URL is invalid.
71
+ */
72
+ export declare function getOriginFromURL(url: string): string;
67
73
  //# sourceMappingURL=NetworkUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/NetworkUtils.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAGjE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAErE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAa3D;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExE"}
1
+ {"version":3,"file":"NetworkUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/NetworkUtils.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAGjE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAErE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAa3D;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/ObjectUtils.ts"],"names":[],"mappings":"AAKA,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAyBjE;AAGD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,GAAG,EAAE,EACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,GAAG,CASL;AACD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,GAAG,EAAE,EACd,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GACrC,GAAG,CAOL;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,GAAG,CAM1F;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAEvG"}
1
+ {"version":3,"file":"ObjectUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/ObjectUtils.ts"],"names":[],"mappings":"AAMA,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAyBjE;AAGD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,GAAG,EAAE,EACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,GAAG,CASL;AACD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,GAAG,EAAE,EACd,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GACrC,GAAG,CAOL;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,GAAG,CAM1F;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAEvG"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@across-protocol/sdk",
3
3
  "author": "UMA Team",
4
- "version": "3.1.17",
4
+ "version": "3.1.19",
5
5
  "license": "AGPL-3.0",
6
6
  "homepage": "https://docs.across.to/reference/sdk",
7
7
  "files": [
@@ -58,6 +58,7 @@
58
58
  "@size-limit/preset-small-lib": "^7.0.8",
59
59
  "@typechain/ethers-v5": "^11.1.1",
60
60
  "@typechain/hardhat": "^6.1.6",
61
+ "@types/async": "^3.2.24",
61
62
  "@types/chai": "^4.3.6",
62
63
  "@types/dotenv": "^8.2.0",
63
64
  "@types/lodash": "^4.14.199",
@@ -100,16 +101,19 @@
100
101
  "dependencies": {
101
102
  "@across-protocol/across-token": "^1.0.0",
102
103
  "@across-protocol/constants": "^3.1.13",
103
- "@across-protocol/contracts": "^3.0.8",
104
+ "@across-protocol/contracts": "^3.0.9",
104
105
  "@eth-optimism/sdk": "^3.3.1",
105
106
  "@pinata/sdk": "^2.1.0",
106
107
  "@types/mocha": "^10.0.1",
108
+ "@uma/logger": "^1.3.0",
107
109
  "@uma/sdk": "^0.34.1",
108
110
  "arweave": "^1.14.4",
111
+ "async": "^3.2.5",
109
112
  "axios": "^0.27.2",
110
113
  "big-number": "^2.0.0",
111
114
  "decimal.js": "^10.3.1",
112
115
  "ethers": "^5.7.2",
116
+ "lodash": "^4.17.21",
113
117
  "lodash.get": "^4.4.2",
114
118
  "superstruct": "^0.15.4",
115
119
  "tslib": "^2.6.2"
package/src/index.ts CHANGED
@@ -13,3 +13,4 @@ export * as typeguards from "./typeguards";
13
13
  export * as clients from "./clients";
14
14
  export * as typechain from "./typechain";
15
15
  export * as caching from "./caching";
16
+ export * as providers from "./providers";
@@ -0,0 +1,155 @@
1
+ import { random } from "lodash";
2
+ import { CachingMechanismInterface } from "../interfaces";
3
+ import { BLOCK_NUMBER_TTL, PROVIDER_CACHE_TTL, PROVIDER_CACHE_TTL_MODIFIER as ttl_modifier } from "./constants";
4
+ import { RateLimitedProvider } from "./rateLimitedProvider";
5
+ import { CacheType } from "./utils";
6
+
7
+ export class CacheProvider extends RateLimitedProvider {
8
+ public readonly getBlockByNumberPrefix: string;
9
+ public readonly getLogsCachePrefix: string;
10
+ public readonly callCachePrefix: string;
11
+ public readonly baseTTL: number;
12
+
13
+ constructor(
14
+ providerCacheNamespace: string,
15
+ readonly redisClient?: CachingMechanismInterface,
16
+ // Note: if not provided, this is set to POSITIVE_INFINITY, meaning no cache entries are set with the standard TTL.
17
+ readonly standardTtlBlockDistance = Number.POSITIVE_INFINITY,
18
+ // Note: if not provided, this is set to POSITIVE_INFINITY, meaning no cache entries are set with no TTL.
19
+ readonly noTtlBlockDistance = Number.POSITIVE_INFINITY,
20
+ readonly providerCacheTtl = PROVIDER_CACHE_TTL,
21
+ ...jsonRpcConstructorParams: ConstructorParameters<typeof RateLimitedProvider>
22
+ ) {
23
+ super(...jsonRpcConstructorParams);
24
+
25
+ const { chainId } = this.network;
26
+
27
+ // Pre-compute as much of the redis key as possible.
28
+ const cachePrefix = `${providerCacheNamespace},${new URL(this.connection.url).hostname},${chainId}`;
29
+ this.getBlockByNumberPrefix = `${cachePrefix}:getBlockByNumber,`;
30
+ this.getLogsCachePrefix = `${cachePrefix}:eth_getLogs,`;
31
+ this.callCachePrefix = `${cachePrefix}:eth_call,`;
32
+
33
+ const _ttlVar = providerCacheTtl;
34
+ const _ttl = Number(_ttlVar);
35
+ if (isNaN(_ttl) || _ttl <= 0) {
36
+ throw new Error(`PROVIDER_CACHE_TTL (${_ttlVar}) must be numeric and > 0`);
37
+ }
38
+ this.baseTTL = _ttl;
39
+ }
40
+ override async send(method: string, params: Array<unknown>): Promise<unknown> {
41
+ const cacheType = this.redisClient ? await this.cacheType(method, params) : CacheType.NONE;
42
+
43
+ if (cacheType !== CacheType.NONE) {
44
+ const redisKey = this.buildRedisKey(method, params);
45
+
46
+ // Attempt to pull the result from the cache.
47
+ const redisResult = await this.redisClient?.get<string>(redisKey);
48
+
49
+ // If cache has the result, parse the json and return it.
50
+ if (redisResult) {
51
+ return JSON.parse(redisResult);
52
+ }
53
+
54
+ // Cache does not have the result. Query it directly and cache.
55
+ const result = await super.send(method, params);
56
+
57
+ // Note: use swtich to ensure all enum cases are handled.
58
+ switch (cacheType) {
59
+ case CacheType.WITH_TTL:
60
+ {
61
+ // Apply a random margin to spread expiry over a larger time window.
62
+ const ttl = this.baseTTL + Math.ceil(random(-ttl_modifier, ttl_modifier, true) * this.baseTTL);
63
+ await this.redisClient?.set(redisKey, JSON.stringify(result), ttl);
64
+ }
65
+ break;
66
+ case CacheType.NO_TTL:
67
+ await this.redisClient?.set(redisKey, JSON.stringify(result), Number.POSITIVE_INFINITY);
68
+ break;
69
+ default:
70
+ throw new Error(`Unexpected Cache type: ${cacheType}`);
71
+ }
72
+
73
+ // Return the cached result.
74
+ return result;
75
+ }
76
+
77
+ return await super.send(method, params);
78
+ }
79
+
80
+ private buildRedisKey(method: string, params: Array<unknown>) {
81
+ // Only handles eth_getLogs and eth_call right now.
82
+ switch (method) {
83
+ case "eth_getBlockByNumber":
84
+ return this.getBlockByNumberPrefix + JSON.stringify(params);
85
+ case "eth_getLogs":
86
+ return this.getLogsCachePrefix + JSON.stringify(params);
87
+ case "eth_call":
88
+ return this.callCachePrefix + JSON.stringify(params);
89
+ default:
90
+ throw new Error(`CacheProvider::buildRedisKey: invalid JSON-RPC method ${method}`);
91
+ }
92
+ }
93
+
94
+ private cacheType(method: string, params: Array<unknown>): Promise<CacheType> {
95
+ // Today, we only cache eth_getLogs and eth_call.
96
+ if (method === "eth_getLogs") {
97
+ const [{ fromBlock, toBlock }] = params as { toBlock: number; fromBlock: number }[];
98
+
99
+ // Handle odd cases where the ordering is flipped, etc.
100
+ // toBlock/fromBlock is in hex, so it must be parsed before being compared to the first unsafe block.
101
+ const fromBlockNumber = parseInt(String(fromBlock), 16);
102
+ const toBlockNumber = parseInt(String(toBlock), 16);
103
+
104
+ // Handle cases where the input block numbers are not hex values ("latest", "pending", etc).
105
+ // This would result in the result of the above being NaN.
106
+ if (Number.isNaN(fromBlockNumber) || Number.isNaN(toBlockNumber)) {
107
+ return Promise.resolve(CacheType.NONE);
108
+ }
109
+
110
+ if (toBlockNumber < fromBlockNumber) {
111
+ throw new Error("CacheProvider::shouldCache toBlock cannot be smaller than fromBlock.");
112
+ }
113
+
114
+ return this.cacheTypeForBlock(toBlock);
115
+ } else if ("eth_call" === method || "eth_getBlockByNumber" === method) {
116
+ // Pull out the block tag from params. Its position in params is dependent on the method.
117
+ // We are only interested in numeric block tags, which would be hex-encoded strings.
118
+ const idx = method === "eth_getBlockByNumber" ? 0 : 1;
119
+ const blockNumber = parseInt(String(params[idx]), 16);
120
+
121
+ // If the block number isn't present or is a text string, this will be NaN and we return false.
122
+ if (Number.isNaN(blockNumber)) {
123
+ return Promise.resolve(CacheType.NONE);
124
+ }
125
+
126
+ // If the block is old enough to cache, cache the call.
127
+ return this.cacheTypeForBlock(blockNumber);
128
+ } else {
129
+ return Promise.resolve(CacheType.NONE);
130
+ }
131
+ }
132
+
133
+ private async cacheTypeForBlock(blockNumber: number): Promise<CacheType> {
134
+ // Note: this method is an internal method provided by the BaseProvider. It allows the caller to specify a maxAge of
135
+ // the block that is allowed. This means if a block has been retrieved within the last n seconds, no provider
136
+ // query will be made.
137
+ const currentBlockNumber = await super._getInternalBlockNumber(BLOCK_NUMBER_TTL * 1000);
138
+
139
+ // Determine the distance that the block is from HEAD.
140
+ const headDistance = currentBlockNumber - blockNumber;
141
+
142
+ // If the distance from head is large enough, set with no TTL.
143
+ if (headDistance > this.noTtlBlockDistance) {
144
+ return CacheType.NO_TTL;
145
+ }
146
+
147
+ // If the distance is <= noTtlBlockDistance, but > standardTtlBlockDistance, use standard TTL.
148
+ if (headDistance > this.standardTtlBlockDistance) {
149
+ return CacheType.WITH_TTL;
150
+ }
151
+
152
+ // Too close to HEAD, no cache.
153
+ return CacheType.NONE;
154
+ }
155
+ }
@@ -0,0 +1,11 @@
1
+ // This is how many seconds stale the block number can be for us to use it for evaluating the reorg distance in the cache provider.
2
+ export const BLOCK_NUMBER_TTL = 60;
3
+
4
+ // This is the TTL for the provider cache.
5
+ export const PROVIDER_CACHE_TTL = 3600;
6
+ export const PROVIDER_CACHE_TTL_MODIFIER = 0.15;
7
+
8
+ /**
9
+ * A default timeout for requests of 60 seconds.
10
+ */
11
+ export const defaultTimeout = 60 * 1000;
@@ -0,0 +1,5 @@
1
+ export * from "./rateLimitedProvider";
2
+ export * from "./cachedProvider";
3
+ export * from "./retryProvider";
4
+ export * from "./constants";
5
+ export * from "./utils";
@@ -0,0 +1,94 @@
1
+ // StaticJsonRpcProvider is used in place of JsonRpcProvider to avoid redundant eth_chainId queries prior to each
2
+ // request. This is safe to use when the back-end provider is guaranteed not to change.
3
+ // See https://docs.ethers.io/v5/api/providers/jsonrpc-provider/#StaticJsonRpcProvider
4
+
5
+ import { QueueObject, queue } from "async";
6
+ import { ethers } from "ethers";
7
+ import { RateLimitTask } from "./utils";
8
+ import { getOriginFromURL } from "../utils/NetworkUtils";
9
+ import { Logger } from "winston";
10
+ import { Logger as umaLogger } from "@uma/logger";
11
+
12
+ // This provider is a very small addition to the StaticJsonRpcProvider that ensures that no more than `maxConcurrency`
13
+ // requests are ever in flight. It uses the async/queue library to manage this.
14
+ export class RateLimitedProvider extends ethers.providers.StaticJsonRpcProvider {
15
+ // The queue object that manages the tasks.
16
+ private queue: QueueObject<RateLimitTask>;
17
+
18
+ // Takes the same arguments as the JsonRpcProvider, but it has an additional maxConcurrency value at the beginning
19
+ // of the list.
20
+ constructor(
21
+ maxConcurrency: number,
22
+ readonly pctRpcCallsLogged: number,
23
+ readonly logger: Logger = umaLogger,
24
+ ...cacheConstructorParams: ConstructorParameters<typeof ethers.providers.StaticJsonRpcProvider>
25
+ ) {
26
+ super(...cacheConstructorParams);
27
+
28
+ // This sets up the queue. Each task is executed by calling the superclass's send method, which fires off the
29
+ // request. This queue sends out requests concurrently, but stops once the concurrency limit is reached. The
30
+ // maxConcurrency is configured here.
31
+ this.queue = queue(async ({ sendArgs, resolve, reject }: RateLimitTask, callback: () => void) => {
32
+ await this.wrapSendWithLog(...sendArgs)
33
+ .then(resolve)
34
+ .catch(reject);
35
+ // we need this for the queue to know that the task is done
36
+ // @see: https://caolan.github.io/async/v3/global.html
37
+ callback();
38
+ }, maxConcurrency);
39
+ }
40
+
41
+ async wrapSendWithLog(method: string, params: Array<unknown>) {
42
+ if (this.pctRpcCallsLogged <= 0 || Math.random() > this.pctRpcCallsLogged / 100) {
43
+ // Non sample path: no logging or timing, just issue the request.
44
+ return super.send(method, params);
45
+ } else {
46
+ const loggerArgs = {
47
+ at: "ProviderUtils",
48
+ message: "Provider response sample",
49
+ provider: getOriginFromURL(this.connection.url),
50
+ method,
51
+ params,
52
+ chainId: this.network.chainId,
53
+ };
54
+
55
+ // In this path we log an rpc response sample.
56
+ // Note: use performance.now() to ensure a purely monotonic clock.
57
+ const startTime = performance.now();
58
+ try {
59
+ const result = await super.send(method, params);
60
+ const elapsedTimeS = (performance.now() - startTime) / 1000;
61
+ this.logger.debug({
62
+ ...loggerArgs,
63
+ success: true,
64
+ timeElapsed: elapsedTimeS,
65
+ });
66
+ return result;
67
+ } catch (error) {
68
+ // Log errors as well.
69
+ // For now, to keep logs light, don't log the error itself, just propogate and let it be handled higher up.
70
+ const elapsedTimeS = (performance.now() - startTime) / 1000;
71
+ this.logger.debug({
72
+ ...loggerArgs,
73
+ success: false,
74
+ timeElapsed: elapsedTimeS,
75
+ });
76
+ throw error;
77
+ }
78
+ }
79
+ }
80
+
81
+ override send(method: string, params: Array<unknown>): Promise<unknown> {
82
+ // This simply creates a promise and adds the arguments and resolve and reject handlers to the task.
83
+ return new Promise<unknown>((resolve, reject) => {
84
+ const task: RateLimitTask = {
85
+ sendArgs: [method, params],
86
+ resolve,
87
+ reject,
88
+ };
89
+ // We didn't previously wait for this push so we can emulate
90
+ // the same behavior with the `void` keyword.
91
+ void this.queue.push(task);
92
+ });
93
+ }
94
+ }