@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.
- package/dist/consts/multisigIsm.d.ts.map +1 -1
- package/dist/consts/multisigIsm.js +104 -772
- package/dist/consts/multisigIsm.js.map +1 -1
- package/dist/consts/testChains.d.ts.map +1 -1
- package/dist/consts/testChains.js +11 -6
- package/dist/consts/testChains.js.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.d.ts +6 -0
- package/dist/core/adapters/SealevelCoreAdapter.d.ts.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.js +20 -0
- package/dist/core/adapters/SealevelCoreAdapter.js.map +1 -1
- package/dist/core/adapters/SealevelCoreAdapter.test.js +17 -0
- package/dist/core/adapters/SealevelCoreAdapter.test.js.map +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/types.test.js +98 -1
- package/dist/core/types.test.js.map +1 -1
- package/dist/deploy/proxy.d.ts +1 -0
- package/dist/deploy/proxy.d.ts.map +1 -1
- package/dist/deploy/proxy.js +6 -0
- package/dist/deploy/proxy.js.map +1 -1
- package/dist/deploy/warp.d.ts.map +1 -1
- package/dist/deploy/warp.js +32 -43
- package/dist/deploy/warp.js.map +1 -1
- package/dist/deploy/warp.test.js +62 -1
- package/dist/deploy/warp.test.js.map +1 -1
- package/dist/gas/adapters/SealevelIgpAdapter.d.ts +3 -2
- package/dist/gas/adapters/SealevelIgpAdapter.d.ts.map +1 -1
- package/dist/gas/adapters/SealevelIgpAdapter.js +3 -2
- package/dist/gas/adapters/SealevelIgpAdapter.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/ism/EvmIsmModule.d.ts.map +1 -1
- package/dist/ism/EvmIsmModule.js +5 -1
- package/dist/ism/EvmIsmModule.js.map +1 -1
- package/dist/ism/EvmIsmModule.test.js +109 -0
- package/dist/ism/EvmIsmModule.test.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.d.ts +26 -6
- package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +60 -0
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.js +165 -34
- package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.test.js +33 -6
- package/dist/ism/HyperlaneIsmFactory.test.js.map +1 -1
- package/dist/ism/types.d.ts +18 -2
- package/dist/ism/types.d.ts.map +1 -1
- package/dist/ism/types.js +43 -3
- package/dist/ism/types.js.map +1 -1
- package/dist/ism/types.test.js +232 -56
- package/dist/ism/types.test.js.map +1 -1
- package/dist/ism/utils.d.ts.map +1 -1
- package/dist/ism/utils.js +13 -0
- package/dist/ism/utils.js.map +1 -1
- package/dist/ism/utils.test.js +43 -1
- package/dist/ism/utils.test.js.map +1 -1
- package/dist/metadata/ChainMetadataManager.d.ts +1 -0
- package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
- package/dist/metadata/ChainMetadataManager.js +1 -0
- package/dist/metadata/ChainMetadataManager.js.map +1 -1
- package/dist/metadata/ChainMetadataManager.test.js +14 -1
- package/dist/metadata/ChainMetadataManager.test.js.map +1 -1
- package/dist/metadata/ChainMetadataResolver.d.ts +1 -0
- package/dist/metadata/ChainMetadataResolver.d.ts.map +1 -1
- package/dist/metadata/ChainMetadataResolver.js +1 -0
- package/dist/metadata/ChainMetadataResolver.js.map +1 -1
- package/dist/metadata/ChainMetadataResolver.test.js +4 -0
- package/dist/metadata/ChainMetadataResolver.test.js.map +1 -1
- package/dist/metadata/agentConfig.d.ts +209 -93
- package/dist/metadata/agentConfig.d.ts.map +1 -1
- package/dist/metadata/agentConfig.js +106 -13
- package/dist/metadata/agentConfig.js.map +1 -1
- package/dist/metadata/agentConfig.test.js +277 -25
- package/dist/metadata/agentConfig.test.js.map +1 -1
- package/dist/metadata/chainMetadata.test.js +25 -0
- package/dist/metadata/chainMetadata.test.js.map +1 -1
- package/dist/metadata/chainMetadataTypes.d.ts +36 -0
- package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
- package/dist/metadata/chainMetadataTypes.js +26 -0
- package/dist/metadata/chainMetadataTypes.js.map +1 -1
- package/dist/providers/SeismicSigner.d.ts +4 -12
- package/dist/providers/SeismicSigner.d.ts.map +1 -1
- package/dist/providers/SeismicSigner.js +84 -35
- package/dist/providers/SeismicSigner.js.map +1 -1
- package/dist/providers/SeismicSigner.test.d.ts +2 -0
- package/dist/providers/SeismicSigner.test.d.ts.map +1 -0
- package/dist/providers/SeismicSigner.test.js +160 -0
- package/dist/providers/SeismicSigner.test.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.d.ts +1 -5
- package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts +2 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js +164 -0
- package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.js +35 -72
- package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.test.js +181 -2
- package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
- package/dist/providers/SmartProvider/jsonRpcError.d.ts +7 -0
- package/dist/providers/SmartProvider/jsonRpcError.d.ts.map +1 -0
- package/dist/providers/SmartProvider/jsonRpcError.js +67 -0
- package/dist/providers/SmartProvider/jsonRpcError.js.map +1 -0
- package/dist/providers/SmartProvider/types.d.ts +1 -0
- package/dist/providers/SmartProvider/types.d.ts.map +1 -1
- package/dist/providers/builders/ethersV5.d.ts +0 -1
- package/dist/providers/builders/ethersV5.d.ts.map +1 -1
- package/dist/providers/builders/ethersV5.js +19 -5
- package/dist/providers/builders/ethersV5.js.map +1 -1
- package/dist/providers/builders/ethersV5.test.d.ts +2 -0
- package/dist/providers/builders/ethersV5.test.d.ts.map +1 -0
- package/dist/providers/builders/ethersV5.test.js +77 -0
- package/dist/providers/builders/ethersV5.test.js.map +1 -0
- package/dist/providers/builders/radix.browser.d.ts +1 -0
- package/dist/providers/builders/radix.browser.d.ts.map +1 -1
- package/dist/providers/builders/radix.browser.js +1 -0
- package/dist/providers/builders/radix.browser.js.map +1 -1
- package/dist/providers/builders/radix.d.ts.map +1 -1
- package/dist/providers/builders/radix.gateway.test.d.ts +2 -0
- package/dist/providers/builders/radix.gateway.test.d.ts.map +1 -0
- package/dist/providers/builders/radix.gateway.test.js +39 -0
- package/dist/providers/builders/radix.gateway.test.js.map +1 -0
- package/dist/providers/builders/radix.js +1 -0
- package/dist/providers/builders/radix.js.map +1 -1
- package/dist/providers/builders/radix.test.js +1 -0
- package/dist/providers/builders/radix.test.js.map +1 -1
- package/dist/providers/providerBuilders.d.ts +1 -1
- package/dist/providers/providerBuilders.d.ts.map +1 -1
- package/dist/providers/providerBuilders.js +1 -1
- package/dist/providers/providerBuilders.js.map +1 -1
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +60 -8
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -1
- package/dist/test/errors.d.ts +25 -0
- package/dist/test/errors.d.ts.map +1 -1
- package/dist/test/errors.js +31 -0
- package/dist/test/errors.js.map +1 -1
- package/dist/test/fixtures/warp-route-replay/record.d.ts +2 -0
- package/dist/test/fixtures/warp-route-replay/record.d.ts.map +1 -0
- package/dist/test/fixtures/warp-route-replay/record.js +32 -0
- package/dist/test/fixtures/warp-route-replay/record.js.map +1 -0
- package/dist/test/replayRpc.d.ts +82 -0
- package/dist/test/replayRpc.d.ts.map +1 -0
- package/dist/test/replayRpc.js +331 -0
- package/dist/test/replayRpc.js.map +1 -0
- package/dist/test/replayScenarios.d.ts +19 -0
- package/dist/test/replayScenarios.d.ts.map +1 -0
- package/dist/test/replayScenarios.js +89 -0
- package/dist/test/replayScenarios.js.map +1 -0
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js +92 -7
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js.map +1 -1
- package/dist/timelock/evm/errors.js +1 -1
- package/dist/timelock/evm/errors.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.d.ts +27 -0
- package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
- package/dist/token/EvmWarpRouteReader.hardhat-test.js +28 -3
- package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.js +172 -42
- package/dist/token/EvmWarpRouteReader.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.replay.test.d.ts +2 -0
- package/dist/token/EvmWarpRouteReader.replay.test.d.ts.map +1 -0
- package/dist/token/EvmWarpRouteReader.replay.test.js +392 -0
- package/dist/token/EvmWarpRouteReader.replay.test.js.map +1 -0
- package/dist/token/EvmWarpRouteReader.test.js +529 -4
- package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
- package/dist/token/types.d.ts +1 -1
- package/dist/token/warpCheck.d.ts +1 -0
- package/dist/token/warpCheck.d.ts.map +1 -1
- package/dist/token/warpCheck.js +25 -2
- package/dist/token/warpCheck.js.map +1 -1
- package/dist/token/warpCheck.test.js +119 -0
- package/dist/token/warpCheck.test.js.map +1 -1
- package/dist/utils/contract.d.ts +33 -0
- package/dist/utils/contract.d.ts.map +1 -1
- package/dist/utils/contract.js +116 -3
- package/dist/utils/contract.js.map +1 -1
- package/dist/utils/contract.test.js +465 -2
- package/dist/utils/contract.test.js.map +1 -1
- package/dist/utils/contract.transport.test.d.ts +2 -0
- package/dist/utils/contract.transport.test.d.ts.map +1 -0
- package/dist/utils/contract.transport.test.js +145 -0
- package/dist/utils/contract.transport.test.js.map +1 -0
- package/dist/utils/ism.d.ts +12 -6
- package/dist/utils/ism.d.ts.map +1 -1
- package/dist/utils/ism.js +92 -41
- package/dist/utils/ism.js.map +1 -1
- package/dist/utils/ism.test.js +75 -2
- package/dist/utils/ism.test.js.map +1 -1
- package/package.json +29 -15
package/dist/test/errors.js.map
CHANGED
|
@@ -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 @@
|
|
|
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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"}
|