@hyperlane-xyz/sdk 44.0.2 → 45.0.1

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 (189) hide show
  1. package/dist/consts/multisigIsm.d.ts.map +1 -1
  2. package/dist/consts/multisigIsm.js +104 -772
  3. package/dist/consts/multisigIsm.js.map +1 -1
  4. package/dist/consts/testChains.d.ts.map +1 -1
  5. package/dist/consts/testChains.js +11 -6
  6. package/dist/consts/testChains.js.map +1 -1
  7. package/dist/core/adapters/SealevelCoreAdapter.d.ts +6 -0
  8. package/dist/core/adapters/SealevelCoreAdapter.d.ts.map +1 -1
  9. package/dist/core/adapters/SealevelCoreAdapter.js +20 -0
  10. package/dist/core/adapters/SealevelCoreAdapter.js.map +1 -1
  11. package/dist/core/adapters/SealevelCoreAdapter.test.js +17 -0
  12. package/dist/core/adapters/SealevelCoreAdapter.test.js.map +1 -1
  13. package/dist/core/types.d.ts.map +1 -1
  14. package/dist/core/types.js +14 -1
  15. package/dist/core/types.js.map +1 -1
  16. package/dist/core/types.test.js +98 -1
  17. package/dist/core/types.test.js.map +1 -1
  18. package/dist/deploy/proxy.d.ts +1 -0
  19. package/dist/deploy/proxy.d.ts.map +1 -1
  20. package/dist/deploy/proxy.js +6 -0
  21. package/dist/deploy/proxy.js.map +1 -1
  22. package/dist/deploy/warp.d.ts.map +1 -1
  23. package/dist/deploy/warp.js +32 -43
  24. package/dist/deploy/warp.js.map +1 -1
  25. package/dist/deploy/warp.test.js +62 -1
  26. package/dist/deploy/warp.test.js.map +1 -1
  27. package/dist/gas/adapters/SealevelIgpAdapter.d.ts +3 -2
  28. package/dist/gas/adapters/SealevelIgpAdapter.d.ts.map +1 -1
  29. package/dist/gas/adapters/SealevelIgpAdapter.js +3 -2
  30. package/dist/gas/adapters/SealevelIgpAdapter.js.map +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/ism/EvmIsmModule.d.ts.map +1 -1
  36. package/dist/ism/EvmIsmModule.js +5 -1
  37. package/dist/ism/EvmIsmModule.js.map +1 -1
  38. package/dist/ism/EvmIsmModule.test.js +109 -0
  39. package/dist/ism/EvmIsmModule.test.js.map +1 -1
  40. package/dist/ism/HyperlaneIsmFactory.d.ts +26 -6
  41. package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
  42. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +60 -0
  43. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
  44. package/dist/ism/HyperlaneIsmFactory.js +165 -34
  45. package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
  46. package/dist/ism/HyperlaneIsmFactory.test.js +33 -6
  47. package/dist/ism/HyperlaneIsmFactory.test.js.map +1 -1
  48. package/dist/ism/types.d.ts +18 -2
  49. package/dist/ism/types.d.ts.map +1 -1
  50. package/dist/ism/types.js +43 -3
  51. package/dist/ism/types.js.map +1 -1
  52. package/dist/ism/types.test.js +232 -56
  53. package/dist/ism/types.test.js.map +1 -1
  54. package/dist/ism/utils.d.ts.map +1 -1
  55. package/dist/ism/utils.js +13 -0
  56. package/dist/ism/utils.js.map +1 -1
  57. package/dist/ism/utils.test.js +43 -1
  58. package/dist/ism/utils.test.js.map +1 -1
  59. package/dist/metadata/ChainMetadataManager.d.ts +1 -0
  60. package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
  61. package/dist/metadata/ChainMetadataManager.js +1 -0
  62. package/dist/metadata/ChainMetadataManager.js.map +1 -1
  63. package/dist/metadata/ChainMetadataManager.test.js +14 -1
  64. package/dist/metadata/ChainMetadataManager.test.js.map +1 -1
  65. package/dist/metadata/ChainMetadataResolver.d.ts +1 -0
  66. package/dist/metadata/ChainMetadataResolver.d.ts.map +1 -1
  67. package/dist/metadata/ChainMetadataResolver.js +1 -0
  68. package/dist/metadata/ChainMetadataResolver.js.map +1 -1
  69. package/dist/metadata/ChainMetadataResolver.test.js +4 -0
  70. package/dist/metadata/ChainMetadataResolver.test.js.map +1 -1
  71. package/dist/metadata/agentConfig.d.ts +209 -93
  72. package/dist/metadata/agentConfig.d.ts.map +1 -1
  73. package/dist/metadata/agentConfig.js +106 -13
  74. package/dist/metadata/agentConfig.js.map +1 -1
  75. package/dist/metadata/agentConfig.test.js +277 -25
  76. package/dist/metadata/agentConfig.test.js.map +1 -1
  77. package/dist/metadata/chainMetadata.test.js +25 -0
  78. package/dist/metadata/chainMetadata.test.js.map +1 -1
  79. package/dist/metadata/chainMetadataTypes.d.ts +36 -0
  80. package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
  81. package/dist/metadata/chainMetadataTypes.js +26 -0
  82. package/dist/metadata/chainMetadataTypes.js.map +1 -1
  83. package/dist/providers/SeismicSigner.d.ts +4 -12
  84. package/dist/providers/SeismicSigner.d.ts.map +1 -1
  85. package/dist/providers/SeismicSigner.js +84 -35
  86. package/dist/providers/SeismicSigner.js.map +1 -1
  87. package/dist/providers/SeismicSigner.test.d.ts +2 -0
  88. package/dist/providers/SeismicSigner.test.d.ts.map +1 -0
  89. package/dist/providers/SeismicSigner.test.js +160 -0
  90. package/dist/providers/SeismicSigner.test.js.map +1 -0
  91. package/dist/providers/SmartProvider/SmartProvider.d.ts +1 -5
  92. package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
  93. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts +2 -0
  94. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts.map +1 -0
  95. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js +164 -0
  96. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js.map +1 -0
  97. package/dist/providers/SmartProvider/SmartProvider.js +35 -72
  98. package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
  99. package/dist/providers/SmartProvider/SmartProvider.test.js +181 -2
  100. package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
  101. package/dist/providers/SmartProvider/jsonRpcError.d.ts +7 -0
  102. package/dist/providers/SmartProvider/jsonRpcError.d.ts.map +1 -0
  103. package/dist/providers/SmartProvider/jsonRpcError.js +67 -0
  104. package/dist/providers/SmartProvider/jsonRpcError.js.map +1 -0
  105. package/dist/providers/SmartProvider/types.d.ts +1 -0
  106. package/dist/providers/SmartProvider/types.d.ts.map +1 -1
  107. package/dist/providers/builders/ethersV5.d.ts +0 -1
  108. package/dist/providers/builders/ethersV5.d.ts.map +1 -1
  109. package/dist/providers/builders/ethersV5.js +19 -5
  110. package/dist/providers/builders/ethersV5.js.map +1 -1
  111. package/dist/providers/builders/ethersV5.test.d.ts +2 -0
  112. package/dist/providers/builders/ethersV5.test.d.ts.map +1 -0
  113. package/dist/providers/builders/ethersV5.test.js +77 -0
  114. package/dist/providers/builders/ethersV5.test.js.map +1 -0
  115. package/dist/providers/builders/radix.browser.d.ts +1 -0
  116. package/dist/providers/builders/radix.browser.d.ts.map +1 -1
  117. package/dist/providers/builders/radix.browser.js +1 -0
  118. package/dist/providers/builders/radix.browser.js.map +1 -1
  119. package/dist/providers/builders/radix.d.ts.map +1 -1
  120. package/dist/providers/builders/radix.gateway.test.d.ts +2 -0
  121. package/dist/providers/builders/radix.gateway.test.d.ts.map +1 -0
  122. package/dist/providers/builders/radix.gateway.test.js +39 -0
  123. package/dist/providers/builders/radix.gateway.test.js.map +1 -0
  124. package/dist/providers/builders/radix.js +1 -0
  125. package/dist/providers/builders/radix.js.map +1 -1
  126. package/dist/providers/builders/radix.test.js +1 -0
  127. package/dist/providers/builders/radix.test.js.map +1 -1
  128. package/dist/providers/providerBuilders.d.ts +1 -1
  129. package/dist/providers/providerBuilders.d.ts.map +1 -1
  130. package/dist/providers/providerBuilders.js +1 -1
  131. package/dist/providers/providerBuilders.js.map +1 -1
  132. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +60 -8
  133. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -1
  134. package/dist/test/errors.d.ts +25 -0
  135. package/dist/test/errors.d.ts.map +1 -1
  136. package/dist/test/errors.js +31 -0
  137. package/dist/test/errors.js.map +1 -1
  138. package/dist/test/fixtures/warp-route-replay/record.d.ts +2 -0
  139. package/dist/test/fixtures/warp-route-replay/record.d.ts.map +1 -0
  140. package/dist/test/fixtures/warp-route-replay/record.js +32 -0
  141. package/dist/test/fixtures/warp-route-replay/record.js.map +1 -0
  142. package/dist/test/replayRpc.d.ts +82 -0
  143. package/dist/test/replayRpc.d.ts.map +1 -0
  144. package/dist/test/replayRpc.js +331 -0
  145. package/dist/test/replayRpc.js.map +1 -0
  146. package/dist/test/replayScenarios.d.ts +19 -0
  147. package/dist/test/replayScenarios.d.ts.map +1 -0
  148. package/dist/test/replayScenarios.js +89 -0
  149. package/dist/test/replayScenarios.js.map +1 -0
  150. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js +92 -7
  151. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js.map +1 -1
  152. package/dist/timelock/evm/errors.js +1 -1
  153. package/dist/timelock/evm/errors.js.map +1 -1
  154. package/dist/token/EvmWarpRouteReader.d.ts +27 -0
  155. package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
  156. package/dist/token/EvmWarpRouteReader.hardhat-test.js +28 -3
  157. package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -1
  158. package/dist/token/EvmWarpRouteReader.js +172 -42
  159. package/dist/token/EvmWarpRouteReader.js.map +1 -1
  160. package/dist/token/EvmWarpRouteReader.replay.test.d.ts +2 -0
  161. package/dist/token/EvmWarpRouteReader.replay.test.d.ts.map +1 -0
  162. package/dist/token/EvmWarpRouteReader.replay.test.js +392 -0
  163. package/dist/token/EvmWarpRouteReader.replay.test.js.map +1 -0
  164. package/dist/token/EvmWarpRouteReader.test.js +529 -4
  165. package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
  166. package/dist/token/types.d.ts +1 -1
  167. package/dist/token/warpCheck.d.ts +1 -0
  168. package/dist/token/warpCheck.d.ts.map +1 -1
  169. package/dist/token/warpCheck.js +25 -2
  170. package/dist/token/warpCheck.js.map +1 -1
  171. package/dist/token/warpCheck.test.js +119 -0
  172. package/dist/token/warpCheck.test.js.map +1 -1
  173. package/dist/utils/contract.d.ts +33 -0
  174. package/dist/utils/contract.d.ts.map +1 -1
  175. package/dist/utils/contract.js +116 -3
  176. package/dist/utils/contract.js.map +1 -1
  177. package/dist/utils/contract.test.js +465 -2
  178. package/dist/utils/contract.test.js.map +1 -1
  179. package/dist/utils/contract.transport.test.d.ts +2 -0
  180. package/dist/utils/contract.transport.test.d.ts.map +1 -0
  181. package/dist/utils/contract.transport.test.js +145 -0
  182. package/dist/utils/contract.transport.test.js.map +1 -0
  183. package/dist/utils/ism.d.ts +12 -6
  184. package/dist/utils/ism.d.ts.map +1 -1
  185. package/dist/utils/ism.js +92 -41
  186. package/dist/utils/ism.js.map +1 -1
  187. package/dist/utils/ism.test.js +75 -2
  188. package/dist/utils/ism.test.js.map +1 -1
  189. package/package.json +29 -15
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/test/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB;IAIlC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,EAAE;QACnE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,EAAE;QACtD,IAAI,EAAE,eAAe;KACtB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/test/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB;IAIlC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,EAAE;QACnE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,EAAE;QACtD,IAAI,EAAE,eAAe;KACtB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACvD,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI;KACtC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB;IAIpC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACvD,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;KAC3F,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB;IAInC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACvD,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,qBAAqB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B;IAI3C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACvD,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;KACpC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAChD,MAAc;IAEd,OAAO,MAAM,CAAC,MAAM,CAClB,IAAI,KAAK,CACP,oOAAoO,CACrO,EACD,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CACtD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../../src/test/fixtures/warp-route-replay/record.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ // Re-records a replay fixture from a live node:
2
+ // RPC_URL=<node url> pnpm exec tsx src/test/fixtures/warp-route-replay/record.ts <scenario>
3
+ // RPC_URL is read from the environment only and never written to the fixture.
4
+ // eslint-disable-next-line import/no-nodejs-modules
5
+ import { writeFileSync } from 'fs';
6
+ import { assert } from '@hyperlane-xyz/utils';
7
+ import { REPLAY_FIXTURE_DIR, createReplayReader, serializeReplayFixture, startRecordingServer, } from '../../replayRpc.js';
8
+ import { REPLAY_SCENARIOS, runProbe } from '../../replayScenarios.js';
9
+ const [scenarioName] = process.argv.slice(2);
10
+ const upstream = process.env.RPC_URL;
11
+ assert(upstream, 'RPC_URL is required');
12
+ const scenario = REPLAY_SCENARIOS.find((s) => s.scenario === scenarioName);
13
+ assert(scenario, `Unknown scenario ${scenarioName}`);
14
+ const recorder = await startRecordingServer(upstream, {
15
+ scenario: scenario.scenario,
16
+ chain: scenario.chain,
17
+ chainId: scenario.chainId,
18
+ });
19
+ try {
20
+ const { reader, provider } = createReplayReader(recorder.url, scenario.chainId);
21
+ const result = await scenario.run(reader, scenario.router);
22
+ console.log(`${scenario.scenario}:`, result);
23
+ for (const probe of scenario.probes) {
24
+ await runProbe(provider, probe).catch((error) => console.log(`probe ${probe.signature} threw: ${String(error).slice(0, 80)}`));
25
+ }
26
+ assert(recorder.failures.length === 0, `Recording server failures: ${recorder.failures.join('; ')}`);
27
+ writeFileSync(new URL(`${scenario.scenario}.json`, REPLAY_FIXTURE_DIR), serializeReplayFixture(recorder.fixture));
28
+ }
29
+ finally {
30
+ await recorder.close();
31
+ }
32
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../../../src/test/fixtures/warp-route-replay/record.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,8FAA8F;AAC9F,8EAA8E;AAC9E,oDAAoD;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAEnC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACrC,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;AACxC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC;AAC3E,MAAM,CAAC,QAAQ,EAAE,oBAAoB,YAAY,EAAE,CAAC,CAAC;AAErD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE;IACpD,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;CAC1B,CAAC,CAAC;AACH,IAAI,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAC7C,QAAQ,CAAC,GAAG,EACZ,QAAQ,CAAC,OAAO,CACjB,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CACvD,OAAO,CAAC,GAAG,CACT,SAAS,KAAK,CAAC,SAAS,WAAW,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAChE,CACF,CAAC;IACJ,CAAC;IACD,MAAM,CACJ,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAC9B,8BAA8B,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7D,CAAC;IACF,aAAa,CACX,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,OAAO,EAAE,kBAAkB,CAAC,EACxD,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CACzC,CAAC;AACJ,CAAC;QAAS,CAAC;IACT,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,82 @@
1
+ import type { providers } from 'ethers';
2
+ import { EvmWarpRouteReader } from '../token/EvmWarpRouteReader.js';
3
+ export declare const REPLAY_FIXTURE_DIR: URL;
4
+ export declare const REPLAY_CHAIN_NAME = "replaychain";
5
+ export interface JsonRpcErrorBody {
6
+ code: number;
7
+ message: string;
8
+ data?: unknown;
9
+ }
10
+ export interface RecordedRequest {
11
+ method: string;
12
+ address?: string;
13
+ slot?: string;
14
+ to?: string;
15
+ data?: string;
16
+ result?: string;
17
+ resultGzBase64?: string;
18
+ error?: JsonRpcErrorBody;
19
+ }
20
+ export interface ReplayFixture {
21
+ scenario: string;
22
+ chain: string;
23
+ chainId: number;
24
+ blockNumber: number;
25
+ capturedAt: string;
26
+ requests: RecordedRequest[];
27
+ }
28
+ export declare function serializeReplayFixture(fixture: ReplayFixture): string;
29
+ export declare function parseReplayFixture(text: string): ReplayFixture;
30
+ export declare function loadReplayFixture(scenario: string): ReplayFixture;
31
+ export declare function recordedResult(request: RecordedRequest): string | undefined;
32
+ export declare function recordedCode(fixture: ReplayFixture, address: string): string | undefined;
33
+ /**
34
+ * Derives a variant of a recording by replacing the recorded response of the
35
+ * eth_call to `to` with calldata starting with `dataPrefix`. Variants are
36
+ * synthetic: only the replaced response is not a recording.
37
+ */
38
+ export declare function withCallResult(fixture: ReplayFixture, to: string, dataPrefix: string, result: string): ReplayFixture;
39
+ /**
40
+ * Derives a variant of a recording by replacing the recorded response of the
41
+ * eth_call to `to` with calldata starting with `dataPrefix` by a JSON-RPC
42
+ * error.
43
+ */
44
+ export declare function withCallError(fixture: ReplayFixture, to: string, dataPrefix: string, error: JsonRpcErrorBody): ReplayFixture;
45
+ /**
46
+ * Derives a variant of a recording whose storage `slot` at `address` reads as
47
+ * `value`, adding the read when it was not recorded.
48
+ */
49
+ export declare function withStorage(fixture: ReplayFixture, address: string, slot: string, value: string): ReplayFixture;
50
+ /**
51
+ * Derives a variant of a recording whose contract code at `address` has
52
+ * `hexSuffix` appended.
53
+ */
54
+ export declare function withCodeSuffix(fixture: ReplayFixture, address: string, hexSuffix: string): ReplayFixture;
55
+ export interface ReplayServer {
56
+ url: string;
57
+ ethCalls: string[];
58
+ unexpected: string[];
59
+ close(): Promise<void>;
60
+ }
61
+ /**
62
+ * Serves the recorded JSON-RPC responses (results and error bodies exactly as
63
+ * recorded). Requests without a recording are answered with an error and listed
64
+ * in `unexpected`.
65
+ */
66
+ export declare function startReplayServer(fixture: ReplayFixture): Promise<ReplayServer>;
67
+ export interface RecordingServer {
68
+ url: string;
69
+ fixture: ReplayFixture;
70
+ failures: string[];
71
+ close(): Promise<void>;
72
+ }
73
+ /**
74
+ * Forwards requests to a real node and records the eth_getCode,
75
+ * eth_getStorageAt, eth_call and eth_estimateGas responses.
76
+ */
77
+ export declare function startRecordingServer(upstreamUrl: string, meta: Pick<ReplayFixture, 'scenario' | 'chain' | 'chainId'>): Promise<RecordingServer>;
78
+ export declare function createReplayReader(rpcUrl: string, chainId: number): {
79
+ reader: EvmWarpRouteReader;
80
+ provider: providers.Provider;
81
+ };
82
+ //# sourceMappingURL=replayRpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayRpc.d.ts","sourceRoot":"","sources":["../../src/test/replayRpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,331 @@
1
+ // eslint-disable-next-line import/no-nodejs-modules
2
+ import { readFileSync } from 'fs';
3
+ // eslint-disable-next-line import/no-nodejs-modules
4
+ import http from 'http';
5
+ // eslint-disable-next-line import/no-nodejs-modules
6
+ import { gunzipSync, gzipSync } from 'zlib';
7
+ import { ProtocolType, assert } from '@hyperlane-xyz/utils';
8
+ import { ExplorerFamily } from '../metadata/chainMetadataTypes.js';
9
+ import { MultiProvider } from '../providers/MultiProvider.js';
10
+ import { EvmWarpRouteReader } from '../token/EvmWarpRouteReader.js';
11
+ export const REPLAY_FIXTURE_DIR = new URL('./fixtures/warp-route-replay/', import.meta.url);
12
+ export const REPLAY_CHAIN_NAME = 'replaychain';
13
+ const RECORDED_METHODS = [
14
+ 'eth_getCode',
15
+ 'eth_getStorageAt',
16
+ 'eth_call',
17
+ 'eth_estimateGas',
18
+ ];
19
+ const CALL_LIKE_METHODS = ['eth_call', 'eth_estimateGas'];
20
+ const GZIP_THRESHOLD = 512;
21
+ // The repo's pre-commit private-key heuristic rejects any added line holding a
22
+ // 64-nibble hex word, which EVM storage slots and ABI words all are. Fixtures
23
+ // store such words split in the middle by an underscore; the loader joins them
24
+ // back, so replayed values are byte-identical to the recorded ones.
25
+ const HEX_WORD_HALVES = /\b((?:0x)?[0-9a-fA-F]{32})([0-9a-fA-F]{32})\b/g;
26
+ const SPLIT_HEX_WORD = /\b((?:0x)?[0-9a-fA-F]{32})_([0-9a-fA-F]{32})\b/g;
27
+ // Providers can echo URLs or API keys in error bodies; fixtures must never
28
+ // carry them.
29
+ const SECRET_LIKE = /https?:\/\/|key=|apikey/i;
30
+ export function serializeReplayFixture(fixture) {
31
+ const text = JSON.stringify(fixture, null, 2);
32
+ assert(!SECRET_LIKE.test(text), `Fixture ${fixture.scenario} contains a URL or key-like text; refusing to serialize it`);
33
+ return `${text.replace(HEX_WORD_HALVES, '$1_$2')}\n`;
34
+ }
35
+ export function parseReplayFixture(text) {
36
+ return JSON.parse(text.replace(SPLIT_HEX_WORD, '$1$2'));
37
+ }
38
+ export function loadReplayFixture(scenario) {
39
+ return parseReplayFixture(readFileSync(new URL(`${scenario}.json`, REPLAY_FIXTURE_DIR), 'utf8'));
40
+ }
41
+ export function recordedResult(request) {
42
+ if (request.resultGzBase64 === undefined)
43
+ return request.result;
44
+ return gunzipSync(Buffer.from(request.resultGzBase64, 'base64')).toString('utf8');
45
+ }
46
+ export function recordedCode(fixture, address) {
47
+ const request = fixture.requests.find((r) => r.method === 'eth_getCode' &&
48
+ r.address?.toLowerCase() === address.toLowerCase());
49
+ return request && recordedResult(request);
50
+ }
51
+ /**
52
+ * Derives a variant of a recording by replacing the recorded response of the
53
+ * eth_call to `to` with calldata starting with `dataPrefix`. Variants are
54
+ * synthetic: only the replaced response is not a recording.
55
+ */
56
+ export function withCallResult(fixture, to, dataPrefix, result) {
57
+ let replaced = 0;
58
+ const requests = fixture.requests.map((r) => {
59
+ if (r.method !== 'eth_call' ||
60
+ r.to?.toLowerCase() !== to.toLowerCase() ||
61
+ !r.data?.startsWith(dataPrefix)) {
62
+ return r;
63
+ }
64
+ replaced += 1;
65
+ return { method: r.method, to: r.to, data: r.data, result };
66
+ });
67
+ assert(replaced === 1, `Expected one recorded call ${to} ${dataPrefix}`);
68
+ return { ...fixture, requests };
69
+ }
70
+ /**
71
+ * Derives a variant of a recording by replacing the recorded response of the
72
+ * eth_call to `to` with calldata starting with `dataPrefix` by a JSON-RPC
73
+ * error.
74
+ */
75
+ export function withCallError(fixture, to, dataPrefix, error) {
76
+ let replaced = 0;
77
+ const requests = fixture.requests.map((r) => {
78
+ if (r.method !== 'eth_call' ||
79
+ r.to?.toLowerCase() !== to.toLowerCase() ||
80
+ !r.data?.startsWith(dataPrefix)) {
81
+ return r;
82
+ }
83
+ replaced += 1;
84
+ return { method: r.method, to: r.to, data: r.data, error };
85
+ });
86
+ assert(replaced === 1, `Expected one recorded call ${to} ${dataPrefix}`);
87
+ return { ...fixture, requests };
88
+ }
89
+ /**
90
+ * Derives a variant of a recording whose storage `slot` at `address` reads as
91
+ * `value`, adding the read when it was not recorded.
92
+ */
93
+ export function withStorage(fixture, address, slot, value) {
94
+ const entry = {
95
+ method: 'eth_getStorageAt',
96
+ address: address.toLowerCase(),
97
+ slot,
98
+ result: value,
99
+ };
100
+ const matches = (r) => r.method === 'eth_getStorageAt' &&
101
+ r.address?.toLowerCase() === address.toLowerCase() &&
102
+ BigInt(r.slot ?? '0x0') === BigInt(slot);
103
+ const requests = fixture.requests.some(matches)
104
+ ? fixture.requests.map((r) => (matches(r) ? entry : r))
105
+ : [...fixture.requests, entry];
106
+ return { ...fixture, requests };
107
+ }
108
+ /**
109
+ * Derives a variant of a recording whose contract code at `address` has
110
+ * `hexSuffix` appended.
111
+ */
112
+ export function withCodeSuffix(fixture, address, hexSuffix) {
113
+ let replaced = 0;
114
+ const requests = fixture.requests.map((r) => {
115
+ if (r.method !== 'eth_getCode' ||
116
+ r.address?.toLowerCase() !== address.toLowerCase()) {
117
+ return r;
118
+ }
119
+ replaced += 1;
120
+ return {
121
+ method: r.method,
122
+ address: r.address,
123
+ result: `${recordedResult(r)}${hexSuffix}`,
124
+ };
125
+ });
126
+ assert(replaced === 1, `Expected one recorded code for ${address}`);
127
+ return { ...fixture, requests };
128
+ }
129
+ function str(value) {
130
+ return typeof value === 'string' ? value.toLowerCase() : '';
131
+ }
132
+ function requestKey(method, params) {
133
+ const [first, second] = params;
134
+ if (CALL_LIKE_METHODS.includes(method)) {
135
+ const call = typeof first === 'object' && first !== null ? first : {};
136
+ return `${method}|${str(Reflect.get(call, 'to'))}|${str(Reflect.get(call, 'data') ?? Reflect.get(call, 'input'))}`;
137
+ }
138
+ if (method === 'eth_getStorageAt') {
139
+ return `${method}|${str(first)}|${BigInt(typeof second === 'string' ? second : '0x0')}`;
140
+ }
141
+ return `${method}|${str(first)}`;
142
+ }
143
+ function recordedKey(request) {
144
+ return requestKey(request.method, CALL_LIKE_METHODS.includes(request.method)
145
+ ? [{ to: request.to, data: request.data }]
146
+ : [request.address, request.slot]);
147
+ }
148
+ function isJsonRpcRequest(value) {
149
+ return (typeof value === 'object' &&
150
+ value !== null &&
151
+ typeof Reflect.get(value, 'method') === 'string');
152
+ }
153
+ function listen(handler, onFailure) {
154
+ const server = http.createServer((req, res) => {
155
+ const chunks = [];
156
+ const respond = (payload) => {
157
+ res.setHeader('content-type', 'application/json');
158
+ res.end(JSON.stringify(payload));
159
+ };
160
+ const fail = (error) => {
161
+ const message = error instanceof Error ? error.message : String(error);
162
+ onFailure(`replay server failure: ${message}`);
163
+ respond({
164
+ jsonrpc: '2.0',
165
+ id: null,
166
+ error: { code: -32603, message: `replay: ${message}` },
167
+ });
168
+ };
169
+ req.on('error', fail);
170
+ req.on('data', (chunk) => chunks.push(chunk));
171
+ req.on('end', async () => {
172
+ try {
173
+ const body = JSON.parse(Buffer.concat(chunks).toString('utf8'));
174
+ const requests = Array.isArray(body) ? body : [body];
175
+ const responses = [];
176
+ for (const request of requests) {
177
+ assert(isJsonRpcRequest(request), 'Malformed JSON-RPC request');
178
+ const params = Array.isArray(request.params) ? request.params : [];
179
+ responses.push({
180
+ jsonrpc: '2.0',
181
+ id: request.id,
182
+ ...(await handler({ ...request, params })),
183
+ });
184
+ }
185
+ respond(Array.isArray(body) ? responses : responses[0]);
186
+ }
187
+ catch (error) {
188
+ fail(error);
189
+ }
190
+ });
191
+ });
192
+ return new Promise((resolve, reject) => {
193
+ server.once('error', reject);
194
+ server.listen(0, '127.0.0.1', () => {
195
+ server.off('error', reject);
196
+ const address = server.address();
197
+ if (!address || typeof address !== 'object') {
198
+ reject(new Error('Replay server not bound'));
199
+ return;
200
+ }
201
+ resolve({ server, url: `http://127.0.0.1:${address.port}` });
202
+ });
203
+ });
204
+ }
205
+ function closer(server) {
206
+ return () => new Promise((resolve) => {
207
+ server.closeAllConnections();
208
+ server.close(() => resolve());
209
+ });
210
+ }
211
+ function chainStateResult(fixtureMeta, method) {
212
+ switch (method) {
213
+ case 'eth_chainId':
214
+ return { result: `0x${fixtureMeta.chainId.toString(16)}` };
215
+ case 'net_version':
216
+ return { result: String(fixtureMeta.chainId) };
217
+ case 'eth_blockNumber':
218
+ return { result: `0x${fixtureMeta.blockNumber.toString(16)}` };
219
+ default:
220
+ return undefined;
221
+ }
222
+ }
223
+ /**
224
+ * Serves the recorded JSON-RPC responses (results and error bodies exactly as
225
+ * recorded). Requests without a recording are answered with an error and listed
226
+ * in `unexpected`.
227
+ */
228
+ export async function startReplayServer(fixture) {
229
+ const recorded = new Map(fixture.requests.map((r) => [recordedKey(r), r]));
230
+ const ethCalls = [];
231
+ const unexpected = [];
232
+ const { server, url } = await listen(async ({ method, params }) => {
233
+ const state = chainStateResult(fixture, method);
234
+ if (state)
235
+ return state;
236
+ const [first] = params;
237
+ if (method === 'eth_call') {
238
+ ethCalls.push(`${str(Reflect.get(Object(first), 'to'))}:${str(Reflect.get(Object(first), 'data'))}`);
239
+ }
240
+ const match = recorded.get(requestKey(method, params));
241
+ if (!match) {
242
+ unexpected.push(`${method} ${JSON.stringify(params)}`);
243
+ return {
244
+ error: { code: -32601, message: 'replay: no recorded response' },
245
+ };
246
+ }
247
+ if (match.error)
248
+ return { error: match.error };
249
+ return { result: recordedResult(match) };
250
+ }, (message) => unexpected.push(message));
251
+ return { url, ethCalls, unexpected, close: closer(server) };
252
+ }
253
+ /**
254
+ * Forwards requests to a real node and records the eth_getCode,
255
+ * eth_getStorageAt, eth_call and eth_estimateGas responses.
256
+ */
257
+ export async function startRecordingServer(upstreamUrl, meta) {
258
+ const upstream = async (method, params) => {
259
+ const response = await fetch(upstreamUrl, {
260
+ method: 'POST',
261
+ headers: { 'content-type': 'application/json' },
262
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
263
+ });
264
+ return response.json();
265
+ };
266
+ const blockNumber = Number(BigInt((await upstream('eth_blockNumber', [])).result));
267
+ const fixture = {
268
+ ...meta,
269
+ blockNumber,
270
+ capturedAt: new Date().toISOString(),
271
+ requests: [],
272
+ };
273
+ const failures = [];
274
+ const { server, url } = await listen(async ({ method, params }) => {
275
+ const state = chainStateResult(fixture, method);
276
+ if (state)
277
+ return state;
278
+ const body = await upstream(method, params);
279
+ if (RECORDED_METHODS.includes(method)) {
280
+ const [first, second] = params;
281
+ const request = { method };
282
+ if (CALL_LIKE_METHODS.includes(method)) {
283
+ request.to = str(Reflect.get(Object(first), 'to'));
284
+ request.data = str(Reflect.get(Object(first), 'data'));
285
+ }
286
+ else {
287
+ request.address = str(first);
288
+ if (method === 'eth_getStorageAt')
289
+ request.slot = str(second);
290
+ }
291
+ if (body.error)
292
+ request.error = body.error;
293
+ else if (typeof body.result === 'string') {
294
+ if (body.result.length > GZIP_THRESHOLD) {
295
+ request.resultGzBase64 = gzipSync(body.result).toString('base64');
296
+ }
297
+ else
298
+ request.result = body.result;
299
+ }
300
+ if (!fixture.requests.some((r) => recordedKey(r) === recordedKey(request)))
301
+ fixture.requests.push(request);
302
+ }
303
+ return body.error ? { error: body.error } : { result: body.result };
304
+ }, (message) => failures.push(message));
305
+ return { url, fixture, failures, close: closer(server) };
306
+ }
307
+ export function createReplayReader(rpcUrl, chainId) {
308
+ const multiProvider = new MultiProvider({
309
+ [REPLAY_CHAIN_NAME]: {
310
+ name: REPLAY_CHAIN_NAME,
311
+ chainId,
312
+ domainId: chainId,
313
+ protocol: ProtocolType.Ethereum,
314
+ rpcUrls: [{ http: rpcUrl }],
315
+ nativeToken: { decimals: 18, name: 'Ether', symbol: 'ETH' },
316
+ blockExplorers: [
317
+ {
318
+ name: 'replay',
319
+ url: 'http://127.0.0.1',
320
+ apiUrl: 'http://127.0.0.1',
321
+ family: ExplorerFamily.Other,
322
+ },
323
+ ],
324
+ },
325
+ });
326
+ return {
327
+ reader: new EvmWarpRouteReader(multiProvider, REPLAY_CHAIN_NAME),
328
+ provider: multiProvider.getProvider(REPLAY_CHAIN_NAME),
329
+ };
330
+ }
331
+ //# sourceMappingURL=replayRpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayRpc.js","sourceRoot":"","sources":["../../src/test/replayRpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type providers } from 'ethers';
2
+ import type { EvmWarpRouteReader } from '../token/EvmWarpRouteReader.js';
3
+ export interface ReplayProbe {
4
+ to: string;
5
+ signature: string;
6
+ args: unknown[];
7
+ }
8
+ export interface ReplayScenario {
9
+ scenario: string;
10
+ chain: string;
11
+ chainId: number;
12
+ router: string;
13
+ run(reader: EvmWarpRouteReader, router: string): Promise<unknown>;
14
+ probes: ReplayProbe[];
15
+ }
16
+ export declare const REPLAY_SCENARIOS: ReplayScenario[];
17
+ export declare const EXPECTED_TOKEN_TYPE: "collateral";
18
+ export declare function runProbe(provider: providers.Provider, probe: ReplayProbe): Promise<unknown>;
19
+ //# sourceMappingURL=replayScenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayScenarios.d.ts","sourceRoot":"","sources":["../../src/test/replayScenarios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGlD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIzE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IAEX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAE7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,cAAc,EA+E5C,CAAC;AAEF,eAAO,MAAM,mBAAmB,cAAuB,CAAC;AAExD,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,OAAO,CAAC,CAQlB"}
@@ -0,0 +1,89 @@
1
+ import { Contract } from 'ethers';
2
+ import { TokenType } from '../token/config.js';
3
+ export const REPLAY_SCENARIOS = [
4
+ {
5
+ scenario: 'bat-aleo-ethereum-collateral',
6
+ chain: 'ethereum',
7
+ chainId: 1,
8
+ router: '0x516e156e987175d74614cc2bC960f148A610f0b3',
9
+ run: (reader, router) => reader.deriveTokenType(router),
10
+ probes: [
11
+ {
12
+ to: '0x0D8775F648430679A709E98d2b0Cb6250d2887EF',
13
+ signature: 'mintingCurrentLimitOf(address) view returns (uint256)',
14
+ args: ['0x516e156e987175d74614cc2bC960f148A610f0b3'],
15
+ },
16
+ ],
17
+ },
18
+ {
19
+ scenario: 'magic-abstract-base-router',
20
+ chain: 'base',
21
+ chainId: 8453,
22
+ router: '0xF1572d1Da5c3CcE14eE5a1c9327d17e9ff0E3f43',
23
+ run: (reader, router) => reader.fetchScale(router),
24
+ probes: [
25
+ {
26
+ to: '0xF1572d1Da5c3CcE14eE5a1c9327d17e9ff0E3f43',
27
+ signature: 'scale() view returns (uint256)',
28
+ args: [],
29
+ },
30
+ ],
31
+ },
32
+ {
33
+ scenario: 'usdc-lukso-router',
34
+ chain: 'lukso',
35
+ chainId: 42,
36
+ router: '0xE0C2e4F894D4Cd33626e33b24582559F3156E1Ab',
37
+ run: async (reader, router) => ({
38
+ feeHook: await reader.fetchFeeHook(router),
39
+ scale: await reader.fetchScale(router),
40
+ }),
41
+ probes: [
42
+ {
43
+ to: '0xE0C2e4F894D4Cd33626e33b24582559F3156E1Ab',
44
+ signature: 'feeHook() view returns (address)',
45
+ args: [],
46
+ },
47
+ ],
48
+ },
49
+ {
50
+ scenario: 'lyx-lukso-native-router',
51
+ chain: 'lukso',
52
+ chainId: 42,
53
+ router: '0xC210B2cB65ed3484892167F5e05F7ab496Ab0598',
54
+ run: (reader, router) => reader.deriveWarpRouteConfig(router),
55
+ probes: [
56
+ {
57
+ to: '0xC210B2cB65ed3484892167F5e05F7ab496Ab0598',
58
+ signature: 'feeRecipient() view returns (address)',
59
+ args: [],
60
+ },
61
+ {
62
+ to: '0xC210B2cB65ed3484892167F5e05F7ab496Ab0598',
63
+ signature: 'feeHook() view returns (address)',
64
+ args: [],
65
+ },
66
+ ],
67
+ },
68
+ {
69
+ scenario: 'blend-fluent-collateral',
70
+ chain: 'fluent',
71
+ chainId: 25363,
72
+ router: '0x2bef59e84615371304bd731601f6344F5F304504',
73
+ run: (reader, router) => reader.deriveTokenType(router),
74
+ probes: [
75
+ {
76
+ to: '0x1385B8f55A84f2BdA13EeD4099d29Eae03d553b2',
77
+ signature: 'mintingCurrentLimitOf(address) view returns (uint256)',
78
+ args: ['0x2bef59e84615371304bd731601f6344F5F304504'],
79
+ },
80
+ ],
81
+ },
82
+ ];
83
+ export const EXPECTED_TOKEN_TYPE = TokenType.collateral;
84
+ export async function runProbe(provider, probe) {
85
+ const contract = new Contract(probe.to, [`function ${probe.signature}`], provider);
86
+ const name = probe.signature.slice(0, probe.signature.indexOf('('));
87
+ return contract[name](...probe.args);
88
+ }
89
+ //# sourceMappingURL=replayScenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayScenarios.js","sourceRoot":"","sources":["../../src/test/replayScenarios.ts"],"names":[],"mappings":"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"}