@recoillink/sdk 0.0.0-stage → 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/LICENSE.md +193 -0
- package/README.md +30 -2
- package/dist/app/HyperlaneApp.d.ts +13 -0
- package/dist/app/HyperlaneApp.d.ts.map +1 -0
- package/dist/app/HyperlaneApp.js +22 -0
- package/dist/app/HyperlaneApp.js.map +1 -0
- package/dist/app/MultiProtocolApp.d.ts +93 -0
- package/dist/app/MultiProtocolApp.d.ts.map +1 -0
- package/dist/app/MultiProtocolApp.js +144 -0
- package/dist/app/MultiProtocolApp.js.map +1 -0
- package/dist/app/MultiProtocolApp.test.d.ts +2 -0
- package/dist/app/MultiProtocolApp.test.d.ts.map +1 -0
- package/dist/app/MultiProtocolApp.test.js +28 -0
- package/dist/app/MultiProtocolApp.test.js.map +1 -0
- package/dist/aws/s3.d.ts +22 -0
- package/dist/aws/s3.d.ts.map +1 -0
- package/dist/aws/s3.js +69 -0
- package/dist/aws/s3.js.map +1 -0
- package/dist/aws/validator.d.ts +22 -0
- package/dist/aws/validator.d.ts.map +1 -0
- package/dist/aws/validator.js +99 -0
- package/dist/aws/validator.js.map +1 -0
- package/dist/block-explorer/etherscan.d.ts +142 -0
- package/dist/block-explorer/etherscan.d.ts.map +1 -0
- package/dist/block-explorer/etherscan.js +307 -0
- package/dist/block-explorer/etherscan.js.map +1 -0
- package/dist/block-explorer/etherscan.test.d.ts +2 -0
- package/dist/block-explorer/etherscan.test.d.ts.map +1 -0
- package/dist/block-explorer/etherscan.test.js +359 -0
- package/dist/block-explorer/etherscan.test.js.map +1 -0
- package/dist/block-explorer/testFixtures.d.ts +8 -0
- package/dist/block-explorer/testFixtures.d.ts.map +1 -0
- package/dist/block-explorer/testFixtures.js +18 -0
- package/dist/block-explorer/testFixtures.js.map +1 -0
- package/dist/block-explorer/utils.d.ts +11 -0
- package/dist/block-explorer/utils.d.ts.map +1 -0
- package/dist/block-explorer/utils.js +32 -0
- package/dist/block-explorer/utils.js.map +1 -0
- package/dist/ccip/HyperlaneCCIPDeployer.d.ts +18 -0
- package/dist/ccip/HyperlaneCCIPDeployer.d.ts.map +1 -0
- package/dist/ccip/HyperlaneCCIPDeployer.js +122 -0
- package/dist/ccip/HyperlaneCCIPDeployer.js.map +1 -0
- package/dist/ccip/consts.d.ts +24 -0
- package/dist/ccip/consts.d.ts.map +1 -0
- package/dist/ccip/consts.js +491 -0
- package/dist/ccip/consts.js.map +1 -0
- package/dist/ccip/utils.d.ts +46 -0
- package/dist/ccip/utils.d.ts.map +1 -0
- package/dist/ccip/utils.js +95 -0
- package/dist/ccip/utils.js.map +1 -0
- package/dist/consts/bytecode.d.ts +14 -0
- package/dist/consts/bytecode.d.ts.map +1 -0
- package/dist/consts/bytecode.js +15 -0
- package/dist/consts/bytecode.js.map +1 -0
- package/dist/consts/concurrency.d.ts +2 -0
- package/dist/consts/concurrency.d.ts.map +1 -0
- package/dist/consts/concurrency.js +2 -0
- package/dist/consts/concurrency.js.map +1 -0
- package/dist/consts/igp.d.ts +12 -0
- package/dist/consts/igp.d.ts.map +1 -0
- package/dist/consts/igp.js +40 -0
- package/dist/consts/igp.js.map +1 -0
- package/dist/consts/mailbox.d.ts +2 -0
- package/dist/consts/mailbox.d.ts.map +1 -0
- package/dist/consts/mailbox.js +3 -0
- package/dist/consts/mailbox.js.map +1 -0
- package/dist/consts/multisigIsm.d.ts +5 -0
- package/dist/consts/multisigIsm.d.ts.map +1 -0
- package/dist/consts/multisigIsm.js +847 -0
- package/dist/consts/multisigIsm.js.map +1 -0
- package/dist/consts/multisigIsm.test.d.ts +2 -0
- package/dist/consts/multisigIsm.test.d.ts.map +1 -0
- package/dist/consts/multisigIsm.test.js +40 -0
- package/dist/consts/multisigIsm.test.js.map +1 -0
- package/dist/consts/multisigIsmVerifyCosts.d.ts +210 -0
- package/dist/consts/multisigIsmVerifyCosts.d.ts.map +1 -0
- package/dist/consts/multisigIsmVerifyCosts.js +210 -0
- package/dist/consts/multisigIsmVerifyCosts.js.map +1 -0
- package/dist/consts/numbers.d.ts +2 -0
- package/dist/consts/numbers.d.ts.map +1 -0
- package/dist/consts/numbers.js +3 -0
- package/dist/consts/numbers.js.map +1 -0
- package/dist/consts/recoilLinkFees.d.ts +6 -0
- package/dist/consts/recoilLinkFees.d.ts.map +1 -0
- package/dist/consts/recoilLinkFees.js +17 -0
- package/dist/consts/recoilLinkFees.js.map +1 -0
- package/dist/consts/registry.d.ts +2 -0
- package/dist/consts/registry.d.ts.map +1 -0
- package/dist/consts/registry.js +5 -0
- package/dist/consts/registry.js.map +1 -0
- package/dist/consts/sealevel.d.ts +7 -0
- package/dist/consts/sealevel.d.ts.map +1 -0
- package/dist/consts/sealevel.js +8 -0
- package/dist/consts/sealevel.js.map +1 -0
- package/dist/consts/testChains.d.ts +30 -0
- package/dist/consts/testChains.d.ts.map +1 -0
- package/dist/consts/testChains.js +244 -0
- package/dist/consts/testChains.js.map +1 -0
- package/dist/contracts/contracts.d.ts +40 -0
- package/dist/contracts/contracts.d.ts.map +1 -0
- package/dist/contracts/contracts.hardhat-test.d.ts +2 -0
- package/dist/contracts/contracts.hardhat-test.d.ts.map +1 -0
- package/dist/contracts/contracts.hardhat-test.js +34 -0
- package/dist/contracts/contracts.hardhat-test.js.map +1 -0
- package/dist/contracts/contracts.js +201 -0
- package/dist/contracts/contracts.js.map +1 -0
- package/dist/contracts/contracts.test.d.ts +2 -0
- package/dist/contracts/contracts.test.d.ts.map +1 -0
- package/dist/contracts/contracts.test.js +88 -0
- package/dist/contracts/contracts.test.js.map +1 -0
- package/dist/contracts/types.d.ts +18 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +2 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/core/AbstractHyperlaneModule.d.ts +18 -0
- package/dist/core/AbstractHyperlaneModule.d.ts.map +1 -0
- package/dist/core/AbstractHyperlaneModule.js +10 -0
- package/dist/core/AbstractHyperlaneModule.js.map +1 -0
- package/dist/core/CoreDeployer.hardhat-test.d.ts +2 -0
- package/dist/core/CoreDeployer.hardhat-test.d.ts.map +1 -0
- package/dist/core/CoreDeployer.hardhat-test.js +234 -0
- package/dist/core/CoreDeployer.hardhat-test.js.map +1 -0
- package/dist/core/EvmCoreModule.d.ts +119 -0
- package/dist/core/EvmCoreModule.d.ts.map +1 -0
- package/dist/core/EvmCoreModule.hardhat-test.d.ts +2 -0
- package/dist/core/EvmCoreModule.hardhat-test.d.ts.map +1 -0
- package/dist/core/EvmCoreModule.hardhat-test.js +364 -0
- package/dist/core/EvmCoreModule.hardhat-test.js.map +1 -0
- package/dist/core/EvmCoreModule.js +339 -0
- package/dist/core/EvmCoreModule.js.map +1 -0
- package/dist/core/EvmCoreReader.d.ts +38 -0
- package/dist/core/EvmCoreReader.d.ts.map +1 -0
- package/dist/core/EvmCoreReader.js +92 -0
- package/dist/core/EvmCoreReader.js.map +1 -0
- package/dist/core/EvmIcaModule.d.ts +43 -0
- package/dist/core/EvmIcaModule.d.ts.map +1 -0
- package/dist/core/EvmIcaModule.hardhat-test.d.ts +2 -0
- package/dist/core/EvmIcaModule.hardhat-test.d.ts.map +1 -0
- package/dist/core/EvmIcaModule.hardhat-test.js +211 -0
- package/dist/core/EvmIcaModule.hardhat-test.js.map +1 -0
- package/dist/core/EvmIcaModule.js +143 -0
- package/dist/core/EvmIcaModule.js.map +1 -0
- package/dist/core/HyperlaneCore.d.ts +78 -0
- package/dist/core/HyperlaneCore.d.ts.map +1 -0
- package/dist/core/HyperlaneCore.js +296 -0
- package/dist/core/HyperlaneCore.js.map +1 -0
- package/dist/core/HyperlaneCore.test.d.ts +2 -0
- package/dist/core/HyperlaneCore.test.d.ts.map +1 -0
- package/dist/core/HyperlaneCore.test.js +12 -0
- package/dist/core/HyperlaneCore.test.js.map +1 -0
- package/dist/core/HyperlaneCoreChecker.d.ts +18 -0
- package/dist/core/HyperlaneCoreChecker.d.ts.map +1 -0
- package/dist/core/HyperlaneCoreChecker.js +171 -0
- package/dist/core/HyperlaneCoreChecker.js.map +1 -0
- package/dist/core/HyperlaneCoreDeployer.d.ts +36 -0
- package/dist/core/HyperlaneCoreDeployer.d.ts.map +1 -0
- package/dist/core/HyperlaneCoreDeployer.js +162 -0
- package/dist/core/HyperlaneCoreDeployer.js.map +1 -0
- package/dist/core/MultiProtocolCore.d.ts +21 -0
- package/dist/core/MultiProtocolCore.d.ts.map +1 -0
- package/dist/core/MultiProtocolCore.js +49 -0
- package/dist/core/MultiProtocolCore.js.map +1 -0
- package/dist/core/MultiProtocolCore.test.d.ts +2 -0
- package/dist/core/MultiProtocolCore.test.d.ts.map +1 -0
- package/dist/core/MultiProtocolCore.test.js +27 -0
- package/dist/core/MultiProtocolCore.test.js.map +1 -0
- package/dist/core/TestCoreApp.d.ts +17 -0
- package/dist/core/TestCoreApp.d.ts.map +1 -0
- package/dist/core/TestCoreApp.js +49 -0
- package/dist/core/TestCoreApp.js.map +1 -0
- package/dist/core/TestCoreDeployer.d.ts +10 -0
- package/dist/core/TestCoreDeployer.d.ts.map +1 -0
- package/dist/core/TestCoreDeployer.js +13 -0
- package/dist/core/TestCoreDeployer.js.map +1 -0
- package/dist/core/TestRecipientDeployer.d.ts +22 -0
- package/dist/core/TestRecipientDeployer.d.ts.map +1 -0
- package/dist/core/TestRecipientDeployer.js +30 -0
- package/dist/core/TestRecipientDeployer.js.map +1 -0
- package/dist/core/adapters/AleoCoreAdapter.d.ts +23 -0
- package/dist/core/adapters/AleoCoreAdapter.d.ts.map +1 -0
- package/dist/core/adapters/AleoCoreAdapter.js +72 -0
- package/dist/core/adapters/AleoCoreAdapter.js.map +1 -0
- package/dist/core/adapters/CosmNativeCoreAdapter.d.ts +23 -0
- package/dist/core/adapters/CosmNativeCoreAdapter.d.ts.map +1 -0
- package/dist/core/adapters/CosmNativeCoreAdapter.js +65 -0
- package/dist/core/adapters/CosmNativeCoreAdapter.js.map +1 -0
- package/dist/core/adapters/CosmWasmCoreAdapter.d.ts +40 -0
- package/dist/core/adapters/CosmWasmCoreAdapter.d.ts.map +1 -0
- package/dist/core/adapters/CosmWasmCoreAdapter.js +145 -0
- package/dist/core/adapters/CosmWasmCoreAdapter.js.map +1 -0
- package/dist/core/adapters/CosmWasmCoreAdapter.test.d.ts +2 -0
- package/dist/core/adapters/CosmWasmCoreAdapter.test.d.ts.map +1 -0
- package/dist/core/adapters/CosmWasmCoreAdapter.test.js +31 -0
- package/dist/core/adapters/CosmWasmCoreAdapter.test.js.map +1 -0
- package/dist/core/adapters/CosmWasmIgpAdapter.d.ts +27 -0
- package/dist/core/adapters/CosmWasmIgpAdapter.d.ts.map +1 -0
- package/dist/core/adapters/CosmWasmIgpAdapter.js +92 -0
- package/dist/core/adapters/CosmWasmIgpAdapter.js.map +1 -0
- package/dist/core/adapters/EvmCoreAdapter.d.ts +25 -0
- package/dist/core/adapters/EvmCoreAdapter.d.ts.map +1 -0
- package/dist/core/adapters/EvmCoreAdapter.js +44 -0
- package/dist/core/adapters/EvmCoreAdapter.js.map +1 -0
- package/dist/core/adapters/RadixCoreAdapter.d.ts +23 -0
- package/dist/core/adapters/RadixCoreAdapter.d.ts.map +1 -0
- package/dist/core/adapters/RadixCoreAdapter.js +58 -0
- package/dist/core/adapters/RadixCoreAdapter.js.map +1 -0
- package/dist/core/adapters/SealevelCoreAdapter.d.ts +56 -0
- package/dist/core/adapters/SealevelCoreAdapter.d.ts.map +1 -0
- package/dist/core/adapters/SealevelCoreAdapter.js +191 -0
- package/dist/core/adapters/SealevelCoreAdapter.js.map +1 -0
- package/dist/core/adapters/SealevelCoreAdapter.test.d.ts +2 -0
- package/dist/core/adapters/SealevelCoreAdapter.test.d.ts.map +1 -0
- package/dist/core/adapters/SealevelCoreAdapter.test.js +33 -0
- package/dist/core/adapters/SealevelCoreAdapter.test.js.map +1 -0
- package/dist/core/adapters/StarknetCoreAdapter.d.ts +23 -0
- package/dist/core/adapters/StarknetCoreAdapter.d.ts.map +1 -0
- package/dist/core/adapters/StarknetCoreAdapter.js +70 -0
- package/dist/core/adapters/StarknetCoreAdapter.js.map +1 -0
- package/dist/core/adapters/types.d.ts +19 -0
- package/dist/core/adapters/types.d.ts.map +1 -0
- package/dist/core/adapters/types.js +2 -0
- package/dist/core/adapters/types.js.map +1 -0
- package/dist/core/contracts.d.ts +15 -0
- package/dist/core/contracts.d.ts.map +1 -0
- package/dist/core/contracts.js +13 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/events.d.ts +4 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/testHyperlaneDeploy.hardhat-test.d.ts +3 -0
- package/dist/core/testHyperlaneDeploy.hardhat-test.d.ts.map +1 -0
- package/dist/core/testHyperlaneDeploy.hardhat-test.js +56 -0
- package/dist/core/testHyperlaneDeploy.hardhat-test.js.map +1 -0
- package/dist/core/types.d.ts +173 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +118 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/types.test.d.ts +2 -0
- package/dist/core/types.test.d.ts.map +1 -0
- package/dist/core/types.test.js +205 -0
- package/dist/core/types.test.js.map +1 -0
- package/dist/cw-types/Cw20Base.types.d.ts +198 -0
- package/dist/cw-types/Cw20Base.types.d.ts.map +1 -0
- package/dist/cw-types/Cw20Base.types.js +7 -0
- package/dist/cw-types/Cw20Base.types.js.map +1 -0
- package/dist/cw-types/HookAggregate.types.d.ts +79 -0
- package/dist/cw-types/HookAggregate.types.d.ts.map +1 -0
- package/dist/cw-types/HookAggregate.types.js +7 -0
- package/dist/cw-types/HookAggregate.types.js.map +1 -0
- package/dist/cw-types/HookMerkle.types.d.ts +163 -0
- package/dist/cw-types/HookMerkle.types.d.ts.map +1 -0
- package/dist/cw-types/HookMerkle.types.js +7 -0
- package/dist/cw-types/HookMerkle.types.js.map +1 -0
- package/dist/cw-types/HookPausable.types.d.ts +82 -0
- package/dist/cw-types/HookPausable.types.d.ts.map +1 -0
- package/dist/cw-types/HookPausable.types.js +7 -0
- package/dist/cw-types/HookPausable.types.js.map +1 -0
- package/dist/cw-types/HookRouting.types.d.ts +109 -0
- package/dist/cw-types/HookRouting.types.d.ts.map +1 -0
- package/dist/cw-types/HookRouting.types.js +7 -0
- package/dist/cw-types/HookRouting.types.js.map +1 -0
- package/dist/cw-types/HookRoutingCustom.types.d.ts +149 -0
- package/dist/cw-types/HookRoutingCustom.types.d.ts.map +1 -0
- package/dist/cw-types/HookRoutingCustom.types.js +7 -0
- package/dist/cw-types/HookRoutingCustom.types.js.map +1 -0
- package/dist/cw-types/HookRoutingFallback.types.d.ts +113 -0
- package/dist/cw-types/HookRoutingFallback.types.d.ts.map +1 -0
- package/dist/cw-types/HookRoutingFallback.types.js +7 -0
- package/dist/cw-types/HookRoutingFallback.types.js.map +1 -0
- package/dist/cw-types/Igp.types.d.ts +184 -0
- package/dist/cw-types/Igp.types.d.ts.map +1 -0
- package/dist/cw-types/Igp.types.js +7 -0
- package/dist/cw-types/Igp.types.js.map +1 -0
- package/dist/cw-types/IgpOracle.types.d.ts +61 -0
- package/dist/cw-types/IgpOracle.types.d.ts.map +1 -0
- package/dist/cw-types/IgpOracle.types.js +7 -0
- package/dist/cw-types/IgpOracle.types.js.map +1 -0
- package/dist/cw-types/IsmAggregate.types.d.ts +76 -0
- package/dist/cw-types/IsmAggregate.types.d.ts.map +1 -0
- package/dist/cw-types/IsmAggregate.types.js +7 -0
- package/dist/cw-types/IsmAggregate.types.js.map +1 -0
- package/dist/cw-types/IsmMultisig.types.d.ts +102 -0
- package/dist/cw-types/IsmMultisig.types.d.ts.map +1 -0
- package/dist/cw-types/IsmMultisig.types.js +7 -0
- package/dist/cw-types/IsmMultisig.types.js.map +1 -0
- package/dist/cw-types/IsmRouting.types.d.ts +81 -0
- package/dist/cw-types/IsmRouting.types.d.ts.map +1 -0
- package/dist/cw-types/IsmRouting.types.js +7 -0
- package/dist/cw-types/IsmRouting.types.js.map +1 -0
- package/dist/cw-types/Mailbox.types.d.ts +131 -0
- package/dist/cw-types/Mailbox.types.d.ts.map +1 -0
- package/dist/cw-types/Mailbox.types.js +7 -0
- package/dist/cw-types/Mailbox.types.js.map +1 -0
- package/dist/cw-types/ValidatorAnnounce.types.d.ts +31 -0
- package/dist/cw-types/ValidatorAnnounce.types.d.ts.map +1 -0
- package/dist/cw-types/ValidatorAnnounce.types.js +7 -0
- package/dist/cw-types/ValidatorAnnounce.types.js.map +1 -0
- package/dist/cw-types/WarpCw20.types.d.ts +217 -0
- package/dist/cw-types/WarpCw20.types.d.ts.map +1 -0
- package/dist/cw-types/WarpCw20.types.js +7 -0
- package/dist/cw-types/WarpCw20.types.js.map +1 -0
- package/dist/cw-types/WarpNative.types.d.ts +197 -0
- package/dist/cw-types/WarpNative.types.d.ts.map +1 -0
- package/dist/cw-types/WarpNative.types.js +7 -0
- package/dist/cw-types/WarpNative.types.js.map +1 -0
- package/dist/deploy/HyperlaneAppChecker.d.ts +32 -0
- package/dist/deploy/HyperlaneAppChecker.d.ts.map +1 -0
- package/dist/deploy/HyperlaneAppChecker.js +220 -0
- package/dist/deploy/HyperlaneAppChecker.js.map +1 -0
- package/dist/deploy/HyperlaneDeployer.d.ts +83 -0
- package/dist/deploy/HyperlaneDeployer.d.ts.map +1 -0
- package/dist/deploy/HyperlaneDeployer.js +434 -0
- package/dist/deploy/HyperlaneDeployer.js.map +1 -0
- package/dist/deploy/HyperlaneProxyFactoryDeployer.d.ts +11 -0
- package/dist/deploy/HyperlaneProxyFactoryDeployer.d.ts.map +1 -0
- package/dist/deploy/HyperlaneProxyFactoryDeployer.js +48 -0
- package/dist/deploy/HyperlaneProxyFactoryDeployer.js.map +1 -0
- package/dist/deploy/contracts.d.ts +16 -0
- package/dist/deploy/contracts.d.ts.map +1 -0
- package/dist/deploy/contracts.js +25 -0
- package/dist/deploy/contracts.js.map +1 -0
- package/dist/deploy/proxy.d.ts +52 -0
- package/dist/deploy/proxy.d.ts.map +1 -0
- package/dist/deploy/proxy.js +153 -0
- package/dist/deploy/proxy.js.map +1 -0
- package/dist/deploy/proxy.test.d.ts +2 -0
- package/dist/deploy/proxy.test.d.ts.map +1 -0
- package/dist/deploy/proxy.test.js +168 -0
- package/dist/deploy/proxy.test.js.map +1 -0
- package/dist/deploy/proxyFactoryUtils.d.ts +7 -0
- package/dist/deploy/proxyFactoryUtils.d.ts.map +1 -0
- package/dist/deploy/proxyFactoryUtils.js +12 -0
- package/dist/deploy/proxyFactoryUtils.js.map +1 -0
- package/dist/deploy/types.d.ts +69 -0
- package/dist/deploy/types.d.ts.map +1 -0
- package/dist/deploy/types.js +22 -0
- package/dist/deploy/types.js.map +1 -0
- package/dist/deploy/utils.d.ts +15 -0
- package/dist/deploy/utils.d.ts.map +1 -0
- package/dist/deploy/utils.js +28 -0
- package/dist/deploy/utils.js.map +1 -0
- package/dist/deploy/verify/BaseContractVerifier.d.ts +23 -0
- package/dist/deploy/verify/BaseContractVerifier.d.ts.map +1 -0
- package/dist/deploy/verify/BaseContractVerifier.js +128 -0
- package/dist/deploy/verify/BaseContractVerifier.js.map +1 -0
- package/dist/deploy/verify/ContractVerifier.d.ts +30 -0
- package/dist/deploy/verify/ContractVerifier.d.ts.map +1 -0
- package/dist/deploy/verify/ContractVerifier.js +125 -0
- package/dist/deploy/verify/ContractVerifier.js.map +1 -0
- package/dist/deploy/verify/PostDeploymentContractVerifier.d.ts +15 -0
- package/dist/deploy/verify/PostDeploymentContractVerifier.d.ts.map +1 -0
- package/dist/deploy/verify/PostDeploymentContractVerifier.js +45 -0
- package/dist/deploy/verify/PostDeploymentContractVerifier.js.map +1 -0
- package/dist/deploy/verify/ZKSyncContractVerifier.d.ts +50 -0
- package/dist/deploy/verify/ZKSyncContractVerifier.d.ts.map +1 -0
- package/dist/deploy/verify/ZKSyncContractVerifier.js +99 -0
- package/dist/deploy/verify/ZKSyncContractVerifier.js.map +1 -0
- package/dist/deploy/verify/types.d.ts +47 -0
- package/dist/deploy/verify/types.d.ts.map +1 -0
- package/dist/deploy/verify/types.js +7 -0
- package/dist/deploy/verify/types.js.map +1 -0
- package/dist/deploy/verify/utils.d.ts +81 -0
- package/dist/deploy/verify/utils.d.ts.map +1 -0
- package/dist/deploy/verify/utils.js +208 -0
- package/dist/deploy/verify/utils.js.map +1 -0
- package/dist/deploy/verify/utils.test.d.ts +2 -0
- package/dist/deploy/verify/utils.test.d.ts.map +1 -0
- package/dist/deploy/verify/utils.test.js +49 -0
- package/dist/deploy/verify/utils.test.js.map +1 -0
- package/dist/deploy/warp.d.ts +150 -0
- package/dist/deploy/warp.d.ts.map +1 -0
- package/dist/deploy/warp.js +1280 -0
- package/dist/deploy/warp.js.map +1 -0
- package/dist/deploy/warp.test.d.ts +2 -0
- package/dist/deploy/warp.test.d.ts.map +1 -0
- package/dist/deploy/warp.test.js +419 -0
- package/dist/deploy/warp.test.js.map +1 -0
- package/dist/deploy/warpHybridPlan.d.ts +104 -0
- package/dist/deploy/warpHybridPlan.d.ts.map +1 -0
- package/dist/deploy/warpHybridPlan.js +178 -0
- package/dist/deploy/warpHybridPlan.js.map +1 -0
- package/dist/deploy/warpHybridPlan.test.d.ts +2 -0
- package/dist/deploy/warpHybridPlan.test.d.ts.map +1 -0
- package/dist/deploy/warpHybridPlan.test.js +141 -0
- package/dist/deploy/warpHybridPlan.test.js.map +1 -0
- package/dist/fee/EvmTokenFeeDeployer.d.ts +20 -0
- package/dist/fee/EvmTokenFeeDeployer.d.ts.map +1 -0
- package/dist/fee/EvmTokenFeeDeployer.hardhat-test.d.ts +2 -0
- package/dist/fee/EvmTokenFeeDeployer.hardhat-test.d.ts.map +1 -0
- package/dist/fee/EvmTokenFeeDeployer.hardhat-test.js +353 -0
- package/dist/fee/EvmTokenFeeDeployer.hardhat-test.js.map +1 -0
- package/dist/fee/EvmTokenFeeDeployer.js +143 -0
- package/dist/fee/EvmTokenFeeDeployer.js.map +1 -0
- package/dist/fee/EvmTokenFeeModule.d.ts +63 -0
- package/dist/fee/EvmTokenFeeModule.d.ts.map +1 -0
- package/dist/fee/EvmTokenFeeModule.hardhat-test.d.ts +2 -0
- package/dist/fee/EvmTokenFeeModule.hardhat-test.d.ts.map +1 -0
- package/dist/fee/EvmTokenFeeModule.hardhat-test.js +942 -0
- package/dist/fee/EvmTokenFeeModule.hardhat-test.js.map +1 -0
- package/dist/fee/EvmTokenFeeModule.js +583 -0
- package/dist/fee/EvmTokenFeeModule.js.map +1 -0
- package/dist/fee/EvmTokenFeeReader.d.ts +38 -0
- package/dist/fee/EvmTokenFeeReader.d.ts.map +1 -0
- package/dist/fee/EvmTokenFeeReader.hardhat-test.d.ts +4 -0
- package/dist/fee/EvmTokenFeeReader.hardhat-test.d.ts.map +1 -0
- package/dist/fee/EvmTokenFeeReader.hardhat-test.js +371 -0
- package/dist/fee/EvmTokenFeeReader.hardhat-test.js.map +1 -0
- package/dist/fee/EvmTokenFeeReader.js +200 -0
- package/dist/fee/EvmTokenFeeReader.js.map +1 -0
- package/dist/fee/contracts.d.ts +11 -0
- package/dist/fee/contracts.d.ts.map +1 -0
- package/dist/fee/contracts.js +11 -0
- package/dist/fee/contracts.js.map +1 -0
- package/dist/fee/crossCollateralUtils.d.ts +8 -0
- package/dist/fee/crossCollateralUtils.d.ts.map +1 -0
- package/dist/fee/crossCollateralUtils.js +49 -0
- package/dist/fee/crossCollateralUtils.js.map +1 -0
- package/dist/fee/feeConfigMapping.d.ts +9 -0
- package/dist/fee/feeConfigMapping.d.ts.map +1 -0
- package/dist/fee/feeConfigMapping.js +87 -0
- package/dist/fee/feeConfigMapping.js.map +1 -0
- package/dist/fee/feeConfigMapping.test.d.ts +2 -0
- package/dist/fee/feeConfigMapping.test.d.ts.map +1 -0
- package/dist/fee/feeConfigMapping.test.js +204 -0
- package/dist/fee/feeConfigMapping.test.js.map +1 -0
- package/dist/fee/types.d.ts +295 -0
- package/dist/fee/types.d.ts.map +1 -0
- package/dist/fee/types.js +238 -0
- package/dist/fee/types.js.map +1 -0
- package/dist/fee/types.test.d.ts +2 -0
- package/dist/fee/types.test.d.ts.map +1 -0
- package/dist/fee/types.test.js +204 -0
- package/dist/fee/types.test.js.map +1 -0
- package/dist/fee/utils.d.ts +9 -0
- package/dist/fee/utils.d.ts.map +1 -0
- package/dist/fee/utils.js +9 -0
- package/dist/fee/utils.js.map +1 -0
- package/dist/fee/utils.test.d.ts +2 -0
- package/dist/fee/utils.test.d.ts.map +1 -0
- package/dist/fee/utils.test.js +54 -0
- package/dist/fee/utils.test.js.map +1 -0
- package/dist/fork/types.d.ts +354 -0
- package/dist/fork/types.d.ts.map +1 -0
- package/dist/fork/types.js +142 -0
- package/dist/fork/types.js.map +1 -0
- package/dist/gas/HyperlaneIgp.d.ts +53 -0
- package/dist/gas/HyperlaneIgp.d.ts.map +1 -0
- package/dist/gas/HyperlaneIgp.js +64 -0
- package/dist/gas/HyperlaneIgp.js.map +1 -0
- package/dist/gas/HyperlaneIgpChecker.d.ts +13 -0
- package/dist/gas/HyperlaneIgpChecker.d.ts.map +1 -0
- package/dist/gas/HyperlaneIgpChecker.js +162 -0
- package/dist/gas/HyperlaneIgpChecker.js.map +1 -0
- package/dist/gas/HyperlaneIgpDeployer.d.ts +32 -0
- package/dist/gas/HyperlaneIgpDeployer.d.ts.map +1 -0
- package/dist/gas/HyperlaneIgpDeployer.js +248 -0
- package/dist/gas/HyperlaneIgpDeployer.js.map +1 -0
- package/dist/gas/adapters/SealevelIgpAdapter.d.ts +93 -0
- package/dist/gas/adapters/SealevelIgpAdapter.d.ts.map +1 -0
- package/dist/gas/adapters/SealevelIgpAdapter.js +294 -0
- package/dist/gas/adapters/SealevelIgpAdapter.js.map +1 -0
- package/dist/gas/adapters/SealevelIgpAdapter.test.d.ts +2 -0
- package/dist/gas/adapters/SealevelIgpAdapter.test.d.ts.map +1 -0
- package/dist/gas/adapters/SealevelIgpAdapter.test.js +189 -0
- package/dist/gas/adapters/SealevelIgpAdapter.test.js.map +1 -0
- package/dist/gas/adapters/serialization.d.ts +180 -0
- package/dist/gas/adapters/serialization.d.ts.map +1 -0
- package/dist/gas/adapters/serialization.js +409 -0
- package/dist/gas/adapters/serialization.js.map +1 -0
- package/dist/gas/adapters/serialization.test.d.ts +2 -0
- package/dist/gas/adapters/serialization.test.d.ts.map +1 -0
- package/dist/gas/adapters/serialization.test.js +87 -0
- package/dist/gas/adapters/serialization.test.js.map +1 -0
- package/dist/gas/contracts.d.ts +8 -0
- package/dist/gas/contracts.d.ts.map +1 -0
- package/dist/gas/contracts.js +7 -0
- package/dist/gas/contracts.js.map +1 -0
- package/dist/gas/oracle/configure-gas-oracles.hardhat-test.d.ts +2 -0
- package/dist/gas/oracle/configure-gas-oracles.hardhat-test.d.ts.map +1 -0
- package/dist/gas/oracle/configure-gas-oracles.hardhat-test.js +82 -0
- package/dist/gas/oracle/configure-gas-oracles.hardhat-test.js.map +1 -0
- package/dist/gas/oracle/types.d.ts +42 -0
- package/dist/gas/oracle/types.d.ts.map +1 -0
- package/dist/gas/oracle/types.js +45 -0
- package/dist/gas/oracle/types.js.map +1 -0
- package/dist/gas/token-prices.d.ts +58 -0
- package/dist/gas/token-prices.d.ts.map +1 -0
- package/dist/gas/token-prices.js +199 -0
- package/dist/gas/token-prices.js.map +1 -0
- package/dist/gas/token-prices.test.d.ts +2 -0
- package/dist/gas/token-prices.test.d.ts.map +1 -0
- package/dist/gas/token-prices.test.js +96 -0
- package/dist/gas/token-prices.test.js.map +1 -0
- package/dist/gas/types.d.ts +50 -0
- package/dist/gas/types.d.ts.map +1 -0
- package/dist/gas/types.js +26 -0
- package/dist/gas/types.js.map +1 -0
- package/dist/gas/utils.d.ts +34 -0
- package/dist/gas/utils.d.ts.map +1 -0
- package/dist/gas/utils.js +246 -0
- package/dist/gas/utils.js.map +1 -0
- package/dist/gas/utils.test.d.ts +2 -0
- package/dist/gas/utils.test.d.ts.map +1 -0
- package/dist/gas/utils.test.js +132 -0
- package/dist/gas/utils.test.js.map +1 -0
- package/dist/gcp/storage.d.ts +28 -0
- package/dist/gcp/storage.d.ts.map +1 -0
- package/dist/gcp/storage.js +88 -0
- package/dist/gcp/storage.js.map +1 -0
- package/dist/gcp/validator.d.ts +22 -0
- package/dist/gcp/validator.d.ts.map +1 -0
- package/dist/gcp/validator.js +107 -0
- package/dist/gcp/validator.js.map +1 -0
- package/dist/hook/EvmHookModule.d.ts +161 -0
- package/dist/hook/EvmHookModule.d.ts.map +1 -0
- package/dist/hook/EvmHookModule.hardhat-test.d.ts +2 -0
- package/dist/hook/EvmHookModule.hardhat-test.d.ts.map +1 -0
- package/dist/hook/EvmHookModule.hardhat-test.js +1004 -0
- package/dist/hook/EvmHookModule.hardhat-test.js.map +1 -0
- package/dist/hook/EvmHookModule.js +932 -0
- package/dist/hook/EvmHookModule.js.map +1 -0
- package/dist/hook/EvmHookReader.d.ts +81 -0
- package/dist/hook/EvmHookReader.d.ts.map +1 -0
- package/dist/hook/EvmHookReader.js +630 -0
- package/dist/hook/EvmHookReader.js.map +1 -0
- package/dist/hook/EvmHookReader.test.d.ts +2 -0
- package/dist/hook/EvmHookReader.test.d.ts.map +1 -0
- package/dist/hook/EvmHookReader.test.js +647 -0
- package/dist/hook/EvmHookReader.test.js.map +1 -0
- package/dist/hook/HyperlaneHookDeployer.d.ts +70 -0
- package/dist/hook/HyperlaneHookDeployer.d.ts.map +1 -0
- package/dist/hook/HyperlaneHookDeployer.hardhat-test.d.ts +2 -0
- package/dist/hook/HyperlaneHookDeployer.hardhat-test.d.ts.map +1 -0
- package/dist/hook/HyperlaneHookDeployer.hardhat-test.js +322 -0
- package/dist/hook/HyperlaneHookDeployer.hardhat-test.js.map +1 -0
- package/dist/hook/HyperlaneHookDeployer.js +538 -0
- package/dist/hook/HyperlaneHookDeployer.js.map +1 -0
- package/dist/hook/contracts.d.ts +20 -0
- package/dist/hook/contracts.d.ts.map +1 -0
- package/dist/hook/contracts.js +18 -0
- package/dist/hook/contracts.js.map +1 -0
- package/dist/hook/types.d.ts +262 -0
- package/dist/hook/types.d.ts.map +1 -0
- package/dist/hook/types.js +341 -0
- package/dist/hook/types.js.map +1 -0
- package/dist/hook/types.test.d.ts +2 -0
- package/dist/hook/types.test.d.ts.map +1 -0
- package/dist/hook/types.test.js +227 -0
- package/dist/hook/types.test.js.map +1 -0
- package/dist/hook/updates.d.ts +33 -0
- package/dist/hook/updates.d.ts.map +1 -0
- package/dist/hook/updates.js +35 -0
- package/dist/hook/updates.js.map +1 -0
- package/dist/hook/utils.d.ts +58 -0
- package/dist/hook/utils.d.ts.map +1 -0
- package/dist/hook/utils.hardhat-test.d.ts +2 -0
- package/dist/hook/utils.hardhat-test.d.ts.map +1 -0
- package/dist/hook/utils.hardhat-test.js +119 -0
- package/dist/hook/utils.hardhat-test.js.map +1 -0
- package/dist/hook/utils.js +157 -0
- package/dist/hook/utils.js.map +1 -0
- package/dist/ica/EvmIcaReader.d.ts +7 -0
- package/dist/ica/EvmIcaReader.d.ts.map +1 -0
- package/dist/ica/EvmIcaReader.hardhat-test.d.ts +2 -0
- package/dist/ica/EvmIcaReader.hardhat-test.d.ts.map +1 -0
- package/dist/ica/EvmIcaReader.hardhat-test.js +39 -0
- package/dist/ica/EvmIcaReader.hardhat-test.js.map +1 -0
- package/dist/ica/EvmIcaReader.js +32 -0
- package/dist/ica/EvmIcaReader.js.map +1 -0
- package/dist/ica/types.d.ts +88 -0
- package/dist/ica/types.d.ts.map +1 -0
- package/dist/ica/types.js +36 -0
- package/dist/ica/types.js.map +1 -0
- package/dist/index.d.ts +215 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +199 -0
- package/dist/index.js.map +1 -0
- package/dist/ism/EvmIsmModule.d.ts +106 -0
- package/dist/ism/EvmIsmModule.d.ts.map +1 -0
- package/dist/ism/EvmIsmModule.hardhat-test.d.ts +2 -0
- package/dist/ism/EvmIsmModule.hardhat-test.d.ts.map +1 -0
- package/dist/ism/EvmIsmModule.hardhat-test.js +1279 -0
- package/dist/ism/EvmIsmModule.hardhat-test.js.map +1 -0
- package/dist/ism/EvmIsmModule.js +709 -0
- package/dist/ism/EvmIsmModule.js.map +1 -0
- package/dist/ism/EvmIsmModule.test.d.ts +2 -0
- package/dist/ism/EvmIsmModule.test.d.ts.map +1 -0
- package/dist/ism/EvmIsmModule.test.js +309 -0
- package/dist/ism/EvmIsmModule.test.js.map +1 -0
- package/dist/ism/EvmIsmReader.d.ts +55 -0
- package/dist/ism/EvmIsmReader.d.ts.map +1 -0
- package/dist/ism/EvmIsmReader.js +555 -0
- package/dist/ism/EvmIsmReader.js.map +1 -0
- package/dist/ism/EvmIsmReader.test.d.ts +2 -0
- package/dist/ism/EvmIsmReader.test.d.ts.map +1 -0
- package/dist/ism/EvmIsmReader.test.js +931 -0
- package/dist/ism/EvmIsmReader.test.js.map +1 -0
- package/dist/ism/HyperlaneIsmFactory.d.ts +129 -0
- package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -0
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.d.ts +2 -0
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.d.ts.map +1 -0
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +1228 -0
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -0
- package/dist/ism/HyperlaneIsmFactory.js +867 -0
- package/dist/ism/HyperlaneIsmFactory.js.map +1 -0
- package/dist/ism/HyperlaneIsmFactory.test.d.ts +2 -0
- package/dist/ism/HyperlaneIsmFactory.test.d.ts.map +1 -0
- package/dist/ism/HyperlaneIsmFactory.test.js +98 -0
- package/dist/ism/HyperlaneIsmFactory.test.js.map +1 -0
- package/dist/ism/adapters/CosmWasmMultisigAdapter.d.ts +24 -0
- package/dist/ism/adapters/CosmWasmMultisigAdapter.d.ts.map +1 -0
- package/dist/ism/adapters/CosmWasmMultisigAdapter.js +74 -0
- package/dist/ism/adapters/CosmWasmMultisigAdapter.js.map +1 -0
- package/dist/ism/adapters/SealevelMultisigAdapter.d.ts +59 -0
- package/dist/ism/adapters/SealevelMultisigAdapter.d.ts.map +1 -0
- package/dist/ism/adapters/SealevelMultisigAdapter.js +133 -0
- package/dist/ism/adapters/SealevelMultisigAdapter.js.map +1 -0
- package/dist/ism/blacklist.d.ts +62 -0
- package/dist/ism/blacklist.d.ts.map +1 -0
- package/dist/ism/blacklist.js +98 -0
- package/dist/ism/blacklist.js.map +1 -0
- package/dist/ism/delayedFlow.d.ts +31 -0
- package/dist/ism/delayedFlow.d.ts.map +1 -0
- package/dist/ism/delayedFlow.js +33 -0
- package/dist/ism/delayedFlow.js.map +1 -0
- package/dist/ism/multisig.d.ts +6 -0
- package/dist/ism/multisig.d.ts.map +1 -0
- package/dist/ism/multisig.js +25 -0
- package/dist/ism/multisig.js.map +1 -0
- package/dist/ism/serialization.d.ts +74 -0
- package/dist/ism/serialization.d.ts.map +1 -0
- package/dist/ism/serialization.js +177 -0
- package/dist/ism/serialization.js.map +1 -0
- package/dist/ism/types.d.ts +384 -0
- package/dist/ism/types.d.ts.map +1 -0
- package/dist/ism/types.js +876 -0
- package/dist/ism/types.js.map +1 -0
- package/dist/ism/types.test.d.ts +2 -0
- package/dist/ism/types.test.d.ts.map +1 -0
- package/dist/ism/types.test.js +1269 -0
- package/dist/ism/types.test.js.map +1 -0
- package/dist/ism/utils.d.ts +44 -0
- package/dist/ism/utils.d.ts.map +1 -0
- package/dist/ism/utils.js +603 -0
- package/dist/ism/utils.js.map +1 -0
- package/dist/ism/utils.test.d.ts +2 -0
- package/dist/ism/utils.test.d.ts.map +1 -0
- package/dist/ism/utils.test.js +144 -0
- package/dist/ism/utils.test.js.map +1 -0
- package/dist/mailbox/serialization.d.ts +41 -0
- package/dist/mailbox/serialization.d.ts.map +1 -0
- package/dist/mailbox/serialization.js +104 -0
- package/dist/mailbox/serialization.js.map +1 -0
- package/dist/metadata/ChainMetadataManager.d.ts +233 -0
- package/dist/metadata/ChainMetadataManager.d.ts.map +1 -0
- package/dist/metadata/ChainMetadataManager.js +424 -0
- package/dist/metadata/ChainMetadataManager.js.map +1 -0
- package/dist/metadata/ChainMetadataManager.test.d.ts +2 -0
- package/dist/metadata/ChainMetadataManager.test.d.ts.map +1 -0
- package/dist/metadata/ChainMetadataManager.test.js +233 -0
- package/dist/metadata/ChainMetadataManager.test.js.map +1 -0
- package/dist/metadata/ChainMetadataResolver.d.ts +14 -0
- package/dist/metadata/ChainMetadataResolver.d.ts.map +1 -0
- package/dist/metadata/ChainMetadataResolver.js +57 -0
- package/dist/metadata/ChainMetadataResolver.js.map +1 -0
- package/dist/metadata/ChainMetadataResolver.test.d.ts +2 -0
- package/dist/metadata/ChainMetadataResolver.test.d.ts.map +1 -0
- package/dist/metadata/ChainMetadataResolver.test.js +87 -0
- package/dist/metadata/ChainMetadataResolver.test.js.map +1 -0
- package/dist/metadata/agentConfig.d.ts +1529 -0
- package/dist/metadata/agentConfig.d.ts.map +1 -0
- package/dist/metadata/agentConfig.js +750 -0
- package/dist/metadata/agentConfig.js.map +1 -0
- package/dist/metadata/agentConfig.test.d.ts +2 -0
- package/dist/metadata/agentConfig.test.d.ts.map +1 -0
- package/dist/metadata/agentConfig.test.js +457 -0
- package/dist/metadata/agentConfig.test.js.map +1 -0
- package/dist/metadata/blockExplorer.d.ts +11 -0
- package/dist/metadata/blockExplorer.d.ts.map +1 -0
- package/dist/metadata/blockExplorer.js +123 -0
- package/dist/metadata/blockExplorer.js.map +1 -0
- package/dist/metadata/blockExplorer.test.d.ts +2 -0
- package/dist/metadata/blockExplorer.test.d.ts.map +1 -0
- package/dist/metadata/blockExplorer.test.js +326 -0
- package/dist/metadata/blockExplorer.test.js.map +1 -0
- package/dist/metadata/chainIdUtils.d.ts +8 -0
- package/dist/metadata/chainIdUtils.d.ts.map +1 -0
- package/dist/metadata/chainIdUtils.js +33 -0
- package/dist/metadata/chainIdUtils.js.map +1 -0
- package/dist/metadata/chainIdUtils.test.d.ts +2 -0
- package/dist/metadata/chainIdUtils.test.d.ts.map +1 -0
- package/dist/metadata/chainIdUtils.test.js +45 -0
- package/dist/metadata/chainIdUtils.test.js.map +1 -0
- package/dist/metadata/chainMetadata.test.d.ts +2 -0
- package/dist/metadata/chainMetadata.test.d.ts.map +1 -0
- package/dist/metadata/chainMetadata.test.js +130 -0
- package/dist/metadata/chainMetadata.test.js.map +1 -0
- package/dist/metadata/chainMetadataConversion.d.ts +11 -0
- package/dist/metadata/chainMetadataConversion.d.ts.map +1 -0
- package/dist/metadata/chainMetadataConversion.js +119 -0
- package/dist/metadata/chainMetadataConversion.js.map +1 -0
- package/dist/metadata/chainMetadataTypes.d.ts +338 -0
- package/dist/metadata/chainMetadataTypes.d.ts.map +1 -0
- package/dist/metadata/chainMetadataTypes.js +373 -0
- package/dist/metadata/chainMetadataTypes.js.map +1 -0
- package/dist/metadata/customZodTypes.d.ts +44 -0
- package/dist/metadata/customZodTypes.d.ts.map +1 -0
- package/dist/metadata/customZodTypes.js +65 -0
- package/dist/metadata/customZodTypes.js.map +1 -0
- package/dist/metadata/deploymentArtifacts.d.ts +10 -0
- package/dist/metadata/deploymentArtifacts.d.ts.map +1 -0
- package/dist/metadata/deploymentArtifacts.js +10 -0
- package/dist/metadata/deploymentArtifacts.js.map +1 -0
- package/dist/metadata/forwardCompatibleEnum.test.d.ts +2 -0
- package/dist/metadata/forwardCompatibleEnum.test.d.ts.map +1 -0
- package/dist/metadata/forwardCompatibleEnum.test.js +299 -0
- package/dist/metadata/forwardCompatibleEnum.test.js.map +1 -0
- package/dist/metadata/matchingList.d.ts +25 -0
- package/dist/metadata/matchingList.d.ts.map +1 -0
- package/dist/metadata/matchingList.js +22 -0
- package/dist/metadata/matchingList.js.map +1 -0
- package/dist/metadata/warpRouteConfig.d.ts +83 -0
- package/dist/metadata/warpRouteConfig.d.ts.map +1 -0
- package/dist/metadata/warpRouteConfig.js +22 -0
- package/dist/metadata/warpRouteConfig.js.map +1 -0
- package/dist/middleware/account/InterchainAccount.d.ts +47 -0
- package/dist/middleware/account/InterchainAccount.d.ts.map +1 -0
- package/dist/middleware/account/InterchainAccount.js +324 -0
- package/dist/middleware/account/InterchainAccount.js.map +1 -0
- package/dist/middleware/account/InterchainAccount.test.d.ts +2 -0
- package/dist/middleware/account/InterchainAccount.test.d.ts.map +1 -0
- package/dist/middleware/account/InterchainAccount.test.js +733 -0
- package/dist/middleware/account/InterchainAccount.test.js.map +1 -0
- package/dist/middleware/account/InterchainAccountChecker.d.ts +7 -0
- package/dist/middleware/account/InterchainAccountChecker.d.ts.map +1 -0
- package/dist/middleware/account/InterchainAccountChecker.js +4 -0
- package/dist/middleware/account/InterchainAccountChecker.js.map +1 -0
- package/dist/middleware/account/InterchainAccountDeployer.d.ts +14 -0
- package/dist/middleware/account/InterchainAccountDeployer.d.ts.map +1 -0
- package/dist/middleware/account/InterchainAccountDeployer.js +68 -0
- package/dist/middleware/account/InterchainAccountDeployer.js.map +1 -0
- package/dist/middleware/account/accounts.hardhat-test.d.ts +2 -0
- package/dist/middleware/account/accounts.hardhat-test.d.ts.map +1 -0
- package/dist/middleware/account/accounts.hardhat-test.js +240 -0
- package/dist/middleware/account/accounts.hardhat-test.js.map +1 -0
- package/dist/middleware/account/contracts.d.ts +6 -0
- package/dist/middleware/account/contracts.d.ts.map +1 -0
- package/dist/middleware/account/contracts.js +5 -0
- package/dist/middleware/account/contracts.js.map +1 -0
- package/dist/middleware/account/icaCalls.d.ts +78 -0
- package/dist/middleware/account/icaCalls.d.ts.map +1 -0
- package/dist/middleware/account/icaCalls.js +75 -0
- package/dist/middleware/account/icaCalls.js.map +1 -0
- package/dist/middleware/account/types.d.ts +40 -0
- package/dist/middleware/account/types.d.ts.map +1 -0
- package/dist/middleware/account/types.js +25 -0
- package/dist/middleware/account/types.js.map +1 -0
- package/dist/middleware/query/InterchainQuery.d.ts +10 -0
- package/dist/middleware/query/InterchainQuery.d.ts.map +1 -0
- package/dist/middleware/query/InterchainQuery.js +13 -0
- package/dist/middleware/query/InterchainQuery.js.map +1 -0
- package/dist/middleware/query/InterchainQueryChecker.d.ts +7 -0
- package/dist/middleware/query/InterchainQueryChecker.d.ts.map +1 -0
- package/dist/middleware/query/InterchainQueryChecker.js +4 -0
- package/dist/middleware/query/InterchainQueryChecker.js.map +1 -0
- package/dist/middleware/query/InterchainQueryDeployer.d.ts +17 -0
- package/dist/middleware/query/InterchainQueryDeployer.d.ts.map +1 -0
- package/dist/middleware/query/InterchainQueryDeployer.js +35 -0
- package/dist/middleware/query/InterchainQueryDeployer.js.map +1 -0
- package/dist/middleware/query/contracts.d.ts +8 -0
- package/dist/middleware/query/contracts.d.ts.map +1 -0
- package/dist/middleware/query/contracts.js +7 -0
- package/dist/middleware/query/contracts.js.map +1 -0
- package/dist/middleware/query/queries.hardhat-test.d.ts +2 -0
- package/dist/middleware/query/queries.hardhat-test.d.ts.map +1 -0
- package/dist/middleware/query/queries.hardhat-test.js +70 -0
- package/dist/middleware/query/queries.hardhat-test.js.map +1 -0
- package/dist/predicate/PredicateApiClient.d.ts +35 -0
- package/dist/predicate/PredicateApiClient.d.ts.map +1 -0
- package/dist/predicate/PredicateApiClient.js +66 -0
- package/dist/predicate/PredicateApiClient.js.map +1 -0
- package/dist/predicate/PredicateApiClient.test.d.ts +2 -0
- package/dist/predicate/PredicateApiClient.test.d.ts.map +1 -0
- package/dist/predicate/PredicateApiClient.test.js +108 -0
- package/dist/predicate/PredicateApiClient.test.js.map +1 -0
- package/dist/predicate/PredicateDeployer.d.ts +56 -0
- package/dist/predicate/PredicateDeployer.d.ts.map +1 -0
- package/dist/predicate/PredicateDeployer.hardhat-test.d.ts +2 -0
- package/dist/predicate/PredicateDeployer.hardhat-test.d.ts.map +1 -0
- package/dist/predicate/PredicateDeployer.hardhat-test.js +209 -0
- package/dist/predicate/PredicateDeployer.hardhat-test.js.map +1 -0
- package/dist/predicate/PredicateDeployer.js +218 -0
- package/dist/predicate/PredicateDeployer.js.map +1 -0
- package/dist/providers/MinimalProviderRegistry.d.ts +41 -0
- package/dist/providers/MinimalProviderRegistry.d.ts.map +1 -0
- package/dist/providers/MinimalProviderRegistry.js +122 -0
- package/dist/providers/MinimalProviderRegistry.js.map +1 -0
- package/dist/providers/MultiProtocolProvider.d.ts +23 -0
- package/dist/providers/MultiProtocolProvider.d.ts.map +1 -0
- package/dist/providers/MultiProtocolProvider.js +64 -0
- package/dist/providers/MultiProtocolProvider.js.map +1 -0
- package/dist/providers/MultiProtocolProvider.test.d.ts +2 -0
- package/dist/providers/MultiProtocolProvider.test.d.ts.map +1 -0
- package/dist/providers/MultiProtocolProvider.test.js +126 -0
- package/dist/providers/MultiProtocolProvider.test.js.map +1 -0
- package/dist/providers/MultiProvider.d.ts +196 -0
- package/dist/providers/MultiProvider.d.ts.map +1 -0
- package/dist/providers/MultiProvider.js +553 -0
- package/dist/providers/MultiProvider.js.map +1 -0
- package/dist/providers/MultiProvider.test.d.ts +2 -0
- package/dist/providers/MultiProvider.test.d.ts.map +1 -0
- package/dist/providers/MultiProvider.test.js +357 -0
- package/dist/providers/MultiProvider.test.js.map +1 -0
- package/dist/providers/MultiProviderAdapter.d.ts +61 -0
- package/dist/providers/MultiProviderAdapter.d.ts.map +1 -0
- package/dist/providers/MultiProviderAdapter.js +164 -0
- package/dist/providers/MultiProviderAdapter.js.map +1 -0
- package/dist/providers/ProviderType.d.ts +319 -0
- package/dist/providers/ProviderType.d.ts.map +1 -0
- package/dist/providers/ProviderType.js +27 -0
- package/dist/providers/ProviderType.js.map +1 -0
- package/dist/providers/SeismicSigner.d.ts +78 -0
- package/dist/providers/SeismicSigner.d.ts.map +1 -0
- package/dist/providers/SeismicSigner.js +265 -0
- package/dist/providers/SeismicSigner.js.map +1 -0
- 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 +561 -0
- package/dist/providers/SeismicSigner.test.js.map +1 -0
- package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.d.ts +25 -0
- package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.d.ts.map +1 -0
- package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.js +139 -0
- package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.js.map +1 -0
- package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.d.ts +61 -0
- package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.d.ts.map +1 -0
- package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.js +248 -0
- package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.js.map +1 -0
- package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.test.d.ts +2 -0
- package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.test.d.ts.map +1 -0
- package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.test.js +516 -0
- package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.test.js.map +1 -0
- package/dist/providers/SmartProvider/ProviderMethods.d.ts +24 -0
- package/dist/providers/SmartProvider/ProviderMethods.d.ts.map +1 -0
- package/dist/providers/SmartProvider/ProviderMethods.js +32 -0
- package/dist/providers/SmartProvider/ProviderMethods.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.d.ts +58 -0
- package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -0
- 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.foundry-test.d.ts +2 -0
- package/dist/providers/SmartProvider/SmartProvider.foundry-test.d.ts.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.foundry-test.js +173 -0
- package/dist/providers/SmartProvider/SmartProvider.foundry-test.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.js +560 -0
- package/dist/providers/SmartProvider/SmartProvider.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.rawRead.test.d.ts +2 -0
- package/dist/providers/SmartProvider/SmartProvider.rawRead.test.d.ts.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.rawRead.test.js +90 -0
- package/dist/providers/SmartProvider/SmartProvider.rawRead.test.js.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.test.d.ts +2 -0
- package/dist/providers/SmartProvider/SmartProvider.test.d.ts.map +1 -0
- package/dist/providers/SmartProvider/SmartProvider.test.js +1119 -0
- package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -0
- package/dist/providers/SmartProvider/jsonRpcError.d.ts +13 -0
- package/dist/providers/SmartProvider/jsonRpcError.d.ts.map +1 -0
- package/dist/providers/SmartProvider/jsonRpcError.js +86 -0
- package/dist/providers/SmartProvider/jsonRpcError.js.map +1 -0
- package/dist/providers/SmartProvider/jsonRpcError.test.d.ts +2 -0
- package/dist/providers/SmartProvider/jsonRpcError.test.d.ts.map +1 -0
- package/dist/providers/SmartProvider/jsonRpcError.test.js +46 -0
- package/dist/providers/SmartProvider/jsonRpcError.test.js.map +1 -0
- package/dist/providers/SmartProvider/logFilters.d.ts +10 -0
- package/dist/providers/SmartProvider/logFilters.d.ts.map +1 -0
- package/dist/providers/SmartProvider/logFilters.js +31 -0
- package/dist/providers/SmartProvider/logFilters.js.map +1 -0
- package/dist/providers/SmartProvider/types.d.ts +50 -0
- package/dist/providers/SmartProvider/types.d.ts.map +1 -0
- package/dist/providers/SmartProvider/types.js +7 -0
- package/dist/providers/SmartProvider/types.js.map +1 -0
- package/dist/providers/builders/aleo.browser.d.ts +13 -0
- package/dist/providers/builders/aleo.browser.d.ts.map +1 -0
- package/dist/providers/builders/aleo.browser.js +54 -0
- package/dist/providers/builders/aleo.browser.js.map +1 -0
- package/dist/providers/builders/aleo.d.ts +4 -0
- package/dist/providers/builders/aleo.d.ts.map +1 -0
- package/dist/providers/builders/aleo.js +7 -0
- package/dist/providers/builders/aleo.js.map +1 -0
- package/dist/providers/builders/aleo.test.d.ts +2 -0
- package/dist/providers/builders/aleo.test.d.ts.map +1 -0
- package/dist/providers/builders/aleo.test.js +99 -0
- package/dist/providers/builders/aleo.test.js.map +1 -0
- package/dist/providers/builders/cosmos.d.ts +6 -0
- package/dist/providers/builders/cosmos.d.ts.map +1 -0
- package/dist/providers/builders/cosmos.js +30 -0
- package/dist/providers/builders/cosmos.js.map +1 -0
- package/dist/providers/builders/ethersV5.d.ts +7 -0
- package/dist/providers/builders/ethersV5.d.ts.map +1 -0
- package/dist/providers/builders/ethersV5.js +38 -0
- package/dist/providers/builders/ethersV5.js.map +1 -0
- 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 +19 -0
- package/dist/providers/builders/radix.browser.d.ts.map +1 -0
- package/dist/providers/builders/radix.browser.js +47 -0
- package/dist/providers/builders/radix.browser.js.map +1 -0
- package/dist/providers/builders/radix.d.ts +4 -0
- package/dist/providers/builders/radix.d.ts.map +1 -0
- 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 +17 -0
- package/dist/providers/builders/radix.js.map +1 -0
- package/dist/providers/builders/radix.test.d.ts +2 -0
- package/dist/providers/builders/radix.test.d.ts.map +1 -0
- package/dist/providers/builders/radix.test.js +82 -0
- package/dist/providers/builders/radix.test.js.map +1 -0
- package/dist/providers/builders/solana.d.ts +4 -0
- package/dist/providers/builders/solana.d.ts.map +1 -0
- package/dist/providers/builders/solana.js +12 -0
- package/dist/providers/builders/solana.js.map +1 -0
- package/dist/providers/builders/starknet.d.ts +4 -0
- package/dist/providers/builders/starknet.d.ts.map +1 -0
- package/dist/providers/builders/starknet.js +20 -0
- package/dist/providers/builders/starknet.js.map +1 -0
- package/dist/providers/builders/tron.d.ts +10 -0
- package/dist/providers/builders/tron.d.ts.map +1 -0
- package/dist/providers/builders/tron.js +21 -0
- package/dist/providers/builders/tron.js.map +1 -0
- package/dist/providers/builders/types.d.ts +6 -0
- package/dist/providers/builders/types.d.ts.map +1 -0
- package/dist/providers/builders/types.js +2 -0
- package/dist/providers/builders/types.js.map +1 -0
- package/dist/providers/builders/viem.d.ts +4 -0
- package/dist/providers/builders/viem.d.ts.map +1 -0
- package/dist/providers/builders/viem.js +25 -0
- package/dist/providers/builders/viem.js.map +1 -0
- package/dist/providers/builders/zksync.d.ts +7 -0
- package/dist/providers/builders/zksync.d.ts.map +1 -0
- package/dist/providers/builders/zksync.js +14 -0
- package/dist/providers/builders/zksync.js.map +1 -0
- package/dist/providers/defaultProviderBuilderMaps.d.ts +7 -0
- package/dist/providers/defaultProviderBuilderMaps.d.ts.map +1 -0
- package/dist/providers/defaultProviderBuilderMaps.js +36 -0
- package/dist/providers/defaultProviderBuilderMaps.js.map +1 -0
- package/dist/providers/explorerHealthTest.d.ts +4 -0
- package/dist/providers/explorerHealthTest.d.ts.map +1 -0
- package/dist/providers/explorerHealthTest.js +53 -0
- package/dist/providers/explorerHealthTest.js.map +1 -0
- package/dist/providers/providerBuilders.d.ts +12 -0
- package/dist/providers/providerBuilders.d.ts.map +1 -0
- package/dist/providers/providerBuilders.js +11 -0
- package/dist/providers/providerBuilders.js.map +1 -0
- package/dist/providers/rpcHealthTest.d.ts +11 -0
- package/dist/providers/rpcHealthTest.d.ts.map +1 -0
- package/dist/providers/rpcHealthTest.js +104 -0
- package/dist/providers/rpcHealthTest.js.map +1 -0
- package/dist/providers/runtime/evm.d.ts +3 -0
- package/dist/providers/runtime/evm.d.ts.map +1 -0
- package/dist/providers/runtime/evm.js +11 -0
- package/dist/providers/runtime/evm.js.map +1 -0
- package/dist/providers/runtime/evmLike.d.ts +3 -0
- package/dist/providers/runtime/evmLike.d.ts.map +1 -0
- package/dist/providers/runtime/evmLike.js +7 -0
- package/dist/providers/runtime/evmLike.js.map +1 -0
- package/dist/providers/runtime/evmLike.test.d.ts +2 -0
- package/dist/providers/runtime/evmLike.test.d.ts.map +1 -0
- package/dist/providers/runtime/evmLike.test.js +22 -0
- package/dist/providers/runtime/evmLike.test.js.map +1 -0
- package/dist/providers/runtime/tron.d.ts +3 -0
- package/dist/providers/runtime/tron.d.ts.map +1 -0
- package/dist/providers/runtime/tron.js +6 -0
- package/dist/providers/runtime/tron.js.map +1 -0
- package/dist/providers/transactionFeeEstimators.d.ts +79 -0
- package/dist/providers/transactionFeeEstimators.d.ts.map +1 -0
- package/dist/providers/transactionFeeEstimators.js +317 -0
- package/dist/providers/transactionFeeEstimators.js.map +1 -0
- package/dist/providers/transactionFeeEstimators.test.d.ts +2 -0
- package/dist/providers/transactionFeeEstimators.test.d.ts.map +1 -0
- package/dist/providers/transactionFeeEstimators.test.js +394 -0
- package/dist/providers/transactionFeeEstimators.test.js.map +1 -0
- package/dist/providers/transactions/submitter/IcaTxSubmitter.d.ts +25 -0
- package/dist/providers/transactions/submitter/IcaTxSubmitter.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/IcaTxSubmitter.js +113 -0
- package/dist/providers/transactions/submitter/IcaTxSubmitter.js.map +1 -0
- package/dist/providers/transactions/submitter/IcaTxSubmitter.test.d.ts +2 -0
- package/dist/providers/transactions/submitter/IcaTxSubmitter.test.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/IcaTxSubmitter.test.js +122 -0
- package/dist/providers/transactions/submitter/IcaTxSubmitter.test.js.map +1 -0
- package/dist/providers/transactions/submitter/TxSubmitterInterface.d.ts +19 -0
- package/dist/providers/transactions/submitter/TxSubmitterInterface.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/TxSubmitterInterface.js +2 -0
- package/dist/providers/transactions/submitter/TxSubmitterInterface.js.map +1 -0
- package/dist/providers/transactions/submitter/TxSubmitterTypes.d.ts +9 -0
- package/dist/providers/transactions/submitter/TxSubmitterTypes.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/TxSubmitterTypes.js +10 -0
- package/dist/providers/transactions/submitter/TxSubmitterTypes.js.map +1 -0
- package/dist/providers/transactions/submitter/builder/TxSubmitterBuilder.d.ts +39 -0
- package/dist/providers/transactions/submitter/builder/TxSubmitterBuilder.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/builder/TxSubmitterBuilder.js +48 -0
- package/dist/providers/transactions/submitter/builder/TxSubmitterBuilder.js.map +1 -0
- package/dist/providers/transactions/submitter/builder/types.d.ts +69 -0
- package/dist/providers/transactions/submitter/builder/types.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/builder/types.js +94 -0
- package/dist/providers/transactions/submitter/builder/types.js.map +1 -0
- package/dist/providers/transactions/submitter/builder/types.test.d.ts +2 -0
- package/dist/providers/transactions/submitter/builder/types.test.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/builder/types.test.js +314 -0
- package/dist/providers/transactions/submitter/builder/types.test.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxBuilder.d.ts +33 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxBuilder.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxBuilder.js +43 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxBuilder.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.d.ts +31 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.js +90 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.d.ts +2 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.js +145 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5ImpersonatedAccountTxSubmitter.d.ts +15 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5ImpersonatedAccountTxSubmitter.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5ImpersonatedAccountTxSubmitter.js +26 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5ImpersonatedAccountTxSubmitter.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.d.ts +29 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.js +68 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.d.ts +2 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.js +125 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5TimelockSubmitter.d.ts +22 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5TimelockSubmitter.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5TimelockSubmitter.js +85 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5TimelockSubmitter.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5TxSubmitterInterface.d.ts +10 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5TxSubmitterInterface.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5TxSubmitterInterface.js +2 -0
- package/dist/providers/transactions/submitter/ethersV5/EV5TxSubmitterInterface.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/types.d.ts +104 -0
- package/dist/providers/transactions/submitter/ethersV5/types.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/types.js +72 -0
- package/dist/providers/transactions/submitter/ethersV5/types.js.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/types.test.d.ts +2 -0
- package/dist/providers/transactions/submitter/ethersV5/types.test.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/ethersV5/types.test.js +57 -0
- package/dist/providers/transactions/submitter/ethersV5/types.test.js.map +1 -0
- package/dist/providers/transactions/submitter/submitterBuilderGetter.d.ts +31 -0
- package/dist/providers/transactions/submitter/submitterBuilderGetter.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/submitterBuilderGetter.js +97 -0
- package/dist/providers/transactions/submitter/submitterBuilderGetter.js.map +1 -0
- package/dist/providers/transactions/submitter/submitterBuilderGetter.test.d.ts +2 -0
- package/dist/providers/transactions/submitter/submitterBuilderGetter.test.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/submitterBuilderGetter.test.js +38 -0
- package/dist/providers/transactions/submitter/submitterBuilderGetter.test.js.map +1 -0
- package/dist/providers/transactions/submitter/types.d.ts +37 -0
- package/dist/providers/transactions/submitter/types.d.ts.map +1 -0
- package/dist/providers/transactions/submitter/types.js +3 -0
- package/dist/providers/transactions/submitter/types.js.map +1 -0
- package/dist/providers/transactions/types.d.ts +9 -0
- package/dist/providers/transactions/types.d.ts.map +1 -0
- package/dist/providers/transactions/types.js +9 -0
- package/dist/providers/transactions/types.js.map +1 -0
- package/dist/providers/transactions/types.test.d.ts +2 -0
- package/dist/providers/transactions/types.test.d.ts.map +1 -0
- package/dist/providers/transactions/types.test.js +37 -0
- package/dist/providers/transactions/types.test.js.map +1 -0
- package/dist/quote/Eip712Signable.d.ts +25 -0
- package/dist/quote/Eip712Signable.d.ts.map +1 -0
- package/dist/quote/Eip712Signable.js +27 -0
- package/dist/quote/Eip712Signable.js.map +1 -0
- package/dist/quote/EvmPrivateKeyQuoteSigner.d.ts +15 -0
- package/dist/quote/EvmPrivateKeyQuoteSigner.d.ts.map +1 -0
- package/dist/quote/EvmPrivateKeyQuoteSigner.js +24 -0
- package/dist/quote/EvmPrivateKeyQuoteSigner.js.map +1 -0
- package/dist/quote/EvmPrivateKeyQuoteSigner.test.d.ts +2 -0
- package/dist/quote/EvmPrivateKeyQuoteSigner.test.d.ts.map +1 -0
- package/dist/quote/EvmPrivateKeyQuoteSigner.test.js +23 -0
- package/dist/quote/EvmPrivateKeyQuoteSigner.test.js.map +1 -0
- package/dist/quote/EvmQuoteArtifactManager.d.ts +20 -0
- package/dist/quote/EvmQuoteArtifactManager.d.ts.map +1 -0
- package/dist/quote/EvmQuoteArtifactManager.js +32 -0
- package/dist/quote/EvmQuoteArtifactManager.js.map +1 -0
- package/dist/quote/EvmQuoteReader.d.ts +24 -0
- package/dist/quote/EvmQuoteReader.d.ts.map +1 -0
- package/dist/quote/EvmQuoteReader.hardhat-test.d.ts +2 -0
- package/dist/quote/EvmQuoteReader.hardhat-test.d.ts.map +1 -0
- package/dist/quote/EvmQuoteReader.hardhat-test.js +157 -0
- package/dist/quote/EvmQuoteReader.hardhat-test.js.map +1 -0
- package/dist/quote/EvmQuoteReader.js +91 -0
- package/dist/quote/EvmQuoteReader.js.map +1 -0
- package/dist/quote/EvmQuoteWriter.d.ts +16 -0
- package/dist/quote/EvmQuoteWriter.d.ts.map +1 -0
- package/dist/quote/EvmQuoteWriter.hardhat-test.d.ts +2 -0
- package/dist/quote/EvmQuoteWriter.hardhat-test.d.ts.map +1 -0
- package/dist/quote/EvmQuoteWriter.hardhat-test.js +238 -0
- package/dist/quote/EvmQuoteWriter.hardhat-test.js.map +1 -0
- package/dist/quote/EvmQuoteWriter.js +55 -0
- package/dist/quote/EvmQuoteWriter.js.map +1 -0
- package/dist/quote/WarpSignedQuoteEip712.d.ts +22 -0
- package/dist/quote/WarpSignedQuoteEip712.d.ts.map +1 -0
- package/dist/quote/WarpSignedQuoteEip712.js +48 -0
- package/dist/quote/WarpSignedQuoteEip712.js.map +1 -0
- package/dist/quoted-calls/EvmQuotedTransferProvider.d.ts +63 -0
- package/dist/quoted-calls/EvmQuotedTransferProvider.d.ts.map +1 -0
- package/dist/quoted-calls/EvmQuotedTransferProvider.js +207 -0
- package/dist/quoted-calls/EvmQuotedTransferProvider.js.map +1 -0
- package/dist/quoted-calls/QuotedTransferProvider.d.ts +50 -0
- package/dist/quoted-calls/QuotedTransferProvider.d.ts.map +1 -0
- package/dist/quoted-calls/QuotedTransferProvider.js +2 -0
- package/dist/quoted-calls/QuotedTransferProvider.js.map +1 -0
- package/dist/quoted-calls/SealevelQuotedTransferProvider.d.ts +89 -0
- package/dist/quoted-calls/SealevelQuotedTransferProvider.d.ts.map +1 -0
- package/dist/quoted-calls/SealevelQuotedTransferProvider.js +472 -0
- package/dist/quoted-calls/SealevelQuotedTransferProvider.js.map +1 -0
- package/dist/quoted-calls/SealevelQuotedTransferProvider.test.d.ts +2 -0
- package/dist/quoted-calls/SealevelQuotedTransferProvider.test.d.ts.map +1 -0
- package/dist/quoted-calls/SealevelQuotedTransferProvider.test.js +502 -0
- package/dist/quoted-calls/SealevelQuotedTransferProvider.test.js.map +1 -0
- package/dist/quoted-calls/assertHex.d.ts +6 -0
- package/dist/quoted-calls/assertHex.d.ts.map +1 -0
- package/dist/quoted-calls/assertHex.js +13 -0
- package/dist/quoted-calls/assertHex.js.map +1 -0
- package/dist/quoted-calls/builder.d.ts +52 -0
- package/dist/quoted-calls/builder.d.ts.map +1 -0
- package/dist/quoted-calls/builder.js +161 -0
- package/dist/quoted-calls/builder.js.map +1 -0
- package/dist/quoted-calls/builder.test.d.ts +2 -0
- package/dist/quoted-calls/builder.test.d.ts.map +1 -0
- package/dist/quoted-calls/builder.test.js +193 -0
- package/dist/quoted-calls/builder.test.js.map +1 -0
- package/dist/quoted-calls/client.d.ts +69 -0
- package/dist/quoted-calls/client.d.ts.map +1 -0
- package/dist/quoted-calls/client.js +205 -0
- package/dist/quoted-calls/client.js.map +1 -0
- package/dist/quoted-calls/client.v2.test.d.ts +2 -0
- package/dist/quoted-calls/client.v2.test.d.ts.map +1 -0
- package/dist/quoted-calls/client.v2.test.js +346 -0
- package/dist/quoted-calls/client.v2.test.js.map +1 -0
- package/dist/quoted-calls/codec.d.ts +94 -0
- package/dist/quoted-calls/codec.d.ts.map +1 -0
- package/dist/quoted-calls/codec.js +223 -0
- package/dist/quoted-calls/codec.js.map +1 -0
- package/dist/quoted-calls/codec.test.d.ts +2 -0
- package/dist/quoted-calls/codec.test.d.ts.map +1 -0
- package/dist/quoted-calls/codec.test.js +307 -0
- package/dist/quoted-calls/codec.test.js.map +1 -0
- package/dist/quoted-calls/composeSealevelTx.d.ts +26 -0
- package/dist/quoted-calls/composeSealevelTx.d.ts.map +1 -0
- package/dist/quoted-calls/composeSealevelTx.js +45 -0
- package/dist/quoted-calls/composeSealevelTx.js.map +1 -0
- package/dist/quoted-calls/svmDecoder.d.ts +51 -0
- package/dist/quoted-calls/svmDecoder.d.ts.map +1 -0
- package/dist/quoted-calls/svmDecoder.js +26 -0
- package/dist/quoted-calls/svmDecoder.js.map +1 -0
- package/dist/quoted-calls/svmDecoder.test.d.ts +2 -0
- package/dist/quoted-calls/svmDecoder.test.d.ts.map +1 -0
- package/dist/quoted-calls/svmDecoder.test.js +56 -0
- package/dist/quoted-calls/svmDecoder.test.js.map +1 -0
- package/dist/quoted-calls/types.d.ts +176 -0
- package/dist/quoted-calls/types.d.ts.map +1 -0
- package/dist/quoted-calls/types.js +56 -0
- package/dist/quoted-calls/types.js.map +1 -0
- package/dist/router/EvmRouterReader.d.ts +18 -0
- package/dist/router/EvmRouterReader.d.ts.map +1 -0
- package/dist/router/EvmRouterReader.js +60 -0
- package/dist/router/EvmRouterReader.js.map +1 -0
- package/dist/router/GasRouterDeployer.d.ts +11 -0
- package/dist/router/GasRouterDeployer.d.ts.map +1 -0
- package/dist/router/GasRouterDeployer.js +25 -0
- package/dist/router/GasRouterDeployer.js.map +1 -0
- package/dist/router/HyperlaneRouterChecker.d.ts +19 -0
- package/dist/router/HyperlaneRouterChecker.d.ts.map +1 -0
- package/dist/router/HyperlaneRouterChecker.js +157 -0
- package/dist/router/HyperlaneRouterChecker.js.map +1 -0
- package/dist/router/HyperlaneRouterDeployer.d.ts +18 -0
- package/dist/router/HyperlaneRouterDeployer.d.ts.map +1 -0
- package/dist/router/HyperlaneRouterDeployer.js +88 -0
- package/dist/router/HyperlaneRouterDeployer.js.map +1 -0
- package/dist/router/MultiProtocolRouterApps.d.ts +20 -0
- package/dist/router/MultiProtocolRouterApps.d.ts.map +1 -0
- package/dist/router/MultiProtocolRouterApps.js +43 -0
- package/dist/router/MultiProtocolRouterApps.js.map +1 -0
- package/dist/router/MultiProtocolRouterApps.test.d.ts +2 -0
- package/dist/router/MultiProtocolRouterApps.test.d.ts.map +1 -0
- package/dist/router/MultiProtocolRouterApps.test.js +22 -0
- package/dist/router/MultiProtocolRouterApps.test.js.map +1 -0
- package/dist/router/ProxiedRouterChecker.d.ts +12 -0
- package/dist/router/ProxiedRouterChecker.d.ts.map +1 -0
- package/dist/router/ProxiedRouterChecker.js +34 -0
- package/dist/router/ProxiedRouterChecker.js.map +1 -0
- package/dist/router/ProxiedRouterDeployer.d.ts +35 -0
- package/dist/router/ProxiedRouterDeployer.d.ts.map +1 -0
- package/dist/router/ProxiedRouterDeployer.js +58 -0
- package/dist/router/ProxiedRouterDeployer.js.map +1 -0
- package/dist/router/RouterApps.d.ts +22 -0
- package/dist/router/RouterApps.d.ts.map +1 -0
- package/dist/router/RouterApps.js +39 -0
- package/dist/router/RouterApps.js.map +1 -0
- package/dist/router/adapters/EvmRouterAdapter.d.ts +30 -0
- package/dist/router/adapters/EvmRouterAdapter.d.ts.map +1 -0
- package/dist/router/adapters/EvmRouterAdapter.js +46 -0
- package/dist/router/adapters/EvmRouterAdapter.js.map +1 -0
- package/dist/router/adapters/SealevelRouterAdapter.d.ts +35 -0
- package/dist/router/adapters/SealevelRouterAdapter.d.ts.map +1 -0
- package/dist/router/adapters/SealevelRouterAdapter.js +56 -0
- package/dist/router/adapters/SealevelRouterAdapter.js.map +1 -0
- package/dist/router/adapters/types.d.ts +17 -0
- package/dist/router/adapters/types.d.ts.map +1 -0
- package/dist/router/adapters/types.js +2 -0
- package/dist/router/adapters/types.js.map +1 -0
- package/dist/router/types.d.ts +139 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +62 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router/types.test.d.ts +2 -0
- package/dist/router/types.test.d.ts.map +1 -0
- package/dist/router/types.test.js +108 -0
- package/dist/router/types.test.js.map +1 -0
- package/dist/rpc/evm/EvmEventLogsReader.d.ts +91 -0
- package/dist/rpc/evm/EvmEventLogsReader.d.ts.map +1 -0
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.d.ts +2 -0
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.d.ts.map +1 -0
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +640 -0
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -0
- package/dist/rpc/evm/EvmEventLogsReader.js +246 -0
- package/dist/rpc/evm/EvmEventLogsReader.js.map +1 -0
- package/dist/rpc/evm/EvmEventLogsReader.test.d.ts +2 -0
- package/dist/rpc/evm/EvmEventLogsReader.test.d.ts.map +1 -0
- package/dist/rpc/evm/EvmEventLogsReader.test.js +139 -0
- package/dist/rpc/evm/EvmEventLogsReader.test.js.map +1 -0
- package/dist/rpc/evm/types.d.ts +11 -0
- package/dist/rpc/evm/types.d.ts.map +1 -0
- package/dist/rpc/evm/types.js +2 -0
- package/dist/rpc/evm/types.js.map +1 -0
- package/dist/rpc/evm/utils.d.ts +75 -0
- package/dist/rpc/evm/utils.d.ts.map +1 -0
- package/dist/rpc/evm/utils.hardhat-test.d.ts +2 -0
- package/dist/rpc/evm/utils.hardhat-test.d.ts.map +1 -0
- package/dist/rpc/evm/utils.hardhat-test.js +457 -0
- package/dist/rpc/evm/utils.hardhat-test.js.map +1 -0
- package/dist/rpc/evm/utils.js +338 -0
- package/dist/rpc/evm/utils.js.map +1 -0
- package/dist/rpc/evm/utils.test.d.ts +2 -0
- package/dist/rpc/evm/utils.test.d.ts.map +1 -0
- package/dist/rpc/evm/utils.test.js +636 -0
- package/dist/rpc/evm/utils.test.js.map +1 -0
- package/dist/signers/cosmos/cosmjs.d.ts +17 -0
- package/dist/signers/cosmos/cosmjs.d.ts.map +1 -0
- package/dist/signers/cosmos/cosmjs.js +39 -0
- package/dist/signers/cosmos/cosmjs.js.map +1 -0
- package/dist/signers/evm/ethersv5.d.ts +14 -0
- package/dist/signers/evm/ethersv5.d.ts.map +1 -0
- package/dist/signers/evm/ethersv5.js +36 -0
- package/dist/signers/evm/ethersv5.js.map +1 -0
- package/dist/signers/evm/turnkey.d.ts +91 -0
- package/dist/signers/evm/turnkey.d.ts.map +1 -0
- package/dist/signers/evm/turnkey.js +269 -0
- package/dist/signers/evm/turnkey.js.map +1 -0
- package/dist/signers/evm/turnkey.test.d.ts +2 -0
- package/dist/signers/evm/turnkey.test.d.ts.map +1 -0
- package/dist/signers/evm/turnkey.test.js +240 -0
- package/dist/signers/evm/turnkey.test.js.map +1 -0
- package/dist/signers/radix/radix-toolkit.d.ts +16 -0
- package/dist/signers/radix/radix-toolkit.d.ts.map +1 -0
- package/dist/signers/radix/radix-toolkit.js +34 -0
- package/dist/signers/radix/radix-toolkit.js.map +1 -0
- package/dist/signers/signers.d.ts +17 -0
- package/dist/signers/signers.d.ts.map +1 -0
- package/dist/signers/signers.js +26 -0
- package/dist/signers/signers.js.map +1 -0
- package/dist/signers/starknet/starknetjs.d.ts +14 -0
- package/dist/signers/starknet/starknetjs.d.ts.map +1 -0
- package/dist/signers/starknet/starknetjs.js +38 -0
- package/dist/signers/starknet/starknetjs.js.map +1 -0
- package/dist/signers/svm/solana-web3js.d.ts +89 -0
- package/dist/signers/svm/solana-web3js.d.ts.map +1 -0
- package/dist/signers/svm/solana-web3js.js +247 -0
- package/dist/signers/svm/solana-web3js.js.map +1 -0
- package/dist/signers/svm/solana-web3js.test.d.ts +2 -0
- package/dist/signers/svm/solana-web3js.test.d.ts.map +1 -0
- package/dist/signers/svm/solana-web3js.test.js +61 -0
- package/dist/signers/svm/solana-web3js.test.js.map +1 -0
- package/dist/signers/svm/turnkey.d.ts +49 -0
- package/dist/signers/svm/turnkey.d.ts.map +1 -0
- package/dist/signers/svm/turnkey.js +80 -0
- package/dist/signers/svm/turnkey.js.map +1 -0
- package/dist/signers/turnkeyClient.d.ts +72 -0
- package/dist/signers/turnkeyClient.d.ts.map +1 -0
- package/dist/signers/turnkeyClient.js +121 -0
- package/dist/signers/turnkeyClient.js.map +1 -0
- package/dist/signers/types.d.ts +8 -0
- package/dist/signers/types.d.ts.map +1 -0
- package/dist/signers/types.js +2 -0
- package/dist/signers/types.js.map +1 -0
- package/dist/test/contractDouble.d.ts +8 -0
- package/dist/test/contractDouble.d.ts.map +1 -0
- package/dist/test/contractDouble.js +12 -0
- package/dist/test/contractDouble.js.map +1 -0
- package/dist/test/contractStubs.d.ts +8 -0
- package/dist/test/contractStubs.d.ts.map +1 -0
- package/dist/test/contractStubs.js +15 -0
- package/dist/test/contractStubs.js.map +1 -0
- package/dist/test/errors.d.ts +34 -0
- package/dist/test/errors.d.ts.map +1 -0
- package/dist/test/errors.js +46 -0
- package/dist/test/errors.js.map +1 -0
- 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/multiProviderStubs.d.ts +9 -0
- package/dist/test/multiProviderStubs.d.ts.map +1 -0
- package/dist/test/multiProviderStubs.js +31 -0
- package/dist/test/multiProviderStubs.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/test/testUtils.d.ts +32 -0
- package/dist/test/testUtils.d.ts.map +1 -0
- package/dist/test/testUtils.js +408 -0
- package/dist/test/testUtils.js.map +1 -0
- package/dist/test/testUtils.test.d.ts +2 -0
- package/dist/test/testUtils.test.d.ts.map +1 -0
- package/dist/test/testUtils.test.js +28 -0
- package/dist/test/testUtils.test.js.map +1 -0
- package/dist/timelock/evm/EvmTimelockDeployer.d.ts +12 -0
- package/dist/timelock/evm/EvmTimelockDeployer.d.ts.map +1 -0
- package/dist/timelock/evm/EvmTimelockDeployer.hardhat-test.d.ts +2 -0
- package/dist/timelock/evm/EvmTimelockDeployer.hardhat-test.d.ts.map +1 -0
- package/dist/timelock/evm/EvmTimelockDeployer.hardhat-test.js +210 -0
- package/dist/timelock/evm/EvmTimelockDeployer.hardhat-test.js.map +1 -0
- package/dist/timelock/evm/EvmTimelockDeployer.js +68 -0
- package/dist/timelock/evm/EvmTimelockDeployer.js.map +1 -0
- package/dist/timelock/evm/EvmTimelockReader.d.ts +32 -0
- package/dist/timelock/evm/EvmTimelockReader.d.ts.map +1 -0
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.d.ts +2 -0
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.d.ts.map +1 -0
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js +889 -0
- package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js.map +1 -0
- package/dist/timelock/evm/EvmTimelockReader.js +171 -0
- package/dist/timelock/evm/EvmTimelockReader.js.map +1 -0
- package/dist/timelock/evm/constants.d.ts +6 -0
- package/dist/timelock/evm/constants.d.ts.map +1 -0
- package/dist/timelock/evm/constants.js +7 -0
- package/dist/timelock/evm/constants.js.map +1 -0
- package/dist/timelock/evm/contracts.d.ts +6 -0
- package/dist/timelock/evm/contracts.d.ts.map +1 -0
- package/dist/timelock/evm/contracts.js +5 -0
- package/dist/timelock/evm/contracts.js.map +1 -0
- package/dist/timelock/evm/errors.d.ts +2 -0
- package/dist/timelock/evm/errors.d.ts.map +1 -0
- package/dist/timelock/evm/errors.js +19 -0
- package/dist/timelock/evm/errors.js.map +1 -0
- package/dist/timelock/evm/errors.test.d.ts +2 -0
- package/dist/timelock/evm/errors.test.d.ts.map +1 -0
- package/dist/timelock/evm/errors.test.js +33 -0
- package/dist/timelock/evm/errors.test.js.map +1 -0
- package/dist/timelock/evm/utils.d.ts +4 -0
- package/dist/timelock/evm/utils.d.ts.map +1 -0
- package/dist/timelock/evm/utils.js +11 -0
- package/dist/timelock/evm/utils.js.map +1 -0
- package/dist/timelock/types.d.ts +29 -0
- package/dist/timelock/types.d.ts.map +1 -0
- package/dist/timelock/types.js +11 -0
- package/dist/timelock/types.js.map +1 -0
- package/dist/token/EvmWarpModule.d.ts +301 -0
- package/dist/token/EvmWarpModule.d.ts.map +1 -0
- package/dist/token/EvmWarpModule.hardhat-test.d.ts +2 -0
- package/dist/token/EvmWarpModule.hardhat-test.d.ts.map +1 -0
- package/dist/token/EvmWarpModule.hardhat-test.js +3143 -0
- package/dist/token/EvmWarpModule.hardhat-test.js.map +1 -0
- package/dist/token/EvmWarpModule.js +1800 -0
- package/dist/token/EvmWarpModule.js.map +1 -0
- package/dist/token/EvmWarpModule.test.d.ts +2 -0
- package/dist/token/EvmWarpModule.test.d.ts.map +1 -0
- package/dist/token/EvmWarpModule.test.js +471 -0
- package/dist/token/EvmWarpModule.test.js.map +1 -0
- package/dist/token/EvmWarpRouteReader.d.ts +135 -0
- package/dist/token/EvmWarpRouteReader.d.ts.map +1 -0
- package/dist/token/EvmWarpRouteReader.hardhat-test.d.ts +2 -0
- package/dist/token/EvmWarpRouteReader.hardhat-test.d.ts.map +1 -0
- package/dist/token/EvmWarpRouteReader.hardhat-test.js +1357 -0
- package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -0
- package/dist/token/EvmWarpRouteReader.js +1292 -0
- package/dist/token/EvmWarpRouteReader.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/token/EvmWarpRouteReader.test.d.ts.map +1 -0
- package/dist/token/EvmWarpRouteReader.test.js +783 -0
- package/dist/token/EvmWarpRouteReader.test.js.map +1 -0
- package/dist/token/EvmXERC20Module.d.ts +105 -0
- package/dist/token/EvmXERC20Module.d.ts.map +1 -0
- package/dist/token/EvmXERC20Module.js +277 -0
- package/dist/token/EvmXERC20Module.js.map +1 -0
- package/dist/token/EvmXERC20Module.test.d.ts +2 -0
- package/dist/token/EvmXERC20Module.test.d.ts.map +1 -0
- package/dist/token/EvmXERC20Module.test.js +464 -0
- package/dist/token/EvmXERC20Module.test.js.map +1 -0
- package/dist/token/EvmXERC20Reader.d.ts +58 -0
- package/dist/token/EvmXERC20Reader.d.ts.map +1 -0
- package/dist/token/EvmXERC20Reader.js +122 -0
- package/dist/token/EvmXERC20Reader.js.map +1 -0
- package/dist/token/EvmXERC20Reader.test.d.ts +2 -0
- package/dist/token/EvmXERC20Reader.test.d.ts.map +1 -0
- package/dist/token/EvmXERC20Reader.test.js +333 -0
- package/dist/token/EvmXERC20Reader.test.js.map +1 -0
- package/dist/token/IToken.d.ts +21 -0
- package/dist/token/IToken.d.ts.map +1 -0
- package/dist/token/IToken.js +2 -0
- package/dist/token/IToken.js.map +1 -0
- package/dist/token/ITokenMetadata.d.ts +90 -0
- package/dist/token/ITokenMetadata.d.ts.map +1 -0
- package/dist/token/ITokenMetadata.js +53 -0
- package/dist/token/ITokenMetadata.js.map +1 -0
- package/dist/token/Token.d.ts +47 -0
- package/dist/token/Token.d.ts.map +1 -0
- package/dist/token/Token.js +231 -0
- package/dist/token/Token.js.map +1 -0
- package/dist/token/Token.test.d.ts +2 -0
- package/dist/token/Token.test.d.ts.map +1 -0
- package/dist/token/Token.test.js +579 -0
- package/dist/token/Token.test.js.map +1 -0
- package/dist/token/TokenAmount.d.ts +12 -0
- package/dist/token/TokenAmount.d.ts.map +1 -0
- package/dist/token/TokenAmount.js +22 -0
- package/dist/token/TokenAmount.js.map +1 -0
- package/dist/token/TokenAmount.test.d.ts +2 -0
- package/dist/token/TokenAmount.test.d.ts.map +1 -0
- package/dist/token/TokenAmount.test.js +38 -0
- package/dist/token/TokenAmount.test.js.map +1 -0
- package/dist/token/TokenConnection.d.ts +55 -0
- package/dist/token/TokenConnection.d.ts.map +1 -0
- package/dist/token/TokenConnection.js +44 -0
- package/dist/token/TokenConnection.js.map +1 -0
- package/dist/token/TokenConnection.test.d.ts +2 -0
- package/dist/token/TokenConnection.test.d.ts.map +1 -0
- package/dist/token/TokenConnection.test.js +17 -0
- package/dist/token/TokenConnection.test.js.map +1 -0
- package/dist/token/TokenMetadata.d.ts +43 -0
- package/dist/token/TokenMetadata.d.ts.map +1 -0
- package/dist/token/TokenMetadata.js +121 -0
- package/dist/token/TokenMetadata.js.map +1 -0
- package/dist/token/TokenMetadataMap.d.ts +15 -0
- package/dist/token/TokenMetadataMap.d.ts.map +1 -0
- package/dist/token/TokenMetadataMap.js +56 -0
- package/dist/token/TokenMetadataMap.js.map +1 -0
- package/dist/token/TokenStandard.d.ts +108 -0
- package/dist/token/TokenStandard.d.ts.map +1 -0
- package/dist/token/TokenStandard.js +470 -0
- package/dist/token/TokenStandard.js.map +1 -0
- package/dist/token/adapters/AleoTokenAdapter.d.ts +60 -0
- package/dist/token/adapters/AleoTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/AleoTokenAdapter.js +190 -0
- package/dist/token/adapters/AleoTokenAdapter.js.map +1 -0
- package/dist/token/adapters/CosmWasmTokenAdapter.d.ts +114 -0
- package/dist/token/adapters/CosmWasmTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/CosmWasmTokenAdapter.js +332 -0
- package/dist/token/adapters/CosmWasmTokenAdapter.js.map +1 -0
- package/dist/token/adapters/CosmWasmTokenAdapter.test.d.ts +14 -0
- package/dist/token/adapters/CosmWasmTokenAdapter.test.d.ts.map +1 -0
- package/dist/token/adapters/CosmWasmTokenAdapter.test.js +283 -0
- package/dist/token/adapters/CosmWasmTokenAdapter.test.js.map +1 -0
- package/dist/token/adapters/CosmosModuleTokenAdapter.d.ts +54 -0
- package/dist/token/adapters/CosmosModuleTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/CosmosModuleTokenAdapter.js +189 -0
- package/dist/token/adapters/CosmosModuleTokenAdapter.js.map +1 -0
- package/dist/token/adapters/CosmosTokenAdapter.d.ts +74 -0
- package/dist/token/adapters/CosmosTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/CosmosTokenAdapter.js +192 -0
- package/dist/token/adapters/CosmosTokenAdapter.js.map +1 -0
- package/dist/token/adapters/EvmCrossCollateralAdapter.d.ts +39 -0
- package/dist/token/adapters/EvmCrossCollateralAdapter.d.ts.map +1 -0
- package/dist/token/adapters/EvmCrossCollateralAdapter.js +85 -0
- package/dist/token/adapters/EvmCrossCollateralAdapter.js.map +1 -0
- package/dist/token/adapters/EvmCrossCollateralAdapter.test.d.ts +2 -0
- package/dist/token/adapters/EvmCrossCollateralAdapter.test.d.ts.map +1 -0
- package/dist/token/adapters/EvmCrossCollateralAdapter.test.js +155 -0
- package/dist/token/adapters/EvmCrossCollateralAdapter.test.js.map +1 -0
- package/dist/token/adapters/EvmHypSyntheticAdapter.test.d.ts +2 -0
- package/dist/token/adapters/EvmHypSyntheticAdapter.test.d.ts.map +1 -0
- package/dist/token/adapters/EvmHypSyntheticAdapter.test.js +96 -0
- package/dist/token/adapters/EvmHypSyntheticAdapter.test.js.map +1 -0
- package/dist/token/adapters/EvmTokenAdapter.d.ts +303 -0
- package/dist/token/adapters/EvmTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/EvmTokenAdapter.js +899 -0
- package/dist/token/adapters/EvmTokenAdapter.js.map +1 -0
- package/dist/token/adapters/EvmTokenAdapter.seismic.test.d.ts +2 -0
- package/dist/token/adapters/EvmTokenAdapter.seismic.test.d.ts.map +1 -0
- package/dist/token/adapters/EvmTokenAdapter.seismic.test.js +125 -0
- package/dist/token/adapters/EvmTokenAdapter.seismic.test.js.map +1 -0
- package/dist/token/adapters/EvmTokenAdapter.test.d.ts +2 -0
- package/dist/token/adapters/EvmTokenAdapter.test.d.ts.map +1 -0
- package/dist/token/adapters/EvmTokenAdapter.test.js +73 -0
- package/dist/token/adapters/EvmTokenAdapter.test.js.map +1 -0
- package/dist/token/adapters/ITokenAdapter.d.ts +129 -0
- package/dist/token/adapters/ITokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/ITokenAdapter.js +15 -0
- package/dist/token/adapters/ITokenAdapter.js.map +1 -0
- package/dist/token/adapters/M0PortalLiteTokenAdapter.d.ts +22 -0
- package/dist/token/adapters/M0PortalLiteTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/M0PortalLiteTokenAdapter.js +90 -0
- package/dist/token/adapters/M0PortalLiteTokenAdapter.js.map +1 -0
- package/dist/token/adapters/M0PortalTokenAdapter.d.ts +22 -0
- package/dist/token/adapters/M0PortalTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/M0PortalTokenAdapter.js +95 -0
- package/dist/token/adapters/M0PortalTokenAdapter.js.map +1 -0
- package/dist/token/adapters/M0PortalTokenAdapter.test.d.ts +2 -0
- package/dist/token/adapters/M0PortalTokenAdapter.test.d.ts.map +1 -0
- package/dist/token/adapters/M0PortalTokenAdapter.test.js +94 -0
- package/dist/token/adapters/M0PortalTokenAdapter.test.js.map +1 -0
- package/dist/token/adapters/RadixTokenAdapter.d.ts +55 -0
- package/dist/token/adapters/RadixTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/RadixTokenAdapter.js +190 -0
- package/dist/token/adapters/RadixTokenAdapter.js.map +1 -0
- package/dist/token/adapters/SealevelCrossCollateralAdapter.d.ts +64 -0
- package/dist/token/adapters/SealevelCrossCollateralAdapter.d.ts.map +1 -0
- package/dist/token/adapters/SealevelCrossCollateralAdapter.js +474 -0
- package/dist/token/adapters/SealevelCrossCollateralAdapter.js.map +1 -0
- package/dist/token/adapters/SealevelCrossCollateralAdapter.test.d.ts +2 -0
- package/dist/token/adapters/SealevelCrossCollateralAdapter.test.d.ts.map +1 -0
- package/dist/token/adapters/SealevelCrossCollateralAdapter.test.js +138 -0
- package/dist/token/adapters/SealevelCrossCollateralAdapter.test.js.map +1 -0
- package/dist/token/adapters/SealevelHypTokenAdapter.test.d.ts +2 -0
- package/dist/token/adapters/SealevelHypTokenAdapter.test.d.ts.map +1 -0
- package/dist/token/adapters/SealevelHypTokenAdapter.test.js +136 -0
- package/dist/token/adapters/SealevelHypTokenAdapter.test.js.map +1 -0
- package/dist/token/adapters/SealevelTokenAdapter.d.ts +288 -0
- package/dist/token/adapters/SealevelTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/SealevelTokenAdapter.js +1019 -0
- package/dist/token/adapters/SealevelTokenAdapter.js.map +1 -0
- package/dist/token/adapters/StarknetTokenAdapter.d.ts +107 -0
- package/dist/token/adapters/StarknetTokenAdapter.d.ts.map +1 -0
- package/dist/token/adapters/StarknetTokenAdapter.js +273 -0
- package/dist/token/adapters/StarknetTokenAdapter.js.map +1 -0
- package/dist/token/adapters/aleoHyp.d.ts +7 -0
- package/dist/token/adapters/aleoHyp.d.ts.map +1 -0
- package/dist/token/adapters/aleoHyp.js +26 -0
- package/dist/token/adapters/aleoHyp.js.map +1 -0
- package/dist/token/adapters/cosmosHyp.d.ts +7 -0
- package/dist/token/adapters/cosmosHyp.d.ts.map +1 -0
- package/dist/token/adapters/cosmosHyp.js +40 -0
- package/dist/token/adapters/cosmosHyp.js.map +1 -0
- package/dist/token/adapters/evmHyp.d.ts +7 -0
- package/dist/token/adapters/evmHyp.d.ts.map +1 -0
- package/dist/token/adapters/evmHyp.js +21 -0
- package/dist/token/adapters/evmHyp.js.map +1 -0
- package/dist/token/adapters/evmLikeHyp.d.ts +20 -0
- package/dist/token/adapters/evmLikeHyp.d.ts.map +1 -0
- package/dist/token/adapters/evmLikeHyp.js +67 -0
- package/dist/token/adapters/evmLikeHyp.js.map +1 -0
- package/dist/token/adapters/hypTokenAdapterUtils.d.ts +15 -0
- package/dist/token/adapters/hypTokenAdapterUtils.d.ts.map +1 -0
- package/dist/token/adapters/hypTokenAdapterUtils.js +9 -0
- package/dist/token/adapters/hypTokenAdapterUtils.js.map +1 -0
- package/dist/token/adapters/radixHyp.d.ts +7 -0
- package/dist/token/adapters/radixHyp.d.ts.map +1 -0
- package/dist/token/adapters/radixHyp.js +22 -0
- package/dist/token/adapters/radixHyp.js.map +1 -0
- package/dist/token/adapters/sealevelFee.d.ts +206 -0
- package/dist/token/adapters/sealevelFee.d.ts.map +1 -0
- package/dist/token/adapters/sealevelFee.js +515 -0
- package/dist/token/adapters/sealevelFee.js.map +1 -0
- package/dist/token/adapters/sealevelFee.test.d.ts +2 -0
- package/dist/token/adapters/sealevelFee.test.d.ts.map +1 -0
- package/dist/token/adapters/sealevelFee.test.js +246 -0
- package/dist/token/adapters/sealevelFee.test.js.map +1 -0
- package/dist/token/adapters/sealevelHyp.d.ts +8 -0
- package/dist/token/adapters/sealevelHyp.d.ts.map +1 -0
- package/dist/token/adapters/sealevelHyp.js +52 -0
- package/dist/token/adapters/sealevelHyp.js.map +1 -0
- package/dist/token/adapters/serialization.d.ts +234 -0
- package/dist/token/adapters/serialization.d.ts.map +1 -0
- package/dist/token/adapters/serialization.js +580 -0
- package/dist/token/adapters/serialization.js.map +1 -0
- package/dist/token/adapters/serialization.test.d.ts +2 -0
- package/dist/token/adapters/serialization.test.d.ts.map +1 -0
- package/dist/token/adapters/serialization.test.js +55 -0
- package/dist/token/adapters/serialization.test.js.map +1 -0
- package/dist/token/adapters/starknetHyp.d.ts +7 -0
- package/dist/token/adapters/starknetHyp.d.ts.map +1 -0
- package/dist/token/adapters/starknetHyp.js +35 -0
- package/dist/token/adapters/starknetHyp.js.map +1 -0
- package/dist/token/adapters/tronHyp.d.ts +7 -0
- package/dist/token/adapters/tronHyp.d.ts.map +1 -0
- package/dist/token/adapters/tronHyp.js +21 -0
- package/dist/token/adapters/tronHyp.js.map +1 -0
- package/dist/token/adapters/utils.d.ts +7 -0
- package/dist/token/adapters/utils.d.ts.map +1 -0
- package/dist/token/adapters/utils.js +4 -0
- package/dist/token/adapters/utils.js.map +1 -0
- package/dist/token/cctp.d.ts +10 -0
- package/dist/token/cctp.d.ts.map +1 -0
- package/dist/token/cctp.js +13 -0
- package/dist/token/cctp.js.map +1 -0
- package/dist/token/cctp.test.d.ts +2 -0
- package/dist/token/cctp.test.d.ts.map +1 -0
- package/dist/token/cctp.test.js +48 -0
- package/dist/token/cctp.test.js.map +1 -0
- package/dist/token/config.d.ts +61 -0
- package/dist/token/config.d.ts.map +1 -0
- package/dist/token/config.js +79 -0
- package/dist/token/config.js.map +1 -0
- package/dist/token/configUtils.d.ts +106 -0
- package/dist/token/configUtils.d.ts.map +1 -0
- package/dist/token/configUtils.js +735 -0
- package/dist/token/configUtils.js.map +1 -0
- package/dist/token/configUtils.test.d.ts +2 -0
- package/dist/token/configUtils.test.d.ts.map +1 -0
- package/dist/token/configUtils.test.js +1313 -0
- package/dist/token/configUtils.test.js.map +1 -0
- package/dist/token/contracts.d.ts +64 -0
- package/dist/token/contracts.d.ts.map +1 -0
- package/dist/token/contracts.js +68 -0
- package/dist/token/contracts.js.map +1 -0
- package/dist/token/deploy.d.ts +56 -0
- package/dist/token/deploy.d.ts.map +1 -0
- package/dist/token/deploy.hardhat-test.d.ts +2 -0
- package/dist/token/deploy.hardhat-test.d.ts.map +1 -0
- package/dist/token/deploy.hardhat-test.js +1397 -0
- package/dist/token/deploy.hardhat-test.js.map +1 -0
- package/dist/token/deploy.js +698 -0
- package/dist/token/deploy.js.map +1 -0
- package/dist/token/nativeTokenMetadata.d.ts +4 -0
- package/dist/token/nativeTokenMetadata.d.ts.map +1 -0
- package/dist/token/nativeTokenMetadata.js +50 -0
- package/dist/token/nativeTokenMetadata.js.map +1 -0
- package/dist/token/sealevel/metadata.d.ts +33 -0
- package/dist/token/sealevel/metadata.d.ts.map +1 -0
- package/dist/token/sealevel/metadata.js +90 -0
- package/dist/token/sealevel/metadata.js.map +1 -0
- package/dist/token/tokenMetadataUtils.d.ts +7 -0
- package/dist/token/tokenMetadataUtils.d.ts.map +1 -0
- package/dist/token/tokenMetadataUtils.js +109 -0
- package/dist/token/tokenMetadataUtils.js.map +1 -0
- package/dist/token/types.d.ts +9384 -0
- package/dist/token/types.d.ts.map +1 -0
- package/dist/token/types.js +613 -0
- package/dist/token/types.js.map +1 -0
- package/dist/token/types.test.d.ts +2 -0
- package/dist/token/types.test.d.ts.map +1 -0
- package/dist/token/types.test.js +529 -0
- package/dist/token/types.test.js.map +1 -0
- package/dist/token/warpCheck.d.ts +75 -0
- package/dist/token/warpCheck.d.ts.map +1 -0
- package/dist/token/warpCheck.js +1003 -0
- package/dist/token/warpCheck.js.map +1 -0
- package/dist/token/warpCheck.test.d.ts +2 -0
- package/dist/token/warpCheck.test.d.ts.map +1 -0
- package/dist/token/warpCheck.test.js +947 -0
- package/dist/token/warpCheck.test.js.map +1 -0
- package/dist/token/xerc20-abi.d.ts +58 -0
- package/dist/token/xerc20-abi.d.ts.map +1 -0
- package/dist/token/xerc20-abi.js +77 -0
- package/dist/token/xerc20-abi.js.map +1 -0
- package/dist/token/xerc20-limits.d.ts +63 -0
- package/dist/token/xerc20-limits.d.ts.map +1 -0
- package/dist/token/xerc20-limits.js +80 -0
- package/dist/token/xerc20-limits.js.map +1 -0
- package/dist/token/xerc20.d.ts +93 -0
- package/dist/token/xerc20.d.ts.map +1 -0
- package/dist/token/xerc20.js +355 -0
- package/dist/token/xerc20.js.map +1 -0
- package/dist/token/xerc20.test.d.ts +2 -0
- package/dist/token/xerc20.test.d.ts.map +1 -0
- package/dist/token/xerc20.test.js +728 -0
- package/dist/token/xerc20.test.js.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/HyperlaneReader.d.ts +17 -0
- package/dist/utils/HyperlaneReader.d.ts.map +1 -0
- package/dist/utils/HyperlaneReader.js +22 -0
- package/dist/utils/HyperlaneReader.js.map +1 -0
- package/dist/utils/MultiGeneric.d.ts +26 -0
- package/dist/utils/MultiGeneric.d.ts.map +1 -0
- package/dist/utils/MultiGeneric.js +55 -0
- package/dist/utils/MultiGeneric.js.map +1 -0
- package/dist/utils/contract.d.ts +60 -0
- package/dist/utils/contract.d.ts.map +1 -0
- package/dist/utils/contract.js +231 -0
- package/dist/utils/contract.js.map +1 -0
- package/dist/utils/contract.test.d.ts +2 -0
- package/dist/utils/contract.test.d.ts.map +1 -0
- package/dist/utils/contract.test.js +551 -0
- package/dist/utils/contract.test.js.map +1 -0
- 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/cosmos.d.ts +391 -0
- package/dist/utils/cosmos.d.ts.map +1 -0
- package/dist/utils/cosmos.js +424 -0
- package/dist/utils/cosmos.js.map +1 -0
- package/dist/utils/decimals.d.ts +53 -0
- package/dist/utils/decimals.d.ts.map +1 -0
- package/dist/utils/decimals.js +131 -0
- package/dist/utils/decimals.js.map +1 -0
- package/dist/utils/decimals.test.d.ts +2 -0
- package/dist/utils/decimals.test.d.ts.map +1 -0
- package/dist/utils/decimals.test.js +526 -0
- package/dist/utils/decimals.test.js.map +1 -0
- package/dist/utils/filter.d.ts +3 -0
- package/dist/utils/filter.d.ts.map +1 -0
- package/dist/utils/filter.js +9 -0
- package/dist/utils/filter.js.map +1 -0
- package/dist/utils/fork.d.ts +55 -0
- package/dist/utils/fork.d.ts.map +1 -0
- package/dist/utils/fork.js +119 -0
- package/dist/utils/fork.js.map +1 -0
- package/dist/utils/gas.d.ts +30 -0
- package/dist/utils/gas.d.ts.map +1 -0
- package/dist/utils/gas.js +35 -0
- package/dist/utils/gas.js.map +1 -0
- package/dist/utils/gnosisSafe.d.ts +21 -0
- package/dist/utils/gnosisSafe.d.ts.map +1 -0
- package/dist/utils/gnosisSafe.js +193 -0
- package/dist/utils/gnosisSafe.js.map +1 -0
- package/dist/utils/gnosisSafe.test.d.ts +2 -0
- package/dist/utils/gnosisSafe.test.d.ts.map +1 -0
- package/dist/utils/gnosisSafe.test.js +78 -0
- package/dist/utils/gnosisSafe.test.js.map +1 -0
- package/dist/utils/ism.d.ts +193 -0
- package/dist/utils/ism.d.ts.map +1 -0
- package/dist/utils/ism.js +611 -0
- package/dist/utils/ism.js.map +1 -0
- package/dist/utils/ism.test.d.ts +2 -0
- package/dist/utils/ism.test.d.ts.map +1 -0
- package/dist/utils/ism.test.js +445 -0
- package/dist/utils/ism.test.js.map +1 -0
- package/dist/utils/logUtils.d.ts +4 -0
- package/dist/utils/logUtils.d.ts.map +1 -0
- package/dist/utils/logUtils.js +13 -0
- package/dist/utils/logUtils.js.map +1 -0
- package/dist/utils/numbers.d.ts +11 -0
- package/dist/utils/numbers.d.ts.map +1 -0
- package/dist/utils/numbers.js +36 -0
- package/dist/utils/numbers.js.map +1 -0
- package/dist/utils/numbers.test.d.ts +2 -0
- package/dist/utils/numbers.test.d.ts.map +1 -0
- package/dist/utils/numbers.test.js +80 -0
- package/dist/utils/numbers.test.js.map +1 -0
- package/dist/utils/provider.d.ts +6 -0
- package/dist/utils/provider.d.ts.map +1 -0
- package/dist/utils/provider.js +36 -0
- package/dist/utils/provider.js.map +1 -0
- package/dist/utils/schemas.d.ts +4 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +15 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/schemas.test.d.ts +2 -0
- package/dist/utils/schemas.test.d.ts.map +1 -0
- package/dist/utils/schemas.test.js +33 -0
- package/dist/utils/schemas.test.js.map +1 -0
- package/dist/utils/sealevelSerialization.d.ts +50 -0
- package/dist/utils/sealevelSerialization.d.ts.map +1 -0
- package/dist/utils/sealevelSerialization.js +85 -0
- package/dist/utils/sealevelSerialization.js.map +1 -0
- package/dist/utils/starknet.d.ts +35 -0
- package/dist/utils/starknet.d.ts.map +1 -0
- package/dist/utils/starknet.js +89 -0
- package/dist/utils/starknet.js.map +1 -0
- package/dist/utils/transactions.d.ts +12 -0
- package/dist/utils/transactions.d.ts.map +1 -0
- package/dist/utils/transactions.js +17 -0
- package/dist/utils/transactions.js.map +1 -0
- package/dist/utils/validator.d.ts +5 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +18 -0
- package/dist/utils/validator.js.map +1 -0
- package/dist/utils/zksync.d.ts +8 -0
- package/dist/utils/zksync.d.ts.map +1 -0
- package/dist/utils/zksync.js +24 -0
- package/dist/utils/zksync.js.map +1 -0
- package/dist/warp/WarpCore.d.ts +286 -0
- package/dist/warp/WarpCore.d.ts.map +1 -0
- package/dist/warp/WarpCore.js +1144 -0
- package/dist/warp/WarpCore.js.map +1 -0
- package/dist/warp/WarpCore.test.d.ts +2 -0
- package/dist/warp/WarpCore.test.d.ts.map +1 -0
- package/dist/warp/WarpCore.test.js +1823 -0
- package/dist/warp/WarpCore.test.js.map +1 -0
- package/dist/warp/read.d.ts +19 -0
- package/dist/warp/read.d.ts.map +1 -0
- package/dist/warp/read.js +34 -0
- package/dist/warp/read.js.map +1 -0
- package/dist/warp/read.test.d.ts +2 -0
- package/dist/warp/read.test.d.ts.map +1 -0
- package/dist/warp/read.test.js +56 -0
- package/dist/warp/read.test.js.map +1 -0
- package/dist/warp/resolveDestinationToken.d.ts +23 -0
- package/dist/warp/resolveDestinationToken.d.ts.map +1 -0
- package/dist/warp/resolveDestinationToken.js +31 -0
- package/dist/warp/resolveDestinationToken.js.map +1 -0
- package/dist/warp/types.d.ts +122 -0
- package/dist/warp/types.d.ts.map +1 -0
- package/dist/warp/types.js +52 -0
- package/dist/warp/types.js.map +1 -0
- package/dist/warp/types.test.d.ts +2 -0
- package/dist/warp/types.test.d.ts.map +1 -0
- package/dist/warp/types.test.js +81 -0
- package/dist/warp/types.test.js.map +1 -0
- package/dist/zksync/ZKSyncDeployer.d.ts +59 -0
- package/dist/zksync/ZKSyncDeployer.d.ts.map +1 -0
- package/dist/zksync/ZKSyncDeployer.js +132 -0
- package/dist/zksync/ZKSyncDeployer.js.map +1 -0
- package/package.json +259 -3
|
@@ -0,0 +1,3143 @@
|
|
|
1
|
+
import chai from 'chai';
|
|
2
|
+
import chaiAsPromised from 'chai-as-promised';
|
|
3
|
+
import { ethers } from 'ethers';
|
|
4
|
+
import hre from 'hardhat';
|
|
5
|
+
import sinon from 'sinon';
|
|
6
|
+
import { CONTRACTS_PACKAGE_VERSION, CrossCollateralRoutingFee__factory, CrossCollateralRouter__factory, DelayedFlowRouterHookIsm__factory, ERC20Test__factory, ERC4626Test__factory, GasRouter__factory, HypERC20__factory, HypERC4626Collateral__factory, HypNative__factory, HypXERC20__factory, LinearFee__factory, MailboxClient__factory, Mailbox__factory, MockEverclearAdapter__factory, MovableCollateralRouter__factory, StaticAggregationIsm__factory, TokenBridgeCctpV2__factory, TokenRouter__factory, XERC20Test__factory, } from '@recoillink/core';
|
|
7
|
+
import { HookType, IsmType, TestChainName, TokenFeeType, proxyAdmin, proxyImplementation, serializeContracts, } from '@recoillink/sdk';
|
|
8
|
+
import { addressToBytes32, assert, deepCopy, eqAddress, isZeroishAddress, normalizeAddressEvm, objMap, randomInt, } from '@recoillink/utils';
|
|
9
|
+
import { TestCoreDeployer } from '../core/TestCoreDeployer.js';
|
|
10
|
+
import { HyperlaneProxyFactoryDeployer } from '../deploy/HyperlaneProxyFactoryDeployer.js';
|
|
11
|
+
import { deriveDelayedFlowEnrollmentTargets } from '../deploy/warp.js';
|
|
12
|
+
import { EvmIsmModule } from '../ism/EvmIsmModule.js';
|
|
13
|
+
import { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory.js';
|
|
14
|
+
import { MultiProvider } from '../providers/MultiProvider.js';
|
|
15
|
+
import { randomAddress } from '../test/testUtils.js';
|
|
16
|
+
import { collectHybridIsmNodes, normalizeConfig } from '../utils/ism.js';
|
|
17
|
+
import { EvmTokenFeeModule } from '../fee/EvmTokenFeeModule.js';
|
|
18
|
+
import { DEFAULT_ROUTER_KEY } from '../fee/types.js';
|
|
19
|
+
import { EvmWarpModule, MAX_LEGACY_BRIDGE_APPROVAL_VERSION, } from './EvmWarpModule.js';
|
|
20
|
+
import { TokenType, isMovableCollateralTokenType, } from './config.js';
|
|
21
|
+
import { HypTokenRouterConfigSchema, derivedHookAddress, isEverclearTokenBridgeConfig, isMovableCollateralTokenConfig, } from './types.js';
|
|
22
|
+
chai.use(chaiAsPromised);
|
|
23
|
+
const { expect } = chai;
|
|
24
|
+
const routerInstallIndex = (txs, router, fn) => {
|
|
25
|
+
const sighash = MailboxClient__factory.createInterface().getSighash(fn);
|
|
26
|
+
return txs.findIndex((tx) => !!tx.to &&
|
|
27
|
+
eqAddress(tx.to, router) &&
|
|
28
|
+
!!tx.data &&
|
|
29
|
+
tx.data.startsWith(sighash));
|
|
30
|
+
};
|
|
31
|
+
const randomRemoteRouters = (n) => {
|
|
32
|
+
const routers = {};
|
|
33
|
+
for (let domain = 0; domain < n; domain++) {
|
|
34
|
+
routers[domain] = {
|
|
35
|
+
address: randomAddress(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return routers;
|
|
39
|
+
};
|
|
40
|
+
describe('EvmWarpModule', async () => {
|
|
41
|
+
const TOKEN_NAME = 'fake';
|
|
42
|
+
const TOKEN_SUPPLY = '100000000000000000000';
|
|
43
|
+
const TOKEN_DECIMALS = 18;
|
|
44
|
+
const chain = TestChainName.test4;
|
|
45
|
+
const domainId = 31337;
|
|
46
|
+
let mailbox;
|
|
47
|
+
let ismAddress;
|
|
48
|
+
let ismFactory;
|
|
49
|
+
let factories;
|
|
50
|
+
let ismFactoryAddresses;
|
|
51
|
+
let erc20Factory;
|
|
52
|
+
let vaultFactory;
|
|
53
|
+
let vault;
|
|
54
|
+
let token;
|
|
55
|
+
let feeToken;
|
|
56
|
+
let everclearBridgeAdapterMockFactory;
|
|
57
|
+
let everclearBridgeAdapterMock;
|
|
58
|
+
let signer;
|
|
59
|
+
let multiProvider;
|
|
60
|
+
let coreApp;
|
|
61
|
+
let routerConfigMap;
|
|
62
|
+
let baseConfig;
|
|
63
|
+
async function validateCoreValues(deployedToken) {
|
|
64
|
+
expect(await deployedToken.mailbox()).to.equal(mailbox.address);
|
|
65
|
+
expect(await deployedToken.owner()).to.equal(signer.address);
|
|
66
|
+
}
|
|
67
|
+
async function sendTxs(txs) {
|
|
68
|
+
for (const tx of txs) {
|
|
69
|
+
await multiProvider.sendTransaction(chain, tx);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
before(async () => {
|
|
73
|
+
[signer] = await hre.ethers.getSigners();
|
|
74
|
+
multiProvider = MultiProvider.createTestMultiProvider({ signer });
|
|
75
|
+
const ismFactoryDeployer = new HyperlaneProxyFactoryDeployer(multiProvider);
|
|
76
|
+
factories = await ismFactoryDeployer.deploy(multiProvider.mapKnownChains(() => ({})));
|
|
77
|
+
ismFactoryAddresses = serializeContracts(factories[chain]);
|
|
78
|
+
ismFactory = new HyperlaneIsmFactory(factories, multiProvider);
|
|
79
|
+
coreApp = await new TestCoreDeployer(multiProvider, ismFactory).deployApp();
|
|
80
|
+
routerConfigMap = coreApp.getRouterConfig(signer.address);
|
|
81
|
+
erc20Factory = new ERC20Test__factory(signer);
|
|
82
|
+
token = await erc20Factory.deploy(TOKEN_NAME, TOKEN_NAME, TOKEN_SUPPLY, TOKEN_DECIMALS);
|
|
83
|
+
feeToken = await erc20Factory.deploy(TOKEN_NAME, TOKEN_NAME, TOKEN_SUPPLY, TOKEN_DECIMALS);
|
|
84
|
+
vaultFactory = new ERC4626Test__factory(signer);
|
|
85
|
+
vault = await vaultFactory.deploy(token.address, TOKEN_NAME, TOKEN_NAME);
|
|
86
|
+
baseConfig = routerConfigMap[chain];
|
|
87
|
+
mailbox = Mailbox__factory.connect(baseConfig.mailbox, signer);
|
|
88
|
+
ismAddress = await mailbox.defaultIsm();
|
|
89
|
+
everclearBridgeAdapterMockFactory = new MockEverclearAdapter__factory(signer);
|
|
90
|
+
everclearBridgeAdapterMock =
|
|
91
|
+
await everclearBridgeAdapterMockFactory.deploy();
|
|
92
|
+
});
|
|
93
|
+
const movableCollateralTypes = Object.values(TokenType).filter((t) => isMovableCollateralTokenType(t) &&
|
|
94
|
+
// CrossCollateralRouter contract too large for hardhat; covered by forge tests
|
|
95
|
+
t !== TokenType.crossCollateral);
|
|
96
|
+
const everclearTokenBridgeTypes = [
|
|
97
|
+
TokenType.ethEverclear,
|
|
98
|
+
TokenType.collateralEverclear,
|
|
99
|
+
];
|
|
100
|
+
const assertAllowedRebalancers = async (evmERC20WarpModule, expectedRebalancers) => {
|
|
101
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
102
|
+
if (isMovableCollateralTokenConfig(currentConfig)) {
|
|
103
|
+
const currentRebalancers = Array.from(currentConfig.allowedRebalancers ?? []);
|
|
104
|
+
expect(currentRebalancers.length).to.equal(expectedRebalancers.length);
|
|
105
|
+
currentRebalancers.forEach((rebalancer, idx) => expect(eqAddress(rebalancer, expectedRebalancers[idx])).to.be.true);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const getMovableTokenConfig = (allowedRebalancers = []) => {
|
|
109
|
+
return {
|
|
110
|
+
[TokenType.collateral]: {
|
|
111
|
+
...baseConfig,
|
|
112
|
+
type: TokenType.collateral,
|
|
113
|
+
token: token.address,
|
|
114
|
+
allowedRebalancers,
|
|
115
|
+
},
|
|
116
|
+
[TokenType.native]: {
|
|
117
|
+
...baseConfig,
|
|
118
|
+
type: TokenType.native,
|
|
119
|
+
allowedRebalancers,
|
|
120
|
+
},
|
|
121
|
+
[TokenType.nativeScaled]: {
|
|
122
|
+
...baseConfig,
|
|
123
|
+
type: TokenType.nativeScaled,
|
|
124
|
+
allowedRebalancers,
|
|
125
|
+
},
|
|
126
|
+
[TokenType.crossCollateral]: {
|
|
127
|
+
...baseConfig,
|
|
128
|
+
type: TokenType.crossCollateral,
|
|
129
|
+
token: token.address,
|
|
130
|
+
allowedRebalancers,
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
const getEverclearTokenBridgeTokenConfig = () => {
|
|
135
|
+
const chainId = multiProvider.getChainId(chain);
|
|
136
|
+
const everclearFeeParams = {
|
|
137
|
+
[chainId]: {
|
|
138
|
+
deadline: Date.now(),
|
|
139
|
+
fee: randomInt(1000),
|
|
140
|
+
signature: '0x',
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
// Need to "enroll" otherwise the fee won't be set
|
|
144
|
+
const remoteRouters = {
|
|
145
|
+
[chainId]: {
|
|
146
|
+
address: randomAddress(),
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
return {
|
|
150
|
+
[TokenType.collateralEverclear]: {
|
|
151
|
+
type: TokenType.collateralEverclear,
|
|
152
|
+
token: token.address,
|
|
153
|
+
...baseConfig,
|
|
154
|
+
everclearBridgeAddress: everclearBridgeAdapterMock.address,
|
|
155
|
+
everclearFeeParams,
|
|
156
|
+
outputAssets: {},
|
|
157
|
+
remoteRouters,
|
|
158
|
+
},
|
|
159
|
+
[TokenType.ethEverclear]: {
|
|
160
|
+
type: TokenType.ethEverclear,
|
|
161
|
+
wethAddress: token.address,
|
|
162
|
+
...baseConfig,
|
|
163
|
+
everclearBridgeAddress: everclearBridgeAdapterMock.address,
|
|
164
|
+
everclearFeeParams,
|
|
165
|
+
outputAssets: {},
|
|
166
|
+
remoteRouters,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
it('should create with a collateral config', async () => {
|
|
171
|
+
const config = {
|
|
172
|
+
...baseConfig,
|
|
173
|
+
type: TokenType.collateral,
|
|
174
|
+
token: token.address,
|
|
175
|
+
};
|
|
176
|
+
// Deploy using WarpModule
|
|
177
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
178
|
+
chain,
|
|
179
|
+
config,
|
|
180
|
+
multiProvider,
|
|
181
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
182
|
+
});
|
|
183
|
+
// Let's derive it's onchain token type
|
|
184
|
+
const { deployedTokenRoute } = evmERC20WarpModule.serialize();
|
|
185
|
+
const tokenType = await evmERC20WarpModule.reader.deriveTokenType(deployedTokenRoute);
|
|
186
|
+
expect(tokenType).to.equal(TokenType.collateral);
|
|
187
|
+
});
|
|
188
|
+
it('should create with a collateral vault config', async () => {
|
|
189
|
+
const config = {
|
|
190
|
+
type: TokenType.collateralVault,
|
|
191
|
+
token: vault.address,
|
|
192
|
+
...baseConfig,
|
|
193
|
+
};
|
|
194
|
+
// Deploy using WarpModule
|
|
195
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
196
|
+
chain,
|
|
197
|
+
config,
|
|
198
|
+
multiProvider,
|
|
199
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
200
|
+
});
|
|
201
|
+
// Let's derive it's onchain token type
|
|
202
|
+
const { deployedTokenRoute } = evmERC20WarpModule.serialize();
|
|
203
|
+
const tokenType = await evmERC20WarpModule.reader.deriveTokenType(deployedTokenRoute);
|
|
204
|
+
expect(tokenType).to.equal(TokenType.collateralVault);
|
|
205
|
+
// Validate onchain token values
|
|
206
|
+
const collateralVaultContract = HypERC4626Collateral__factory.connect(deployedTokenRoute, signer);
|
|
207
|
+
await validateCoreValues(collateralVaultContract);
|
|
208
|
+
expect(await collateralVaultContract.vault()).to.equal(vault.address);
|
|
209
|
+
expect(await collateralVaultContract.wrappedToken()).to.equal(token.address);
|
|
210
|
+
});
|
|
211
|
+
it('should create with a synthetic config', async () => {
|
|
212
|
+
const config = {
|
|
213
|
+
...baseConfig,
|
|
214
|
+
type: TokenType.synthetic,
|
|
215
|
+
name: TOKEN_NAME,
|
|
216
|
+
symbol: TOKEN_NAME,
|
|
217
|
+
decimals: TOKEN_DECIMALS,
|
|
218
|
+
initialSupply: TOKEN_SUPPLY,
|
|
219
|
+
};
|
|
220
|
+
// Deploy using WarpModule
|
|
221
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
222
|
+
chain,
|
|
223
|
+
config,
|
|
224
|
+
multiProvider,
|
|
225
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
226
|
+
});
|
|
227
|
+
// Let's derive it's onchain token type
|
|
228
|
+
const { deployedTokenRoute } = evmERC20WarpModule.serialize();
|
|
229
|
+
const tokenType = await evmERC20WarpModule.reader.deriveTokenType(deployedTokenRoute);
|
|
230
|
+
expect(tokenType).to.equal(TokenType.synthetic);
|
|
231
|
+
// Validate onchain token values
|
|
232
|
+
const syntheticContract = HypERC20__factory.connect(deployedTokenRoute, signer);
|
|
233
|
+
await validateCoreValues(syntheticContract);
|
|
234
|
+
expect(await syntheticContract.name()).to.equal(TOKEN_NAME);
|
|
235
|
+
expect(await syntheticContract.symbol()).to.equal(TOKEN_NAME);
|
|
236
|
+
expect(await syntheticContract.decimals()).to.equal(TOKEN_DECIMALS);
|
|
237
|
+
expect(await syntheticContract.totalSupply()).to.equal(TOKEN_SUPPLY);
|
|
238
|
+
});
|
|
239
|
+
it('should create with a native config', async () => {
|
|
240
|
+
const config = {
|
|
241
|
+
type: TokenType.native,
|
|
242
|
+
...baseConfig,
|
|
243
|
+
};
|
|
244
|
+
// Deploy using WarpModule
|
|
245
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
246
|
+
chain,
|
|
247
|
+
config,
|
|
248
|
+
multiProvider,
|
|
249
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
250
|
+
});
|
|
251
|
+
// Let's derive it's onchain token type
|
|
252
|
+
const { deployedTokenRoute } = evmERC20WarpModule.serialize();
|
|
253
|
+
const tokenType = await evmERC20WarpModule.reader.deriveTokenType(deployedTokenRoute);
|
|
254
|
+
expect(tokenType).to.equal(TokenType.native);
|
|
255
|
+
// Validate onchain token values
|
|
256
|
+
const nativeContract = HypNative__factory.connect(deployedTokenRoute, signer);
|
|
257
|
+
await validateCoreValues(nativeContract);
|
|
258
|
+
});
|
|
259
|
+
it('should create with remote routers', async () => {
|
|
260
|
+
const numOfRouters = Math.floor(Math.random() * 10);
|
|
261
|
+
const config = {
|
|
262
|
+
...baseConfig,
|
|
263
|
+
type: TokenType.native,
|
|
264
|
+
remoteRouters: randomRemoteRouters(numOfRouters),
|
|
265
|
+
};
|
|
266
|
+
// Deploy using WarpModule
|
|
267
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
268
|
+
chain,
|
|
269
|
+
config,
|
|
270
|
+
multiProvider,
|
|
271
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
272
|
+
});
|
|
273
|
+
const { remoteRouters } = await evmERC20WarpModule.read();
|
|
274
|
+
expect(Object.keys(remoteRouters).length).to.equal(numOfRouters);
|
|
275
|
+
});
|
|
276
|
+
for (const tokenType of movableCollateralTypes) {
|
|
277
|
+
it(`should deploy the token with rebalancers when the token is of type "${tokenType}"`, async () => {
|
|
278
|
+
const rebalancers = new Set([randomAddress(), randomAddress()]);
|
|
279
|
+
const expectedRebalancers = Array.from(rebalancers);
|
|
280
|
+
const config = deepCopy(getMovableTokenConfig(expectedRebalancers)[tokenType]);
|
|
281
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
282
|
+
chain,
|
|
283
|
+
config,
|
|
284
|
+
multiProvider,
|
|
285
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
286
|
+
});
|
|
287
|
+
await assertAllowedRebalancers(evmERC20WarpModule, expectedRebalancers);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
for (const tokenType of everclearTokenBridgeTypes) {
|
|
291
|
+
it(`should create ${tokenType} token`, async () => {
|
|
292
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
293
|
+
// Deploy using WarpModule
|
|
294
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
295
|
+
chain,
|
|
296
|
+
config,
|
|
297
|
+
multiProvider,
|
|
298
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
299
|
+
});
|
|
300
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
301
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
302
|
+
expect(currentConfig.everclearBridgeAddress).to.deep.equal(config.everclearBridgeAddress);
|
|
303
|
+
expect(currentConfig.everclearFeeParams).to.deep.equal(config.everclearFeeParams);
|
|
304
|
+
});
|
|
305
|
+
it(`should deploy with multiple output assets and fee setting when the token is of type ${tokenType}`, async () => {
|
|
306
|
+
const baseConfig = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
307
|
+
const domainId1 = randomInt(100, 10);
|
|
308
|
+
const domainId2 = randomInt(1000, 100);
|
|
309
|
+
const updatedConfig = {
|
|
310
|
+
...baseConfig,
|
|
311
|
+
remoteRouters: {
|
|
312
|
+
[domainId1]: {
|
|
313
|
+
address: randomAddress(),
|
|
314
|
+
},
|
|
315
|
+
[domainId2]: {
|
|
316
|
+
address: randomAddress(),
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
everclearFeeParams: {
|
|
320
|
+
[domainId1]: {
|
|
321
|
+
signature: '0x10',
|
|
322
|
+
deadline: Date.now(),
|
|
323
|
+
fee: randomInt(100),
|
|
324
|
+
},
|
|
325
|
+
[domainId2]: {
|
|
326
|
+
signature: '0x10',
|
|
327
|
+
deadline: Date.now(),
|
|
328
|
+
fee: randomInt(100),
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
outputAssets: {
|
|
332
|
+
[domainId1]: addressToBytes32(randomAddress()),
|
|
333
|
+
[domainId2]: addressToBytes32(randomAddress()),
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
// Deploy using WarpModule
|
|
337
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
338
|
+
chain,
|
|
339
|
+
config: updatedConfig,
|
|
340
|
+
multiProvider,
|
|
341
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
342
|
+
});
|
|
343
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
344
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
345
|
+
expect(currentConfig.everclearBridgeAddress).to.deep.equal(updatedConfig.everclearBridgeAddress);
|
|
346
|
+
expect(currentConfig.everclearFeeParams).to.deep.equal(updatedConfig.everclearFeeParams);
|
|
347
|
+
expect(currentConfig.outputAssets).to.deep.equal(updatedConfig.outputAssets);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
describe(EvmWarpModule.prototype.update.name, async () => {
|
|
351
|
+
const owner = randomAddress();
|
|
352
|
+
const ismConfigToUpdate = [
|
|
353
|
+
{
|
|
354
|
+
type: IsmType.TRUSTED_RELAYER,
|
|
355
|
+
relayer: owner,
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
type: IsmType.FALLBACK_ROUTING,
|
|
359
|
+
owner: owner,
|
|
360
|
+
domains: {},
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
type: IsmType.PAUSABLE,
|
|
364
|
+
owner: owner,
|
|
365
|
+
paused: false,
|
|
366
|
+
},
|
|
367
|
+
ethers.constants.AddressZero,
|
|
368
|
+
];
|
|
369
|
+
const hookConfigToUpdate = [
|
|
370
|
+
{
|
|
371
|
+
type: HookType.PROTOCOL_FEE,
|
|
372
|
+
beneficiary: owner,
|
|
373
|
+
owner: owner,
|
|
374
|
+
maxProtocolFee: '1337',
|
|
375
|
+
protocolFee: '1337',
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
type: HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
379
|
+
owner: owner,
|
|
380
|
+
beneficiary: owner,
|
|
381
|
+
oracleKey: owner,
|
|
382
|
+
overhead: {},
|
|
383
|
+
oracleConfig: {},
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
type: HookType.MERKLE_TREE,
|
|
387
|
+
},
|
|
388
|
+
];
|
|
389
|
+
for (const interchainSecurityModule of ismConfigToUpdate) {
|
|
390
|
+
it(`should deploy and set a new Ism (${typeof interchainSecurityModule === 'string' ? interchainSecurityModule : interchainSecurityModule.type})`, async () => {
|
|
391
|
+
const config = {
|
|
392
|
+
...baseConfig,
|
|
393
|
+
type: TokenType.native,
|
|
394
|
+
interchainSecurityModule: ismAddress,
|
|
395
|
+
};
|
|
396
|
+
// Deploy using WarpModule
|
|
397
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
398
|
+
chain,
|
|
399
|
+
config,
|
|
400
|
+
multiProvider,
|
|
401
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
402
|
+
});
|
|
403
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
404
|
+
const expectedConfig = {
|
|
405
|
+
...actualConfig,
|
|
406
|
+
interchainSecurityModule,
|
|
407
|
+
};
|
|
408
|
+
await sendTxs(await evmERC20WarpModule.update(expectedConfig));
|
|
409
|
+
const updatedConfig = normalizeConfig((await evmERC20WarpModule.read()).interchainSecurityModule);
|
|
410
|
+
expect(updatedConfig).to.deep.equal(interchainSecurityModule);
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
it('should not deploy and set a new Ism if the config is the same', async () => {
|
|
414
|
+
const config = {
|
|
415
|
+
...baseConfig,
|
|
416
|
+
type: TokenType.native,
|
|
417
|
+
interchainSecurityModule: ismAddress,
|
|
418
|
+
};
|
|
419
|
+
// Deploy using WarpModule
|
|
420
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
421
|
+
chain,
|
|
422
|
+
config,
|
|
423
|
+
multiProvider,
|
|
424
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
425
|
+
});
|
|
426
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
427
|
+
const owner = randomAddress();
|
|
428
|
+
const interchainSecurityModule = {
|
|
429
|
+
type: IsmType.PAUSABLE,
|
|
430
|
+
owner,
|
|
431
|
+
paused: false,
|
|
432
|
+
};
|
|
433
|
+
const expectedConfig = {
|
|
434
|
+
...actualConfig,
|
|
435
|
+
interchainSecurityModule,
|
|
436
|
+
};
|
|
437
|
+
await sendTxs(await evmERC20WarpModule.update(expectedConfig));
|
|
438
|
+
const updatedConfig = normalizeConfig((await evmERC20WarpModule.read()).interchainSecurityModule);
|
|
439
|
+
expect(updatedConfig).to.deep.equal(interchainSecurityModule);
|
|
440
|
+
// Deploy with the same config
|
|
441
|
+
const txs = await evmERC20WarpModule.update(expectedConfig);
|
|
442
|
+
expect(txs.length).to.equal(0);
|
|
443
|
+
});
|
|
444
|
+
it('should update and set a new Hook based on config', async () => {
|
|
445
|
+
const config = {
|
|
446
|
+
...baseConfig,
|
|
447
|
+
type: TokenType.native,
|
|
448
|
+
};
|
|
449
|
+
// Deploy using WarpModule
|
|
450
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
451
|
+
chain,
|
|
452
|
+
config,
|
|
453
|
+
multiProvider,
|
|
454
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
455
|
+
});
|
|
456
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
457
|
+
for (const hook of hookConfigToUpdate) {
|
|
458
|
+
const expectedConfig = {
|
|
459
|
+
...actualConfig,
|
|
460
|
+
hook,
|
|
461
|
+
};
|
|
462
|
+
await sendTxs(await evmERC20WarpModule.update(expectedConfig));
|
|
463
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
464
|
+
expect(normalizeConfig(updatedConfig.hook)).to.deep.equal(hook);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
// The batch is submitted sequentially with no rollback, so a failure
|
|
468
|
+
// between the two installs is a state the route can be left in. Installing
|
|
469
|
+
// the hook first leaves the previous ISM verifying inbound messages;
|
|
470
|
+
// installing the ISM first can leave a hybrid hook/ISM gating delivery with
|
|
471
|
+
// nothing driving its postDispatch, which strands every message dispatched
|
|
472
|
+
// in that window.
|
|
473
|
+
it('installs the hook before the ISM when both change', async () => {
|
|
474
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
475
|
+
chain,
|
|
476
|
+
config: {
|
|
477
|
+
...baseConfig,
|
|
478
|
+
type: TokenType.native,
|
|
479
|
+
interchainSecurityModule: ismAddress,
|
|
480
|
+
},
|
|
481
|
+
multiProvider,
|
|
482
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
483
|
+
});
|
|
484
|
+
const { deployedTokenRoute } = evmERC20WarpModule.serialize();
|
|
485
|
+
const expectedConfig = {
|
|
486
|
+
...(await evmERC20WarpModule.read()),
|
|
487
|
+
interchainSecurityModule: {
|
|
488
|
+
type: IsmType.PAUSABLE,
|
|
489
|
+
owner: signer.address,
|
|
490
|
+
paused: false,
|
|
491
|
+
},
|
|
492
|
+
hook: { type: HookType.MERKLE_TREE },
|
|
493
|
+
};
|
|
494
|
+
const txs = await evmERC20WarpModule.update(expectedConfig);
|
|
495
|
+
const hookIndex = routerInstallIndex(txs, deployedTokenRoute, 'setHook');
|
|
496
|
+
const ismIndex = routerInstallIndex(txs, deployedTokenRoute, 'setInterchainSecurityModule');
|
|
497
|
+
expect(hookIndex).to.be.greaterThan(-1);
|
|
498
|
+
expect(ismIndex).to.be.greaterThan(-1);
|
|
499
|
+
expect(hookIndex).to.be.lessThan(ismIndex);
|
|
500
|
+
});
|
|
501
|
+
it('should set new deployed hook mailbox to WarpConfig.owner', async () => {
|
|
502
|
+
const config = {
|
|
503
|
+
...baseConfig,
|
|
504
|
+
type: TokenType.native,
|
|
505
|
+
};
|
|
506
|
+
// Deploy using WarpModule
|
|
507
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
508
|
+
chain,
|
|
509
|
+
config,
|
|
510
|
+
multiProvider,
|
|
511
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
512
|
+
});
|
|
513
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
514
|
+
const expectedConfig = {
|
|
515
|
+
...actualConfig,
|
|
516
|
+
hook: hookConfigToUpdate.find((c) => c.type === HookType.MERKLE_TREE),
|
|
517
|
+
};
|
|
518
|
+
await sendTxs(await evmERC20WarpModule.update(expectedConfig));
|
|
519
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
520
|
+
const hook = MailboxClient__factory.connect(derivedHookAddress(updatedConfig), multiProvider.getProvider(chain));
|
|
521
|
+
expect(await hook.mailbox()).to.equal(expectedConfig.mailbox);
|
|
522
|
+
});
|
|
523
|
+
it("should set Proxied Hook's proxyAdmins to WarpConfig.proxyAdmin", async () => {
|
|
524
|
+
const config = {
|
|
525
|
+
...baseConfig,
|
|
526
|
+
type: TokenType.native,
|
|
527
|
+
};
|
|
528
|
+
// Deploy using WarpModule
|
|
529
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
530
|
+
chain,
|
|
531
|
+
config,
|
|
532
|
+
multiProvider,
|
|
533
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
534
|
+
});
|
|
535
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
536
|
+
const expectedConfig = {
|
|
537
|
+
...actualConfig,
|
|
538
|
+
hook: hookConfigToUpdate.find((c) => c.type === HookType.INTERCHAIN_GAS_PAYMASTER),
|
|
539
|
+
};
|
|
540
|
+
await sendTxs(await evmERC20WarpModule.update(expectedConfig));
|
|
541
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
542
|
+
expect(await proxyAdmin(multiProvider.getProvider(chain), derivedHookAddress(updatedConfig))).to.equal(expectedConfig.proxyAdmin?.address);
|
|
543
|
+
});
|
|
544
|
+
it('should update a mutable Ism', async () => {
|
|
545
|
+
const ismConfig = {
|
|
546
|
+
type: IsmType.ROUTING,
|
|
547
|
+
owner: signer.address,
|
|
548
|
+
domains: {
|
|
549
|
+
'1': ismAddress,
|
|
550
|
+
},
|
|
551
|
+
};
|
|
552
|
+
const ism = await EvmIsmModule.create({
|
|
553
|
+
chain,
|
|
554
|
+
multiProvider,
|
|
555
|
+
config: ismConfig,
|
|
556
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
557
|
+
mailbox: mailbox.address,
|
|
558
|
+
});
|
|
559
|
+
const { deployedIsm } = ism.serialize();
|
|
560
|
+
// Deploy using WarpModule
|
|
561
|
+
const config = {
|
|
562
|
+
...baseConfig,
|
|
563
|
+
type: TokenType.native,
|
|
564
|
+
interchainSecurityModule: deployedIsm,
|
|
565
|
+
};
|
|
566
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
567
|
+
chain,
|
|
568
|
+
config,
|
|
569
|
+
multiProvider,
|
|
570
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
571
|
+
});
|
|
572
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
573
|
+
const expectedConfig = {
|
|
574
|
+
...actualConfig,
|
|
575
|
+
interchainSecurityModule: {
|
|
576
|
+
type: IsmType.ROUTING,
|
|
577
|
+
owner: randomAddress(),
|
|
578
|
+
domains: {
|
|
579
|
+
test2: { type: IsmType.TEST_ISM },
|
|
580
|
+
},
|
|
581
|
+
},
|
|
582
|
+
};
|
|
583
|
+
await sendTxs(await evmERC20WarpModule.update(expectedConfig));
|
|
584
|
+
const updatedConfig = normalizeConfig((await evmERC20WarpModule.read()).interchainSecurityModule);
|
|
585
|
+
expect(updatedConfig).to.deep.equal(expectedConfig.interchainSecurityModule);
|
|
586
|
+
});
|
|
587
|
+
it('should enroll connected routers', async () => {
|
|
588
|
+
const config = {
|
|
589
|
+
...baseConfig,
|
|
590
|
+
type: TokenType.native,
|
|
591
|
+
ismFactoryAddresses,
|
|
592
|
+
};
|
|
593
|
+
// Deploy using WarpModule
|
|
594
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
595
|
+
chain,
|
|
596
|
+
config: {
|
|
597
|
+
...config,
|
|
598
|
+
interchainSecurityModule: ismAddress,
|
|
599
|
+
},
|
|
600
|
+
multiProvider,
|
|
601
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
602
|
+
});
|
|
603
|
+
const numOfRouters = randomInt(10, 0);
|
|
604
|
+
await sendTxs(await evmERC20WarpModule.update({
|
|
605
|
+
...config,
|
|
606
|
+
remoteRouters: randomRemoteRouters(numOfRouters),
|
|
607
|
+
}));
|
|
608
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
609
|
+
expect(Object.keys(updatedConfig.remoteRouters).length).to.be.equal(numOfRouters);
|
|
610
|
+
});
|
|
611
|
+
it('should unenroll connected routers', async () => {
|
|
612
|
+
const config = {
|
|
613
|
+
...baseConfig,
|
|
614
|
+
type: TokenType.native,
|
|
615
|
+
ismFactoryAddresses,
|
|
616
|
+
};
|
|
617
|
+
// Deploy using WarpModule
|
|
618
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
619
|
+
chain,
|
|
620
|
+
config: {
|
|
621
|
+
...config,
|
|
622
|
+
interchainSecurityModule: ismAddress,
|
|
623
|
+
},
|
|
624
|
+
multiProvider,
|
|
625
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
626
|
+
});
|
|
627
|
+
const numOfRouters = randomInt(10, 0);
|
|
628
|
+
await sendTxs(await evmERC20WarpModule.update({
|
|
629
|
+
...config,
|
|
630
|
+
remoteRouters: randomRemoteRouters(numOfRouters),
|
|
631
|
+
}));
|
|
632
|
+
// Read config & delete remoteRouters
|
|
633
|
+
const existingConfig = await evmERC20WarpModule.read();
|
|
634
|
+
for (let i = 0; i < numOfRouters; i++) {
|
|
635
|
+
delete existingConfig.remoteRouters?.[i.toString()];
|
|
636
|
+
// Also remove corresponding destinationGas entry to stay consistent
|
|
637
|
+
if (existingConfig.destinationGas) {
|
|
638
|
+
delete existingConfig.destinationGas[i.toString()];
|
|
639
|
+
}
|
|
640
|
+
await sendTxs(await evmERC20WarpModule.update(existingConfig));
|
|
641
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
642
|
+
expect(Object.keys(updatedConfig.remoteRouters).length).to.be.equal(numOfRouters - (i + 1));
|
|
643
|
+
}
|
|
644
|
+
});
|
|
645
|
+
it('should replace an enrollment if they are new one different, if the config lengths are the same', async () => {
|
|
646
|
+
const config = {
|
|
647
|
+
...baseConfig,
|
|
648
|
+
type: TokenType.native,
|
|
649
|
+
ismFactoryAddresses,
|
|
650
|
+
};
|
|
651
|
+
// Deploy using WarpModule
|
|
652
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
653
|
+
chain,
|
|
654
|
+
config: {
|
|
655
|
+
...config,
|
|
656
|
+
interchainSecurityModule: ismAddress,
|
|
657
|
+
},
|
|
658
|
+
multiProvider,
|
|
659
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
660
|
+
});
|
|
661
|
+
const remoteRouters = randomRemoteRouters(1);
|
|
662
|
+
await sendTxs(await evmERC20WarpModule.update({
|
|
663
|
+
...config,
|
|
664
|
+
remoteRouters,
|
|
665
|
+
}));
|
|
666
|
+
let updatedConfig = await evmERC20WarpModule.read();
|
|
667
|
+
expect(Object.keys(updatedConfig.remoteRouters).length).to.be.equal(1);
|
|
668
|
+
// Try to extend with the same remoteRouters
|
|
669
|
+
let txs = await evmERC20WarpModule.update({
|
|
670
|
+
...config,
|
|
671
|
+
remoteRouters,
|
|
672
|
+
});
|
|
673
|
+
expect(txs.length).to.equal(0);
|
|
674
|
+
await sendTxs(txs);
|
|
675
|
+
// Try to extend with the different remoteRouters, but same length
|
|
676
|
+
const extendedRemoteRouter = {
|
|
677
|
+
3: {
|
|
678
|
+
address: randomAddress(),
|
|
679
|
+
},
|
|
680
|
+
};
|
|
681
|
+
txs = await evmERC20WarpModule.update({
|
|
682
|
+
...config,
|
|
683
|
+
remoteRouters: extendedRemoteRouter,
|
|
684
|
+
});
|
|
685
|
+
expect(txs.length).to.equal(2);
|
|
686
|
+
await sendTxs(txs);
|
|
687
|
+
updatedConfig = await evmERC20WarpModule.read();
|
|
688
|
+
expect(Object.keys(updatedConfig.remoteRouters).length).to.be.equal(1);
|
|
689
|
+
expect(updatedConfig.remoteRouters?.['3'].address.toLowerCase()).to.be.eq(addressToBytes32(extendedRemoteRouter['3'].address));
|
|
690
|
+
});
|
|
691
|
+
it('normalizes chain-name crossCollateralRouters keys for multicollateral enroll/unenroll txs', async () => {
|
|
692
|
+
const destinationDomain = multiProvider.getDomainId(TestChainName.test2);
|
|
693
|
+
const keepRouterAddress = '0x1111111111111111111111111111111111111111';
|
|
694
|
+
const keepRouter = addressToBytes32(keepRouterAddress);
|
|
695
|
+
const addRouterAddress = '0x2222222222222222222222222222222222222222';
|
|
696
|
+
const addRouter = addressToBytes32(addRouterAddress);
|
|
697
|
+
const removeRouterAddress = '0x3333333333333333333333333333333333333333';
|
|
698
|
+
const removeRouter = addressToBytes32(removeRouterAddress);
|
|
699
|
+
const module = new EvmWarpModule(multiProvider, {
|
|
700
|
+
chain,
|
|
701
|
+
config: {
|
|
702
|
+
...baseConfig,
|
|
703
|
+
type: TokenType.crossCollateral,
|
|
704
|
+
token: token.address,
|
|
705
|
+
},
|
|
706
|
+
addresses: {
|
|
707
|
+
deployedTokenRoute: randomAddress(),
|
|
708
|
+
},
|
|
709
|
+
});
|
|
710
|
+
const actualConfig = {
|
|
711
|
+
...baseConfig,
|
|
712
|
+
type: TokenType.crossCollateral,
|
|
713
|
+
token: token.address,
|
|
714
|
+
crossCollateralRouters: {
|
|
715
|
+
[destinationDomain]: [keepRouter, removeRouter],
|
|
716
|
+
},
|
|
717
|
+
};
|
|
718
|
+
const expectedConfig = {
|
|
719
|
+
...baseConfig,
|
|
720
|
+
type: TokenType.crossCollateral,
|
|
721
|
+
token: token.address,
|
|
722
|
+
crossCollateralRouters: {
|
|
723
|
+
[TestChainName.test2]: [keepRouterAddress.toUpperCase(), addRouter],
|
|
724
|
+
},
|
|
725
|
+
};
|
|
726
|
+
const enrollTxs = module.createEnrollCrossCollateralRoutersTxs(actualConfig, expectedConfig);
|
|
727
|
+
expect(enrollTxs.length).to.equal(1);
|
|
728
|
+
const [enrollDomains, enrollRouters] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('enrollCrossCollateralRouters', enrollTxs[0].data);
|
|
729
|
+
expect(enrollDomains.map(Number)).to.deep.equal([destinationDomain]);
|
|
730
|
+
expect(enrollRouters[0].toLowerCase()).to.equal(addRouter.toLowerCase());
|
|
731
|
+
const unenrollTxs = module.createUnenrollCrossCollateralRoutersTxs(actualConfig, expectedConfig);
|
|
732
|
+
expect(unenrollTxs.length).to.equal(1);
|
|
733
|
+
const [unenrollDomains, unenrollRouters] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('unenrollCrossCollateralRouters', unenrollTxs[0].data);
|
|
734
|
+
expect(unenrollDomains.map(Number)).to.deep.equal([destinationDomain]);
|
|
735
|
+
expect(unenrollRouters[0].toLowerCase()).to.equal(removeRouter.toLowerCase());
|
|
736
|
+
});
|
|
737
|
+
it('unenrolls all crossCollateralRouters when expected config omits crossCollateralRouters', async () => {
|
|
738
|
+
const destinationDomain = multiProvider.getDomainId(TestChainName.test2);
|
|
739
|
+
const routerOne = addressToBytes32('0x3333333333333333333333333333333333333333');
|
|
740
|
+
const routerTwo = addressToBytes32('0x4444444444444444444444444444444444444444');
|
|
741
|
+
const module = new EvmWarpModule(multiProvider, {
|
|
742
|
+
chain,
|
|
743
|
+
config: {
|
|
744
|
+
...baseConfig,
|
|
745
|
+
type: TokenType.crossCollateral,
|
|
746
|
+
token: token.address,
|
|
747
|
+
},
|
|
748
|
+
addresses: {
|
|
749
|
+
deployedTokenRoute: randomAddress(),
|
|
750
|
+
},
|
|
751
|
+
});
|
|
752
|
+
const actualConfig = {
|
|
753
|
+
...baseConfig,
|
|
754
|
+
type: TokenType.crossCollateral,
|
|
755
|
+
token: token.address,
|
|
756
|
+
crossCollateralRouters: {
|
|
757
|
+
[destinationDomain]: [routerOne, routerTwo],
|
|
758
|
+
},
|
|
759
|
+
};
|
|
760
|
+
const expectedConfig = {
|
|
761
|
+
...baseConfig,
|
|
762
|
+
type: TokenType.crossCollateral,
|
|
763
|
+
token: token.address,
|
|
764
|
+
};
|
|
765
|
+
const unenrollTxs = module.createUnenrollCrossCollateralRoutersTxs(actualConfig, expectedConfig);
|
|
766
|
+
expect(unenrollTxs.length).to.equal(1);
|
|
767
|
+
const [unenrollDomains, unenrollRouters] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('unenrollCrossCollateralRouters', unenrollTxs[0].data);
|
|
768
|
+
expect(unenrollDomains.map(Number)).to.deep.equal([
|
|
769
|
+
destinationDomain,
|
|
770
|
+
destinationDomain,
|
|
771
|
+
]);
|
|
772
|
+
expect(unenrollRouters.map((router) => router.toLowerCase()).sort()).to.deep.equal([routerOne.toLowerCase(), routerTwo.toLowerCase()].sort());
|
|
773
|
+
});
|
|
774
|
+
it('preserves canonical bytes32 rebalance targets and recipients', () => {
|
|
775
|
+
const localDomain = multiProvider.getDomainId(chain);
|
|
776
|
+
const target = addressToBytes32('0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
|
|
777
|
+
const recipient = addressToBytes32('0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb');
|
|
778
|
+
const module = new EvmWarpModule(multiProvider, {
|
|
779
|
+
chain,
|
|
780
|
+
config: {
|
|
781
|
+
...baseConfig,
|
|
782
|
+
type: TokenType.crossCollateral,
|
|
783
|
+
token: token.address,
|
|
784
|
+
},
|
|
785
|
+
addresses: {
|
|
786
|
+
...ismFactoryAddresses,
|
|
787
|
+
deployedTokenRoute: randomAddress(),
|
|
788
|
+
},
|
|
789
|
+
});
|
|
790
|
+
const actualConfig = {
|
|
791
|
+
...baseConfig,
|
|
792
|
+
hook: ethers.constants.AddressZero,
|
|
793
|
+
interchainSecurityModule: ethers.constants.AddressZero,
|
|
794
|
+
type: TokenType.crossCollateral,
|
|
795
|
+
token: token.address,
|
|
796
|
+
tokenFee: undefined,
|
|
797
|
+
rebalanceTargets: {},
|
|
798
|
+
rebalanceRecipients: {},
|
|
799
|
+
};
|
|
800
|
+
const expectedConfig = {
|
|
801
|
+
...baseConfig,
|
|
802
|
+
type: TokenType.crossCollateral,
|
|
803
|
+
token: token.address,
|
|
804
|
+
rebalanceTargets: { [localDomain]: [target] },
|
|
805
|
+
rebalanceRecipients: { [localDomain]: recipient },
|
|
806
|
+
};
|
|
807
|
+
const [targetTx] = module.createAddRebalanceTargetsUpdateTxs(actualConfig, expectedConfig);
|
|
808
|
+
assert(targetTx.data, 'Expected rebalance target calldata');
|
|
809
|
+
const [, decodedTarget] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('addRebalanceTarget(uint32,bytes32)', targetTx.data);
|
|
810
|
+
expect(decodedTarget.toLowerCase()).to.equal(target);
|
|
811
|
+
const [recipientTx] = module.createSetRecipientsUpdateTxs(actualConfig, expectedConfig);
|
|
812
|
+
assert(recipientTx.data, 'Expected rebalance recipient calldata');
|
|
813
|
+
const [, decodedRecipient] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('setRecipient(uint32,bytes32)', recipientTx.data);
|
|
814
|
+
expect(decodedRecipient.toLowerCase()).to.equal(recipient);
|
|
815
|
+
});
|
|
816
|
+
it('rejects rebalance domains that cannot be read back', () => {
|
|
817
|
+
const localDomain = multiProvider.getDomainId(chain);
|
|
818
|
+
const unknownDomain = localDomain + 1000;
|
|
819
|
+
const module = new EvmWarpModule(multiProvider, {
|
|
820
|
+
chain,
|
|
821
|
+
config: {
|
|
822
|
+
...baseConfig,
|
|
823
|
+
type: TokenType.crossCollateral,
|
|
824
|
+
token: token.address,
|
|
825
|
+
},
|
|
826
|
+
addresses: {
|
|
827
|
+
...ismFactoryAddresses,
|
|
828
|
+
deployedTokenRoute: randomAddress(),
|
|
829
|
+
},
|
|
830
|
+
});
|
|
831
|
+
const actualConfig = {
|
|
832
|
+
...baseConfig,
|
|
833
|
+
hook: ethers.constants.AddressZero,
|
|
834
|
+
interchainSecurityModule: ethers.constants.AddressZero,
|
|
835
|
+
type: TokenType.crossCollateral,
|
|
836
|
+
token: token.address,
|
|
837
|
+
tokenFee: undefined,
|
|
838
|
+
};
|
|
839
|
+
const expectedConfig = {
|
|
840
|
+
...baseConfig,
|
|
841
|
+
type: TokenType.crossCollateral,
|
|
842
|
+
token: token.address,
|
|
843
|
+
rebalanceTargets: {
|
|
844
|
+
[unknownDomain]: [addressToBytes32(randomAddress())],
|
|
845
|
+
},
|
|
846
|
+
};
|
|
847
|
+
expect(() => module.createAddRebalanceTargetsUpdateTxs(actualConfig, expectedConfig)).to.throw(`Rebalance domain ${unknownDomain}`);
|
|
848
|
+
});
|
|
849
|
+
it('removes stale rebalance config when expected fields are omitted', () => {
|
|
850
|
+
const localDomain = multiProvider.getDomainId(chain);
|
|
851
|
+
const target = addressToBytes32(randomAddress());
|
|
852
|
+
const recipient = addressToBytes32(randomAddress());
|
|
853
|
+
const module = new EvmWarpModule(multiProvider, {
|
|
854
|
+
chain,
|
|
855
|
+
config: {
|
|
856
|
+
...baseConfig,
|
|
857
|
+
type: TokenType.crossCollateral,
|
|
858
|
+
token: token.address,
|
|
859
|
+
},
|
|
860
|
+
addresses: {
|
|
861
|
+
...ismFactoryAddresses,
|
|
862
|
+
deployedTokenRoute: randomAddress(),
|
|
863
|
+
},
|
|
864
|
+
});
|
|
865
|
+
const actualConfig = {
|
|
866
|
+
...baseConfig,
|
|
867
|
+
hook: ethers.constants.AddressZero,
|
|
868
|
+
interchainSecurityModule: ethers.constants.AddressZero,
|
|
869
|
+
type: TokenType.crossCollateral,
|
|
870
|
+
token: token.address,
|
|
871
|
+
tokenFee: undefined,
|
|
872
|
+
rebalanceTargets: { [localDomain]: [target] },
|
|
873
|
+
rebalanceRecipients: { [localDomain]: recipient },
|
|
874
|
+
};
|
|
875
|
+
const expectedConfig = {
|
|
876
|
+
...baseConfig,
|
|
877
|
+
type: TokenType.crossCollateral,
|
|
878
|
+
token: token.address,
|
|
879
|
+
};
|
|
880
|
+
expect(module.createRemoveRebalanceTargetsTxs(actualConfig, expectedConfig)).to.have.length(1);
|
|
881
|
+
expect(module.createRemoveRecipientsTxs(actualConfig, expectedConfig)).to.have.length(1);
|
|
882
|
+
});
|
|
883
|
+
it('includes MC crossCollateralRouters domains in destination gas txs', async () => {
|
|
884
|
+
const destinationDomain = multiProvider.getDomainId(TestChainName.test2);
|
|
885
|
+
const enrolledRouter = addressToBytes32('0x4444444444444444444444444444444444444444');
|
|
886
|
+
const module = new EvmWarpModule(multiProvider, {
|
|
887
|
+
chain,
|
|
888
|
+
config: {
|
|
889
|
+
...baseConfig,
|
|
890
|
+
type: TokenType.crossCollateral,
|
|
891
|
+
token: token.address,
|
|
892
|
+
},
|
|
893
|
+
addresses: {
|
|
894
|
+
deployedTokenRoute: randomAddress(),
|
|
895
|
+
},
|
|
896
|
+
});
|
|
897
|
+
const actualConfig = {
|
|
898
|
+
...baseConfig,
|
|
899
|
+
type: TokenType.crossCollateral,
|
|
900
|
+
token: token.address,
|
|
901
|
+
destinationGas: {},
|
|
902
|
+
crossCollateralRouters: {
|
|
903
|
+
[destinationDomain]: [enrolledRouter],
|
|
904
|
+
},
|
|
905
|
+
};
|
|
906
|
+
// Config has destinationGas for test2, but no remoteRouters — only crossCollateralRouters
|
|
907
|
+
const expectedConfig = {
|
|
908
|
+
...baseConfig,
|
|
909
|
+
type: TokenType.crossCollateral,
|
|
910
|
+
token: token.address,
|
|
911
|
+
crossCollateralRouters: {
|
|
912
|
+
[TestChainName.test2]: [enrolledRouter],
|
|
913
|
+
},
|
|
914
|
+
destinationGas: {
|
|
915
|
+
[TestChainName.test2]: '200000',
|
|
916
|
+
},
|
|
917
|
+
};
|
|
918
|
+
const gasTxs = module.createSetDestinationGasUpdateTxs(actualConfig, expectedConfig);
|
|
919
|
+
// Should produce a tx (not throw) even without remoteRouters
|
|
920
|
+
expect(gasTxs.length).to.equal(1);
|
|
921
|
+
// Should use standard setDestinationGas (MC overrides _setDestinationGas)
|
|
922
|
+
const gasRouterIface = GasRouter__factory.createInterface();
|
|
923
|
+
const decoded = gasRouterIface.decodeFunctionData('setDestinationGas((uint32,uint256)[])', gasTxs[0].data);
|
|
924
|
+
expect(decoded[0].length).to.equal(1);
|
|
925
|
+
expect(decoded[0][0].domain).to.equal(destinationDomain);
|
|
926
|
+
expect(decoded[0][0].gas.toString()).to.equal('200000');
|
|
927
|
+
});
|
|
928
|
+
it('throws when destinationGas set but no remoteRouters or crossCollateralRouters', async () => {
|
|
929
|
+
const module = new EvmWarpModule(multiProvider, {
|
|
930
|
+
chain,
|
|
931
|
+
config: {
|
|
932
|
+
...baseConfig,
|
|
933
|
+
type: TokenType.collateral,
|
|
934
|
+
token: token.address,
|
|
935
|
+
},
|
|
936
|
+
addresses: {
|
|
937
|
+
deployedTokenRoute: randomAddress(),
|
|
938
|
+
},
|
|
939
|
+
});
|
|
940
|
+
const actualConfig = {
|
|
941
|
+
...baseConfig,
|
|
942
|
+
type: TokenType.collateral,
|
|
943
|
+
token: token.address,
|
|
944
|
+
destinationGas: {},
|
|
945
|
+
};
|
|
946
|
+
const expectedConfig = {
|
|
947
|
+
...baseConfig,
|
|
948
|
+
type: TokenType.collateral,
|
|
949
|
+
token: token.address,
|
|
950
|
+
destinationGas: {
|
|
951
|
+
[TestChainName.test2]: '200000',
|
|
952
|
+
},
|
|
953
|
+
};
|
|
954
|
+
expect(() => module.createSetDestinationGasUpdateTxs(actualConfig, expectedConfig)).to.throw(/remoteRouters and crossCollateralRouters are empty/);
|
|
955
|
+
});
|
|
956
|
+
it('should update the owner only if they are different', async () => {
|
|
957
|
+
const config = {
|
|
958
|
+
...baseConfig,
|
|
959
|
+
type: TokenType.native,
|
|
960
|
+
ismFactoryAddresses,
|
|
961
|
+
};
|
|
962
|
+
const owner = signer.address.toLowerCase();
|
|
963
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
964
|
+
chain,
|
|
965
|
+
config: {
|
|
966
|
+
...config,
|
|
967
|
+
interchainSecurityModule: ismAddress,
|
|
968
|
+
},
|
|
969
|
+
multiProvider,
|
|
970
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
971
|
+
});
|
|
972
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
973
|
+
expect(currentConfig.owner.toLowerCase()).to.equal(owner);
|
|
974
|
+
const newOwner = randomAddress();
|
|
975
|
+
await sendTxs(await evmERC20WarpModule.update({
|
|
976
|
+
...config,
|
|
977
|
+
owner: newOwner,
|
|
978
|
+
}));
|
|
979
|
+
const latestConfig = normalizeConfig(await evmERC20WarpModule.read());
|
|
980
|
+
expect(latestConfig.owner).to.equal(newOwner);
|
|
981
|
+
// No op if the same owner
|
|
982
|
+
const txs = await evmERC20WarpModule.update({
|
|
983
|
+
...config,
|
|
984
|
+
owner: newOwner,
|
|
985
|
+
});
|
|
986
|
+
expect(txs.length).to.equal(0);
|
|
987
|
+
});
|
|
988
|
+
it('should update the ProxyAdmin owner only if they are different', async () => {
|
|
989
|
+
const config = {
|
|
990
|
+
...baseConfig,
|
|
991
|
+
type: TokenType.native,
|
|
992
|
+
};
|
|
993
|
+
const owner = signer.address.toLowerCase();
|
|
994
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
995
|
+
chain,
|
|
996
|
+
config: {
|
|
997
|
+
...config,
|
|
998
|
+
interchainSecurityModule: ismAddress,
|
|
999
|
+
},
|
|
1000
|
+
multiProvider,
|
|
1001
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1002
|
+
});
|
|
1003
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1004
|
+
expect(currentConfig.proxyAdmin?.owner.toLowerCase()).to.equal(owner);
|
|
1005
|
+
const newOwner = randomAddress();
|
|
1006
|
+
const updatedWarpCoreConfig = {
|
|
1007
|
+
...config,
|
|
1008
|
+
proxyAdmin: {
|
|
1009
|
+
address: currentConfig.proxyAdmin.address,
|
|
1010
|
+
owner: newOwner,
|
|
1011
|
+
},
|
|
1012
|
+
};
|
|
1013
|
+
await sendTxs(await evmERC20WarpModule.update(updatedWarpCoreConfig));
|
|
1014
|
+
const latestConfig = normalizeConfig(await evmERC20WarpModule.read());
|
|
1015
|
+
expect(latestConfig.proxyAdmin?.owner).to.equal(newOwner);
|
|
1016
|
+
// Sanity check to be sure that the owner of the warp route token has not been updated if not changed
|
|
1017
|
+
expect(latestConfig.owner).to.equal(owner);
|
|
1018
|
+
// No op if the same owner
|
|
1019
|
+
const txs = await evmERC20WarpModule.update(updatedWarpCoreConfig);
|
|
1020
|
+
expect(txs.length).to.equal(0);
|
|
1021
|
+
});
|
|
1022
|
+
it('should reuse a configured ProxyAdmin timelock', async () => {
|
|
1023
|
+
const config = {
|
|
1024
|
+
...baseConfig,
|
|
1025
|
+
type: TokenType.native,
|
|
1026
|
+
};
|
|
1027
|
+
const evmWarpModule = await EvmWarpModule.create({
|
|
1028
|
+
chain,
|
|
1029
|
+
config: {
|
|
1030
|
+
...config,
|
|
1031
|
+
interchainSecurityModule: ismAddress,
|
|
1032
|
+
},
|
|
1033
|
+
multiProvider,
|
|
1034
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1035
|
+
});
|
|
1036
|
+
const timelockConfig = {
|
|
1037
|
+
delay: 259_200,
|
|
1038
|
+
roles: {
|
|
1039
|
+
proposer: signer.address,
|
|
1040
|
+
executor: signer.address,
|
|
1041
|
+
},
|
|
1042
|
+
};
|
|
1043
|
+
const firstUpdate = await evmWarpModule.updateSplit({
|
|
1044
|
+
...config,
|
|
1045
|
+
timelock: timelockConfig,
|
|
1046
|
+
});
|
|
1047
|
+
expect(firstUpdate.ownershipTxs.length).to.equal(1);
|
|
1048
|
+
await sendTxs(firstUpdate.ownershipTxs);
|
|
1049
|
+
const secondUpdate = await evmWarpModule.updateSplit({
|
|
1050
|
+
...config,
|
|
1051
|
+
timelock: timelockConfig,
|
|
1052
|
+
});
|
|
1053
|
+
expect(secondUpdate.txs).to.be.empty;
|
|
1054
|
+
expect(secondUpdate.feeTxs).to.be.empty;
|
|
1055
|
+
expect(secondUpdate.ownershipTxs).to.be.empty;
|
|
1056
|
+
});
|
|
1057
|
+
it('should update the destination gas', async () => {
|
|
1058
|
+
const domain = 3;
|
|
1059
|
+
const config = {
|
|
1060
|
+
...baseConfig,
|
|
1061
|
+
type: TokenType.native,
|
|
1062
|
+
remoteRouters: {
|
|
1063
|
+
[domain]: {
|
|
1064
|
+
address: randomAddress(),
|
|
1065
|
+
},
|
|
1066
|
+
},
|
|
1067
|
+
};
|
|
1068
|
+
// Deploy using WarpModule
|
|
1069
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1070
|
+
chain,
|
|
1071
|
+
config: {
|
|
1072
|
+
...config,
|
|
1073
|
+
},
|
|
1074
|
+
multiProvider,
|
|
1075
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1076
|
+
});
|
|
1077
|
+
await sendTxs(await evmERC20WarpModule.update({
|
|
1078
|
+
...config,
|
|
1079
|
+
destinationGas: {
|
|
1080
|
+
[domain]: '5000',
|
|
1081
|
+
},
|
|
1082
|
+
}));
|
|
1083
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
1084
|
+
expect(Object.keys(updatedConfig.destinationGas).length).to.be.equal(1);
|
|
1085
|
+
expect(updatedConfig.destinationGas[domain]).to.equal('5000');
|
|
1086
|
+
});
|
|
1087
|
+
it('should update the feeHook', async () => {
|
|
1088
|
+
const config = {
|
|
1089
|
+
...baseConfig,
|
|
1090
|
+
type: TokenType.synthetic,
|
|
1091
|
+
name: TOKEN_NAME,
|
|
1092
|
+
symbol: TOKEN_NAME,
|
|
1093
|
+
decimals: TOKEN_DECIMALS,
|
|
1094
|
+
};
|
|
1095
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1096
|
+
chain,
|
|
1097
|
+
config,
|
|
1098
|
+
multiProvider,
|
|
1099
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1100
|
+
});
|
|
1101
|
+
// Verify no feeHook initially
|
|
1102
|
+
const initialConfig = await evmERC20WarpModule.read();
|
|
1103
|
+
expect(initialConfig.feeHook).to.be.undefined;
|
|
1104
|
+
// Set feeHook to a random address
|
|
1105
|
+
const feeHookAddress = randomAddress();
|
|
1106
|
+
const txs = await evmERC20WarpModule.update({
|
|
1107
|
+
...config,
|
|
1108
|
+
feeHook: feeHookAddress,
|
|
1109
|
+
});
|
|
1110
|
+
expect(txs.length).to.equal(1);
|
|
1111
|
+
await sendTxs(txs);
|
|
1112
|
+
// Verify feeHook was set
|
|
1113
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
1114
|
+
assert(updatedConfig.feeHook != null, 'feeHook should be set');
|
|
1115
|
+
expect(eqAddress(updatedConfig.feeHook, feeHookAddress)).to.be.true;
|
|
1116
|
+
});
|
|
1117
|
+
for (const tokenType of movableCollateralTypes) {
|
|
1118
|
+
it(`should add a new rebalancer on the deployed token if it is of type "${tokenType}"`, async () => {
|
|
1119
|
+
const initialRebalancer = randomAddress();
|
|
1120
|
+
const config = deepCopy(getMovableTokenConfig([initialRebalancer])[tokenType]);
|
|
1121
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1122
|
+
chain,
|
|
1123
|
+
config,
|
|
1124
|
+
multiProvider,
|
|
1125
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1126
|
+
});
|
|
1127
|
+
const expectedRebalancers = [initialRebalancer, randomAddress()];
|
|
1128
|
+
const txs = await evmERC20WarpModule.update({
|
|
1129
|
+
...config,
|
|
1130
|
+
allowedRebalancers: expectedRebalancers,
|
|
1131
|
+
});
|
|
1132
|
+
expect(txs.length).to.equal(1);
|
|
1133
|
+
await sendTxs(txs);
|
|
1134
|
+
await assertAllowedRebalancers(evmERC20WarpModule, expectedRebalancers);
|
|
1135
|
+
});
|
|
1136
|
+
it(`should remove a rebalancer on the deployed token if the token is of type "${tokenType}"`, async () => {
|
|
1137
|
+
const rebalancerToKeep = randomAddress();
|
|
1138
|
+
const expectedRebalancers = [rebalancerToKeep];
|
|
1139
|
+
const rebalancers = new Set([rebalancerToKeep, randomAddress()]);
|
|
1140
|
+
const config = deepCopy(getMovableTokenConfig(Array.from(rebalancers))[tokenType]);
|
|
1141
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1142
|
+
chain,
|
|
1143
|
+
config,
|
|
1144
|
+
multiProvider,
|
|
1145
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1146
|
+
});
|
|
1147
|
+
const txs = await evmERC20WarpModule.update({
|
|
1148
|
+
...config,
|
|
1149
|
+
allowedRebalancers: expectedRebalancers,
|
|
1150
|
+
});
|
|
1151
|
+
expect(txs.length).to.equal(1);
|
|
1152
|
+
await sendTxs(txs);
|
|
1153
|
+
await assertAllowedRebalancers(evmERC20WarpModule, expectedRebalancers);
|
|
1154
|
+
});
|
|
1155
|
+
it(`should not generate rebalancer update transactions if the address is in a different casing when token is of type "${tokenType}"`, async () => {
|
|
1156
|
+
const rebalancerToKeep = randomAddress();
|
|
1157
|
+
const config = deepCopy(getMovableTokenConfig([rebalancerToKeep.toLowerCase()])[tokenType]);
|
|
1158
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1159
|
+
chain,
|
|
1160
|
+
config,
|
|
1161
|
+
multiProvider,
|
|
1162
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1163
|
+
});
|
|
1164
|
+
const txs = await evmERC20WarpModule.update({
|
|
1165
|
+
...config,
|
|
1166
|
+
allowedRebalancers: [rebalancerToKeep],
|
|
1167
|
+
});
|
|
1168
|
+
expect(txs.length).to.equal(0);
|
|
1169
|
+
});
|
|
1170
|
+
it(`should add the specified addresses as rebalancing bridges for tokens of type "${tokenType}"`, async () => {
|
|
1171
|
+
const movableTokenConfigs = getMovableTokenConfig();
|
|
1172
|
+
const config = {
|
|
1173
|
+
...movableTokenConfigs[tokenType],
|
|
1174
|
+
remoteRouters: {
|
|
1175
|
+
[domainId]: {
|
|
1176
|
+
address: randomAddress(),
|
|
1177
|
+
},
|
|
1178
|
+
},
|
|
1179
|
+
};
|
|
1180
|
+
const allowedBridgeToAdd = normalizeAddressEvm(randomAddress());
|
|
1181
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1182
|
+
chain,
|
|
1183
|
+
config,
|
|
1184
|
+
multiProvider,
|
|
1185
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1186
|
+
});
|
|
1187
|
+
// Spoof a new (post-legacy) impl so `approvedTokens` are ignored: the new
|
|
1188
|
+
// router grants allowances per rebalance, so only the addBridge tx is emitted.
|
|
1189
|
+
const versionStub = sinon
|
|
1190
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
1191
|
+
.resolves('12.0.0');
|
|
1192
|
+
const txs = await evmERC20WarpModule.update(HypTokenRouterConfigSchema.parse({
|
|
1193
|
+
...config,
|
|
1194
|
+
allowedRebalancingBridges: {
|
|
1195
|
+
[domainId]: [
|
|
1196
|
+
{
|
|
1197
|
+
bridge: allowedBridgeToAdd,
|
|
1198
|
+
approvedTokens: [feeToken.address],
|
|
1199
|
+
},
|
|
1200
|
+
],
|
|
1201
|
+
},
|
|
1202
|
+
}));
|
|
1203
|
+
versionStub.restore();
|
|
1204
|
+
expect(txs.length).to.equal(1);
|
|
1205
|
+
await sendTxs(txs);
|
|
1206
|
+
const warpTokenInstance = MovableCollateralRouter__factory.connect(evmERC20WarpModule.serialize().deployedTokenRoute, signer);
|
|
1207
|
+
const check = await warpTokenInstance.callStatic.allowedBridges(domainId);
|
|
1208
|
+
expect(check[0]).to.eql(allowedBridgeToAdd);
|
|
1209
|
+
const allowance = await feeToken.callStatic.allowance(evmERC20WarpModule.serialize().deployedTokenRoute, allowedBridgeToAdd);
|
|
1210
|
+
expect(allowance.toBigInt()).to.equal(0n);
|
|
1211
|
+
});
|
|
1212
|
+
it(`should remove rebalancing bridges for tokens of type "${tokenType}"`, async () => {
|
|
1213
|
+
const allowedBridgeToAdd = normalizeAddressEvm(randomAddress());
|
|
1214
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1215
|
+
...getMovableTokenConfig()[tokenType],
|
|
1216
|
+
remoteRouters: {
|
|
1217
|
+
[domainId]: {
|
|
1218
|
+
address: randomAddress(),
|
|
1219
|
+
},
|
|
1220
|
+
},
|
|
1221
|
+
allowedRebalancingBridges: {
|
|
1222
|
+
[domainId]: [
|
|
1223
|
+
{
|
|
1224
|
+
bridge: allowedBridgeToAdd,
|
|
1225
|
+
},
|
|
1226
|
+
],
|
|
1227
|
+
},
|
|
1228
|
+
});
|
|
1229
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1230
|
+
chain,
|
|
1231
|
+
config,
|
|
1232
|
+
multiProvider,
|
|
1233
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1234
|
+
});
|
|
1235
|
+
const txs = await evmERC20WarpModule.update(HypTokenRouterConfigSchema.parse({
|
|
1236
|
+
...config,
|
|
1237
|
+
allowedRebalancingBridges: {
|
|
1238
|
+
[domainId]: [],
|
|
1239
|
+
},
|
|
1240
|
+
}));
|
|
1241
|
+
// 1 tx to remove the bridge
|
|
1242
|
+
expect(txs.length).to.equal(1);
|
|
1243
|
+
await sendTxs(txs);
|
|
1244
|
+
const warpTokenInstance = MovableCollateralRouter__factory.connect(evmERC20WarpModule.serialize().deployedTokenRoute, signer);
|
|
1245
|
+
const allowedBridges = await warpTokenInstance.callStatic.allowedBridges(domainId);
|
|
1246
|
+
expect(allowedBridges).to.be.empty;
|
|
1247
|
+
});
|
|
1248
|
+
// Only collateral routes back the router with an ERC20 that could carry a
|
|
1249
|
+
// legacy standing allowance; native routes never had approvals.
|
|
1250
|
+
if (tokenType === TokenType.collateral) {
|
|
1251
|
+
// Plants a legacy type(uint256).max standing allowance from the router to
|
|
1252
|
+
// `bridge`, mimicking the pre-upgrade on-chain state left by `_addBridge`
|
|
1253
|
+
// (collateral token) or the legacy approvedTokens grant path (any token).
|
|
1254
|
+
const plantLegacyAllowance = async (router, bridge, erc20 = token) => {
|
|
1255
|
+
await hre.network.provider.request({
|
|
1256
|
+
method: 'hardhat_impersonateAccount',
|
|
1257
|
+
params: [router],
|
|
1258
|
+
});
|
|
1259
|
+
await hre.network.provider.request({
|
|
1260
|
+
method: 'hardhat_setBalance',
|
|
1261
|
+
params: [router, '0xDE0B6B3A7640000'],
|
|
1262
|
+
});
|
|
1263
|
+
const routerSigner = hre.ethers.provider.getSigner(router);
|
|
1264
|
+
await erc20
|
|
1265
|
+
.connect(routerSigner)
|
|
1266
|
+
.approve(bridge, ethers.constants.MaxUint256);
|
|
1267
|
+
await hre.network.provider.request({
|
|
1268
|
+
method: 'hardhat_stopImpersonatingAccount',
|
|
1269
|
+
params: [router],
|
|
1270
|
+
});
|
|
1271
|
+
};
|
|
1272
|
+
it(`should revoke a legacy standing bridge allowance during an in-place upgrade for a route of type "${tokenType}"`, async () => {
|
|
1273
|
+
const allowedBridge = normalizeAddressEvm(randomAddress());
|
|
1274
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1275
|
+
...getMovableTokenConfig()[tokenType],
|
|
1276
|
+
remoteRouters: {
|
|
1277
|
+
[domainId]: {
|
|
1278
|
+
address: randomAddress(),
|
|
1279
|
+
},
|
|
1280
|
+
},
|
|
1281
|
+
allowedRebalancingBridges: {
|
|
1282
|
+
[domainId]: [
|
|
1283
|
+
{
|
|
1284
|
+
bridge: allowedBridge,
|
|
1285
|
+
},
|
|
1286
|
+
],
|
|
1287
|
+
},
|
|
1288
|
+
});
|
|
1289
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1290
|
+
chain,
|
|
1291
|
+
config,
|
|
1292
|
+
multiProvider,
|
|
1293
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1294
|
+
});
|
|
1295
|
+
const router = evmERC20WarpModule.serialize().deployedTokenRoute;
|
|
1296
|
+
await plantLegacyAllowance(router, allowedBridge);
|
|
1297
|
+
expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(ethers.constants.MaxUint256.toBigInt());
|
|
1298
|
+
// Spoof an old (pre-revoke-semantics) impl so update() generates an
|
|
1299
|
+
// upgrade tx and the revoke gate opens. fetchScale is stubbed because
|
|
1300
|
+
// old contracts (< 11.0.0) default scale to 1.
|
|
1301
|
+
const versionStub = sinon
|
|
1302
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
1303
|
+
.resolves('11.3.0');
|
|
1304
|
+
const scaleStub = sinon
|
|
1305
|
+
.stub(evmERC20WarpModule.reader, 'fetchScale')
|
|
1306
|
+
.resolves(undefined);
|
|
1307
|
+
const txs = await evmERC20WarpModule.update({
|
|
1308
|
+
...config,
|
|
1309
|
+
contractVersion: CONTRACTS_PACKAGE_VERSION,
|
|
1310
|
+
});
|
|
1311
|
+
await sendTxs(txs);
|
|
1312
|
+
versionStub.restore();
|
|
1313
|
+
scaleStub.restore();
|
|
1314
|
+
// The revoke runs against the new impl after the upgrade tx.
|
|
1315
|
+
expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(0n);
|
|
1316
|
+
});
|
|
1317
|
+
it(`should revoke a legacy approvedTokens allowance during an in-place upgrade for a route of type "${tokenType}"`, async () => {
|
|
1318
|
+
const allowedBridge = normalizeAddressEvm(randomAddress());
|
|
1319
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1320
|
+
...getMovableTokenConfig()[tokenType],
|
|
1321
|
+
remoteRouters: {
|
|
1322
|
+
[domainId]: {
|
|
1323
|
+
address: randomAddress(),
|
|
1324
|
+
},
|
|
1325
|
+
},
|
|
1326
|
+
allowedRebalancingBridges: {
|
|
1327
|
+
[domainId]: [
|
|
1328
|
+
{
|
|
1329
|
+
bridge: allowedBridge,
|
|
1330
|
+
approvedTokens: [feeToken.address],
|
|
1331
|
+
},
|
|
1332
|
+
],
|
|
1333
|
+
},
|
|
1334
|
+
});
|
|
1335
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1336
|
+
chain,
|
|
1337
|
+
config,
|
|
1338
|
+
multiProvider,
|
|
1339
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1340
|
+
});
|
|
1341
|
+
const router = evmERC20WarpModule.serialize().deployedTokenRoute;
|
|
1342
|
+
// Plant legacy max allowances on BOTH the collateral token and the
|
|
1343
|
+
// approvedToken, mimicking the pre-upgrade grants for a remaining bridge.
|
|
1344
|
+
await plantLegacyAllowance(router, allowedBridge);
|
|
1345
|
+
await plantLegacyAllowance(router, allowedBridge, feeToken);
|
|
1346
|
+
// Spoof an old impl so update() generates an upgrade and the revoke gate opens.
|
|
1347
|
+
const versionStub = sinon
|
|
1348
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
1349
|
+
.resolves('11.3.0');
|
|
1350
|
+
const scaleStub = sinon
|
|
1351
|
+
.stub(evmERC20WarpModule.reader, 'fetchScale')
|
|
1352
|
+
.resolves(undefined);
|
|
1353
|
+
const txs = await evmERC20WarpModule.update({
|
|
1354
|
+
...config,
|
|
1355
|
+
contractVersion: CONTRACTS_PACKAGE_VERSION,
|
|
1356
|
+
});
|
|
1357
|
+
await sendTxs(txs);
|
|
1358
|
+
versionStub.restore();
|
|
1359
|
+
scaleStub.restore();
|
|
1360
|
+
// Both the collateral and the approvedToken allowance are cleared post-upgrade.
|
|
1361
|
+
expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(0n);
|
|
1362
|
+
expect((await feeToken.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(0n);
|
|
1363
|
+
});
|
|
1364
|
+
it(`should not emit a revoke tx when no upgrade is generated for a route of type "${tokenType}"`, async () => {
|
|
1365
|
+
const allowedBridge = normalizeAddressEvm(randomAddress());
|
|
1366
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1367
|
+
...getMovableTokenConfig()[tokenType],
|
|
1368
|
+
remoteRouters: {
|
|
1369
|
+
[domainId]: {
|
|
1370
|
+
address: randomAddress(),
|
|
1371
|
+
},
|
|
1372
|
+
},
|
|
1373
|
+
allowedRebalancingBridges: {
|
|
1374
|
+
[domainId]: [
|
|
1375
|
+
{
|
|
1376
|
+
bridge: allowedBridge,
|
|
1377
|
+
},
|
|
1378
|
+
],
|
|
1379
|
+
},
|
|
1380
|
+
});
|
|
1381
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1382
|
+
chain,
|
|
1383
|
+
config,
|
|
1384
|
+
multiProvider,
|
|
1385
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1386
|
+
});
|
|
1387
|
+
const router = evmERC20WarpModule.serialize().deployedTokenRoute;
|
|
1388
|
+
// Plant a legacy allowance so a stray revoke would be visible.
|
|
1389
|
+
await plantLegacyAllowance(router, allowedBridge);
|
|
1390
|
+
// Keep the fixture on a legacy version. With no contractVersion bump,
|
|
1391
|
+
// update() generates no upgrade tx and the revoke gate stays closed.
|
|
1392
|
+
const versionStub = sinon
|
|
1393
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
1394
|
+
.resolves(MAX_LEGACY_BRIDGE_APPROVAL_VERSION);
|
|
1395
|
+
const txs = await evmERC20WarpModule.update(config);
|
|
1396
|
+
await sendTxs(txs);
|
|
1397
|
+
versionStub.restore();
|
|
1398
|
+
// The legacy allowance is untouched (revoke must run only post-upgrade).
|
|
1399
|
+
expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(ethers.constants.MaxUint256.toBigInt());
|
|
1400
|
+
});
|
|
1401
|
+
it(`should revoke a stale allowance on an already-upgraded impl with no scheduled upgrade for a route of type "${tokenType}"`, async () => {
|
|
1402
|
+
const allowedBridge = normalizeAddressEvm(randomAddress());
|
|
1403
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1404
|
+
...getMovableTokenConfig()[tokenType],
|
|
1405
|
+
remoteRouters: {
|
|
1406
|
+
[domainId]: {
|
|
1407
|
+
address: randomAddress(),
|
|
1408
|
+
},
|
|
1409
|
+
},
|
|
1410
|
+
allowedRebalancingBridges: {
|
|
1411
|
+
[domainId]: [
|
|
1412
|
+
{
|
|
1413
|
+
bridge: allowedBridge,
|
|
1414
|
+
},
|
|
1415
|
+
],
|
|
1416
|
+
},
|
|
1417
|
+
});
|
|
1418
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1419
|
+
chain,
|
|
1420
|
+
config,
|
|
1421
|
+
multiProvider,
|
|
1422
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1423
|
+
});
|
|
1424
|
+
const router = evmERC20WarpModule.serialize().deployedTokenRoute;
|
|
1425
|
+
// A stale legacy allowance left by a prior run that upgraded the impl but
|
|
1426
|
+
// whose revoke txs never executed.
|
|
1427
|
+
await plantLegacyAllowance(router, allowedBridge);
|
|
1428
|
+
// Spoof the on-chain version above the legacy bound (already upgraded).
|
|
1429
|
+
const versionStub = sinon
|
|
1430
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
1431
|
+
.resolves('12.0.0');
|
|
1432
|
+
const scaleStub = sinon
|
|
1433
|
+
.stub(evmERC20WarpModule.reader, 'fetchScale')
|
|
1434
|
+
.resolves(undefined);
|
|
1435
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
1436
|
+
versionStub.restore();
|
|
1437
|
+
scaleStub.restore();
|
|
1438
|
+
// No upgrade scheduled this run, but the stale allowance must still be
|
|
1439
|
+
// cleaned up — the revoke runs against the already-new impl. This keeps
|
|
1440
|
+
// cleanup retryable after a partially-executed upgrade.
|
|
1441
|
+
const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, config, false);
|
|
1442
|
+
expect(revokeTxs.length).to.equal(1);
|
|
1443
|
+
await sendTxs(revokeTxs);
|
|
1444
|
+
expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(0n);
|
|
1445
|
+
});
|
|
1446
|
+
it(`should not emit a revoke tx on an already-upgraded impl with no stale allowance for a route of type "${tokenType}"`, async () => {
|
|
1447
|
+
const allowedBridge = normalizeAddressEvm(randomAddress());
|
|
1448
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1449
|
+
...getMovableTokenConfig()[tokenType],
|
|
1450
|
+
remoteRouters: {
|
|
1451
|
+
[domainId]: {
|
|
1452
|
+
address: randomAddress(),
|
|
1453
|
+
},
|
|
1454
|
+
},
|
|
1455
|
+
allowedRebalancingBridges: {
|
|
1456
|
+
[domainId]: [
|
|
1457
|
+
{
|
|
1458
|
+
bridge: allowedBridge,
|
|
1459
|
+
},
|
|
1460
|
+
],
|
|
1461
|
+
},
|
|
1462
|
+
});
|
|
1463
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1464
|
+
chain,
|
|
1465
|
+
config,
|
|
1466
|
+
multiProvider,
|
|
1467
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1468
|
+
});
|
|
1469
|
+
// No allowance is planted: a clean already-upgraded router has nothing
|
|
1470
|
+
// stale, so the non-zero allowance filter emits no revoke tx.
|
|
1471
|
+
const versionStub = sinon
|
|
1472
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
1473
|
+
.resolves('12.0.0');
|
|
1474
|
+
const scaleStub = sinon
|
|
1475
|
+
.stub(evmERC20WarpModule.reader, 'fetchScale')
|
|
1476
|
+
.resolves(undefined);
|
|
1477
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
1478
|
+
versionStub.restore();
|
|
1479
|
+
scaleStub.restore();
|
|
1480
|
+
const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, config, false);
|
|
1481
|
+
expect(revokeTxs).to.be.empty;
|
|
1482
|
+
});
|
|
1483
|
+
it(`should not emit a revoke tx for a removed bridge (handled on-chain by _removeBridge) for a route of type "${tokenType}"`, async () => {
|
|
1484
|
+
const removedBridge = normalizeAddressEvm(randomAddress());
|
|
1485
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1486
|
+
...getMovableTokenConfig()[tokenType],
|
|
1487
|
+
remoteRouters: {
|
|
1488
|
+
[domainId]: {
|
|
1489
|
+
address: randomAddress(),
|
|
1490
|
+
},
|
|
1491
|
+
},
|
|
1492
|
+
allowedRebalancingBridges: {
|
|
1493
|
+
[domainId]: [
|
|
1494
|
+
{
|
|
1495
|
+
bridge: removedBridge,
|
|
1496
|
+
},
|
|
1497
|
+
],
|
|
1498
|
+
},
|
|
1499
|
+
});
|
|
1500
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1501
|
+
chain,
|
|
1502
|
+
config,
|
|
1503
|
+
multiProvider,
|
|
1504
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1505
|
+
});
|
|
1506
|
+
const router = evmERC20WarpModule.serialize().deployedTokenRoute;
|
|
1507
|
+
// Give the bridge a legacy standing allowance so a stray revoke would be visible.
|
|
1508
|
+
await plantLegacyAllowance(router, removedBridge);
|
|
1509
|
+
// The bridge is dropped from the expected config: _removeBridge revokes it
|
|
1510
|
+
// on-chain, so this method must not emit a revoke tx for it (intersection
|
|
1511
|
+
// of actual and expected allowlisted bridges is empty).
|
|
1512
|
+
const expectedConfig = HypTokenRouterConfigSchema.parse({
|
|
1513
|
+
...config,
|
|
1514
|
+
allowedRebalancingBridges: {
|
|
1515
|
+
[domainId]: [],
|
|
1516
|
+
},
|
|
1517
|
+
});
|
|
1518
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
1519
|
+
const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, expectedConfig, true);
|
|
1520
|
+
expect(revokeTxs).to.be.empty;
|
|
1521
|
+
});
|
|
1522
|
+
it(`should not emit a revoke tx for a newly-added bridge for a route of type "${tokenType}"`, async () => {
|
|
1523
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1524
|
+
...getMovableTokenConfig()[tokenType],
|
|
1525
|
+
remoteRouters: {
|
|
1526
|
+
[domainId]: {
|
|
1527
|
+
address: randomAddress(),
|
|
1528
|
+
},
|
|
1529
|
+
},
|
|
1530
|
+
allowedRebalancingBridges: {
|
|
1531
|
+
[domainId]: [],
|
|
1532
|
+
},
|
|
1533
|
+
});
|
|
1534
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1535
|
+
chain,
|
|
1536
|
+
config,
|
|
1537
|
+
multiProvider,
|
|
1538
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1539
|
+
});
|
|
1540
|
+
// A bridge present in expected but not in actual is brand new; it never held
|
|
1541
|
+
// a legacy allowance, so no revoke tx should be emitted for it.
|
|
1542
|
+
const addedBridge = normalizeAddressEvm(randomAddress());
|
|
1543
|
+
const expectedConfig = HypTokenRouterConfigSchema.parse({
|
|
1544
|
+
...config,
|
|
1545
|
+
allowedRebalancingBridges: {
|
|
1546
|
+
[domainId]: [
|
|
1547
|
+
{
|
|
1548
|
+
bridge: addedBridge,
|
|
1549
|
+
},
|
|
1550
|
+
],
|
|
1551
|
+
},
|
|
1552
|
+
});
|
|
1553
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
1554
|
+
const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, expectedConfig, true);
|
|
1555
|
+
expect(revokeTxs).to.be.empty;
|
|
1556
|
+
});
|
|
1557
|
+
it(`should revoke a stale allowance for a bridge moved between domains for a route of type "${tokenType}"`, async () => {
|
|
1558
|
+
const movedBridge = normalizeAddressEvm(randomAddress());
|
|
1559
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1560
|
+
...getMovableTokenConfig()[tokenType],
|
|
1561
|
+
remoteRouters: {
|
|
1562
|
+
[domainId]: {
|
|
1563
|
+
address: randomAddress(),
|
|
1564
|
+
},
|
|
1565
|
+
},
|
|
1566
|
+
allowedRebalancingBridges: {
|
|
1567
|
+
[domainId]: [
|
|
1568
|
+
{
|
|
1569
|
+
bridge: movedBridge,
|
|
1570
|
+
approvedTokens: [feeToken.address],
|
|
1571
|
+
},
|
|
1572
|
+
],
|
|
1573
|
+
},
|
|
1574
|
+
});
|
|
1575
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1576
|
+
chain,
|
|
1577
|
+
config,
|
|
1578
|
+
multiProvider,
|
|
1579
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1580
|
+
});
|
|
1581
|
+
const router = evmERC20WarpModule.serialize().deployedTokenRoute;
|
|
1582
|
+
// Legacy allowances on both the collateral and the approvedToken.
|
|
1583
|
+
await plantLegacyAllowance(router, movedBridge);
|
|
1584
|
+
await plantLegacyAllowance(router, movedBridge, feeToken);
|
|
1585
|
+
// Expected config keeps the same bridge but on a different domain. ERC20
|
|
1586
|
+
// allowances are (router, bridge) and domain-agnostic, so the stale
|
|
1587
|
+
// allowance must still be revoked despite the move.
|
|
1588
|
+
const otherChain = TestChainName.test2;
|
|
1589
|
+
const expectedConfig = HypTokenRouterConfigSchema.parse({
|
|
1590
|
+
...config,
|
|
1591
|
+
remoteRouters: {
|
|
1592
|
+
[domainId]: {
|
|
1593
|
+
address: randomAddress(),
|
|
1594
|
+
},
|
|
1595
|
+
[otherChain]: {
|
|
1596
|
+
address: randomAddress(),
|
|
1597
|
+
},
|
|
1598
|
+
},
|
|
1599
|
+
allowedRebalancingBridges: {
|
|
1600
|
+
[otherChain]: [
|
|
1601
|
+
{
|
|
1602
|
+
bridge: movedBridge,
|
|
1603
|
+
approvedTokens: [feeToken.address],
|
|
1604
|
+
},
|
|
1605
|
+
],
|
|
1606
|
+
},
|
|
1607
|
+
});
|
|
1608
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
1609
|
+
const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, expectedConfig, true);
|
|
1610
|
+
const revokedTokens = revokeTxs.map((tx) => {
|
|
1611
|
+
assert(tx.data, 'expected revoke calldata');
|
|
1612
|
+
const [revokedToken] = MovableCollateralRouter__factory.createInterface().decodeFunctionData('approveTokenForBridge(address,address)', tx.data);
|
|
1613
|
+
return normalizeAddressEvm(revokedToken);
|
|
1614
|
+
});
|
|
1615
|
+
expect(revokedTokens).to.have.members([
|
|
1616
|
+
normalizeAddressEvm(token.address),
|
|
1617
|
+
normalizeAddressEvm(feeToken.address),
|
|
1618
|
+
]);
|
|
1619
|
+
});
|
|
1620
|
+
it(`should emit an approval tx for approvedTokens on a legacy router for a route of type "${tokenType}"`, async () => {
|
|
1621
|
+
const allowedBridge = normalizeAddressEvm(randomAddress());
|
|
1622
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1623
|
+
...getMovableTokenConfig()[tokenType],
|
|
1624
|
+
remoteRouters: {
|
|
1625
|
+
[domainId]: {
|
|
1626
|
+
address: randomAddress(),
|
|
1627
|
+
},
|
|
1628
|
+
},
|
|
1629
|
+
allowedRebalancingBridges: {
|
|
1630
|
+
[domainId]: [
|
|
1631
|
+
{
|
|
1632
|
+
bridge: allowedBridge,
|
|
1633
|
+
approvedTokens: [feeToken.address],
|
|
1634
|
+
},
|
|
1635
|
+
],
|
|
1636
|
+
},
|
|
1637
|
+
});
|
|
1638
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1639
|
+
chain,
|
|
1640
|
+
config,
|
|
1641
|
+
multiProvider,
|
|
1642
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1643
|
+
});
|
|
1644
|
+
// Spoof a legacy impl so `approveTokenForBridge` still grants max. The
|
|
1645
|
+
// emitted tx isn't executed here: the real (new-semantics) impl would
|
|
1646
|
+
// revoke instead of grant, so we assert on the SDK's intent — the grant
|
|
1647
|
+
// selector targeting the configured token and bridge.
|
|
1648
|
+
const versionStub = sinon
|
|
1649
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
1650
|
+
.resolves('11.3.0');
|
|
1651
|
+
const scaleStub = sinon
|
|
1652
|
+
.stub(evmERC20WarpModule.reader, 'fetchScale')
|
|
1653
|
+
.resolves(undefined);
|
|
1654
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
1655
|
+
versionStub.restore();
|
|
1656
|
+
scaleStub.restore();
|
|
1657
|
+
const approvalTxs = await evmERC20WarpModule.getAllowedBridgesApprovalTxs(actualConfig, config);
|
|
1658
|
+
expect(approvalTxs.length).to.equal(1);
|
|
1659
|
+
expect(approvalTxs[0].to).to.equal(evmERC20WarpModule.serialize().deployedTokenRoute);
|
|
1660
|
+
assert(approvalTxs[0].data, 'expected approval calldata');
|
|
1661
|
+
const [token, bridge] = MovableCollateralRouter__factory.createInterface().decodeFunctionData('approveTokenForBridge(address,address)', approvalTxs[0].data);
|
|
1662
|
+
expect(eqAddress(token, feeToken.address)).to.be.true;
|
|
1663
|
+
expect(eqAddress(bridge, allowedBridge)).to.be.true;
|
|
1664
|
+
});
|
|
1665
|
+
}
|
|
1666
|
+
it(`should not generate update transactions for the allowed rebalancing bridges if the address is in a different casing when token is of type "${tokenType}"`, async () => {
|
|
1667
|
+
const movableTokenConfigs = getMovableTokenConfig();
|
|
1668
|
+
const allowedBridgeToAdd = normalizeAddressEvm(randomAddress());
|
|
1669
|
+
const config = HypTokenRouterConfigSchema.parse({
|
|
1670
|
+
...movableTokenConfigs[tokenType],
|
|
1671
|
+
remoteRouters: {
|
|
1672
|
+
[domainId]: {
|
|
1673
|
+
address: randomAddress(),
|
|
1674
|
+
},
|
|
1675
|
+
},
|
|
1676
|
+
allowedRebalancingBridges: {
|
|
1677
|
+
[domainId]: [
|
|
1678
|
+
{
|
|
1679
|
+
bridge: allowedBridgeToAdd,
|
|
1680
|
+
},
|
|
1681
|
+
],
|
|
1682
|
+
},
|
|
1683
|
+
});
|
|
1684
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1685
|
+
chain,
|
|
1686
|
+
config,
|
|
1687
|
+
multiProvider,
|
|
1688
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1689
|
+
});
|
|
1690
|
+
const txs = await evmERC20WarpModule.update(HypTokenRouterConfigSchema.parse({
|
|
1691
|
+
...config,
|
|
1692
|
+
allowedRebalancingBridges: {
|
|
1693
|
+
[domainId]: [
|
|
1694
|
+
{
|
|
1695
|
+
bridge: allowedBridgeToAdd.toLowerCase(),
|
|
1696
|
+
},
|
|
1697
|
+
],
|
|
1698
|
+
},
|
|
1699
|
+
}));
|
|
1700
|
+
expect(txs.length).to.equal(0);
|
|
1701
|
+
});
|
|
1702
|
+
it(`should add and remove a bridge on the deployed token if it is of type "${tokenType}" and the router map uses chain names instead of domainIds`, async () => {
|
|
1703
|
+
const bridges = [randomAddress(), randomAddress()];
|
|
1704
|
+
const remoteRouter = randomAddress();
|
|
1705
|
+
const config = deepCopy(getMovableTokenConfig()[tokenType]);
|
|
1706
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1707
|
+
chain,
|
|
1708
|
+
config: {
|
|
1709
|
+
...config,
|
|
1710
|
+
remoteRouters: {
|
|
1711
|
+
[domainId]: {
|
|
1712
|
+
address: remoteRouter,
|
|
1713
|
+
},
|
|
1714
|
+
},
|
|
1715
|
+
},
|
|
1716
|
+
multiProvider,
|
|
1717
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1718
|
+
});
|
|
1719
|
+
let testCase = 0;
|
|
1720
|
+
for (const bridge of bridges) {
|
|
1721
|
+
const expectedNumOfTxs = testCase === 0 ? 1 : 2;
|
|
1722
|
+
const txs = await evmERC20WarpModule.update({
|
|
1723
|
+
...config,
|
|
1724
|
+
allowedRebalancingBridges: {
|
|
1725
|
+
[chain]: [{ bridge }],
|
|
1726
|
+
},
|
|
1727
|
+
});
|
|
1728
|
+
expect(txs.length).to.equal(expectedNumOfTxs);
|
|
1729
|
+
await sendTxs(txs);
|
|
1730
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1731
|
+
assert(isMovableCollateralTokenConfig(currentConfig), '');
|
|
1732
|
+
const [bridgeConfig] = Object.values(currentConfig.allowedRebalancingBridges ?? {});
|
|
1733
|
+
expect(bridgeConfig).to.exist;
|
|
1734
|
+
expect(bridgeConfig.length).to.eql(1);
|
|
1735
|
+
expect(eqAddress(bridgeConfig[0].bridge, bridge)).to.be.true;
|
|
1736
|
+
testCase++;
|
|
1737
|
+
}
|
|
1738
|
+
});
|
|
1739
|
+
}
|
|
1740
|
+
for (const tokenType of everclearTokenBridgeTypes) {
|
|
1741
|
+
it(`should add destination outputAssets if the token is of type ${tokenType}`, async () => {
|
|
1742
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1743
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1744
|
+
chain,
|
|
1745
|
+
config,
|
|
1746
|
+
multiProvider,
|
|
1747
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1748
|
+
});
|
|
1749
|
+
const remoteToken = randomAddress();
|
|
1750
|
+
const txs = await evmERC20WarpModule.update({
|
|
1751
|
+
...config,
|
|
1752
|
+
outputAssets: {
|
|
1753
|
+
[domainId]: remoteToken,
|
|
1754
|
+
},
|
|
1755
|
+
});
|
|
1756
|
+
expect(txs.length).to.equal(1);
|
|
1757
|
+
await sendTxs(txs);
|
|
1758
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1759
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
1760
|
+
expect(currentConfig.outputAssets[domainId]).to.equal(addressToBytes32(remoteToken));
|
|
1761
|
+
});
|
|
1762
|
+
it(`should overwrite a destination outputAssets if the token is of type ${tokenType} and a destination token already exists for the given destination`, async () => {
|
|
1763
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1764
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1765
|
+
chain,
|
|
1766
|
+
config: {
|
|
1767
|
+
...config,
|
|
1768
|
+
outputAssets: {
|
|
1769
|
+
[domainId]: randomAddress(),
|
|
1770
|
+
},
|
|
1771
|
+
},
|
|
1772
|
+
multiProvider,
|
|
1773
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1774
|
+
});
|
|
1775
|
+
const expectedRemoteOutputToken = randomAddress();
|
|
1776
|
+
const txs = await evmERC20WarpModule.update({
|
|
1777
|
+
...config,
|
|
1778
|
+
outputAssets: {
|
|
1779
|
+
[domainId]: expectedRemoteOutputToken,
|
|
1780
|
+
},
|
|
1781
|
+
});
|
|
1782
|
+
expect(txs.length).to.equal(1);
|
|
1783
|
+
await sendTxs(txs);
|
|
1784
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1785
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
1786
|
+
expect(currentConfig.outputAssets[domainId]).to.equal(addressToBytes32(expectedRemoteOutputToken));
|
|
1787
|
+
});
|
|
1788
|
+
it(`should remove destination outputAssets if the token is of type ${tokenType} and a config is set`, async () => {
|
|
1789
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1790
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1791
|
+
chain,
|
|
1792
|
+
config: {
|
|
1793
|
+
...config,
|
|
1794
|
+
outputAssets: {
|
|
1795
|
+
[domainId]: randomAddress(),
|
|
1796
|
+
},
|
|
1797
|
+
},
|
|
1798
|
+
multiProvider,
|
|
1799
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1800
|
+
});
|
|
1801
|
+
const txs = await evmERC20WarpModule.update({
|
|
1802
|
+
...config,
|
|
1803
|
+
outputAssets: {},
|
|
1804
|
+
});
|
|
1805
|
+
expect(txs.length).to.equal(1);
|
|
1806
|
+
await sendTxs(txs);
|
|
1807
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1808
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
1809
|
+
expect(currentConfig.outputAssets).to.deep.equal({});
|
|
1810
|
+
});
|
|
1811
|
+
it(`should remove 1 outputAsset and leave the others if the token is of type ${tokenType}`, async () => {
|
|
1812
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1813
|
+
const numOfRouters = randomInt(10, 0);
|
|
1814
|
+
const remoteRoutersToKeep = randomRemoteRouters(numOfRouters);
|
|
1815
|
+
const initialRemoteRouters = {
|
|
1816
|
+
[domainId]: {
|
|
1817
|
+
address: randomAddress(),
|
|
1818
|
+
},
|
|
1819
|
+
...remoteRoutersToKeep,
|
|
1820
|
+
};
|
|
1821
|
+
const outputAssetsToKeep = objMap(remoteRoutersToKeep, (_domainId, _) => randomAddress());
|
|
1822
|
+
const expectedOutputAssets = objMap(outputAssetsToKeep, (_domainId, address) => addressToBytes32(address));
|
|
1823
|
+
const initialOutputAddresses = {
|
|
1824
|
+
[domainId]: randomAddress(),
|
|
1825
|
+
...outputAssetsToKeep,
|
|
1826
|
+
};
|
|
1827
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1828
|
+
chain,
|
|
1829
|
+
config: {
|
|
1830
|
+
...config,
|
|
1831
|
+
remoteRouters: initialRemoteRouters,
|
|
1832
|
+
outputAssets: initialOutputAddresses,
|
|
1833
|
+
},
|
|
1834
|
+
multiProvider,
|
|
1835
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1836
|
+
});
|
|
1837
|
+
const txs = await evmERC20WarpModule.update({
|
|
1838
|
+
...config,
|
|
1839
|
+
remoteRouters: initialRemoteRouters,
|
|
1840
|
+
outputAssets: outputAssetsToKeep,
|
|
1841
|
+
});
|
|
1842
|
+
expect(txs.length).to.equal(1);
|
|
1843
|
+
await sendTxs(txs);
|
|
1844
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1845
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
1846
|
+
expect(currentConfig.outputAssets).to.deep.equal(expectedOutputAssets);
|
|
1847
|
+
});
|
|
1848
|
+
it(`should update the fee params if the token is of type ${tokenType}`, async () => {
|
|
1849
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1850
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1851
|
+
chain,
|
|
1852
|
+
config,
|
|
1853
|
+
multiProvider,
|
|
1854
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1855
|
+
});
|
|
1856
|
+
const expectedEverclearFeeParams = {
|
|
1857
|
+
[domainId]: {
|
|
1858
|
+
deadline: Date.now(),
|
|
1859
|
+
fee: randomInt(100000000, 100),
|
|
1860
|
+
signature: '0x42',
|
|
1861
|
+
},
|
|
1862
|
+
};
|
|
1863
|
+
const txs = await evmERC20WarpModule.update({
|
|
1864
|
+
...config,
|
|
1865
|
+
everclearFeeParams: expectedEverclearFeeParams,
|
|
1866
|
+
});
|
|
1867
|
+
expect(txs.length).to.equal(1);
|
|
1868
|
+
await sendTxs(txs);
|
|
1869
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1870
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
1871
|
+
expect(currentConfig.everclearFeeParams).to.deep.equal(expectedEverclearFeeParams);
|
|
1872
|
+
});
|
|
1873
|
+
it(`should not generate any update transactions for the fee params if the config did not change and the token is of type ${tokenType}`, async () => {
|
|
1874
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1875
|
+
const expectedEverclearFeeParams = config.everclearFeeParams;
|
|
1876
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1877
|
+
chain,
|
|
1878
|
+
config,
|
|
1879
|
+
multiProvider,
|
|
1880
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1881
|
+
});
|
|
1882
|
+
const txs = await evmERC20WarpModule.update(config);
|
|
1883
|
+
expect(txs.length).to.equal(0);
|
|
1884
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1885
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
1886
|
+
expect(currentConfig.everclearFeeParams).to.deep.equal(expectedEverclearFeeParams);
|
|
1887
|
+
});
|
|
1888
|
+
it(`should remove everclear fee params if the token is of type ${tokenType}`, async () => {
|
|
1889
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1890
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1891
|
+
chain,
|
|
1892
|
+
config,
|
|
1893
|
+
multiProvider,
|
|
1894
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1895
|
+
});
|
|
1896
|
+
// Remove the fee params for the enrolled domain
|
|
1897
|
+
const txs = await evmERC20WarpModule.update({
|
|
1898
|
+
...config,
|
|
1899
|
+
everclearFeeParams: {},
|
|
1900
|
+
});
|
|
1901
|
+
expect(txs.length).to.equal(1);
|
|
1902
|
+
await sendTxs(txs);
|
|
1903
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1904
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
1905
|
+
expect(currentConfig.everclearFeeParams).to.deep.equal({});
|
|
1906
|
+
});
|
|
1907
|
+
it(`should remove 1 everclear fee param and leave the others if the token is of type ${tokenType}`, async () => {
|
|
1908
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1909
|
+
const numOfRouters = randomInt(10, 0);
|
|
1910
|
+
const remoteRoutersToKeep = randomRemoteRouters(numOfRouters);
|
|
1911
|
+
const initialRemoteRouters = {
|
|
1912
|
+
[domainId]: {
|
|
1913
|
+
address: randomAddress(),
|
|
1914
|
+
},
|
|
1915
|
+
...remoteRoutersToKeep,
|
|
1916
|
+
};
|
|
1917
|
+
const feeParamsToKeep = objMap(remoteRoutersToKeep, (_domainId, _) => ({
|
|
1918
|
+
deadline: Date.now(),
|
|
1919
|
+
fee: randomInt(1000),
|
|
1920
|
+
signature: '0x',
|
|
1921
|
+
}));
|
|
1922
|
+
const initialFeeParams = {
|
|
1923
|
+
[domainId]: {
|
|
1924
|
+
deadline: Date.now(),
|
|
1925
|
+
fee: randomInt(1000),
|
|
1926
|
+
signature: '0x',
|
|
1927
|
+
},
|
|
1928
|
+
...feeParamsToKeep,
|
|
1929
|
+
};
|
|
1930
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1931
|
+
chain,
|
|
1932
|
+
config: {
|
|
1933
|
+
...config,
|
|
1934
|
+
remoteRouters: initialRemoteRouters,
|
|
1935
|
+
everclearFeeParams: initialFeeParams,
|
|
1936
|
+
},
|
|
1937
|
+
multiProvider,
|
|
1938
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1939
|
+
});
|
|
1940
|
+
const txs = await evmERC20WarpModule.update({
|
|
1941
|
+
...config,
|
|
1942
|
+
remoteRouters: initialRemoteRouters,
|
|
1943
|
+
everclearFeeParams: feeParamsToKeep,
|
|
1944
|
+
});
|
|
1945
|
+
expect(txs.length).to.equal(1);
|
|
1946
|
+
await sendTxs(txs);
|
|
1947
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
1948
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
1949
|
+
expect(currentConfig.everclearFeeParams).to.deep.equal(feeParamsToKeep);
|
|
1950
|
+
});
|
|
1951
|
+
it(`should remove all everclear fee params except for explicitly kept domains if the token is of type ${tokenType}`, async () => {
|
|
1952
|
+
const config = getEverclearTokenBridgeTokenConfig()[tokenType];
|
|
1953
|
+
const domainId1 = randomInt(100, 10);
|
|
1954
|
+
const domainId2 = randomInt(1000, 100);
|
|
1955
|
+
const domainId3 = randomInt(10000, 1000);
|
|
1956
|
+
const initialRemoteRouters = {
|
|
1957
|
+
[domainId1]: {
|
|
1958
|
+
address: randomAddress(),
|
|
1959
|
+
},
|
|
1960
|
+
[domainId2]: {
|
|
1961
|
+
address: randomAddress(),
|
|
1962
|
+
},
|
|
1963
|
+
[domainId3]: {
|
|
1964
|
+
address: randomAddress(),
|
|
1965
|
+
},
|
|
1966
|
+
};
|
|
1967
|
+
const initialFeeParams = {
|
|
1968
|
+
[domainId1]: {
|
|
1969
|
+
deadline: Date.now(),
|
|
1970
|
+
fee: randomInt(1000),
|
|
1971
|
+
signature: '0x10',
|
|
1972
|
+
},
|
|
1973
|
+
[domainId2]: {
|
|
1974
|
+
deadline: Date.now(),
|
|
1975
|
+
fee: randomInt(1000),
|
|
1976
|
+
signature: '0x20',
|
|
1977
|
+
},
|
|
1978
|
+
[domainId3]: {
|
|
1979
|
+
deadline: Date.now(),
|
|
1980
|
+
fee: randomInt(1000),
|
|
1981
|
+
signature: '0x30',
|
|
1982
|
+
},
|
|
1983
|
+
};
|
|
1984
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
1985
|
+
chain,
|
|
1986
|
+
config: {
|
|
1987
|
+
...config,
|
|
1988
|
+
remoteRouters: initialRemoteRouters,
|
|
1989
|
+
everclearFeeParams: initialFeeParams,
|
|
1990
|
+
},
|
|
1991
|
+
multiProvider,
|
|
1992
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
1993
|
+
});
|
|
1994
|
+
// Keep only domainId2
|
|
1995
|
+
const expectedFeeParams = {
|
|
1996
|
+
[domainId2]: initialFeeParams[domainId2],
|
|
1997
|
+
};
|
|
1998
|
+
const txs = await evmERC20WarpModule.update({
|
|
1999
|
+
...config,
|
|
2000
|
+
remoteRouters: initialRemoteRouters,
|
|
2001
|
+
everclearFeeParams: expectedFeeParams,
|
|
2002
|
+
});
|
|
2003
|
+
expect(txs.length).to.equal(2);
|
|
2004
|
+
await sendTxs(txs);
|
|
2005
|
+
const currentConfig = await evmERC20WarpModule.read();
|
|
2006
|
+
assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
|
|
2007
|
+
expect(currentConfig.everclearFeeParams).to.deep.equal(expectedFeeParams);
|
|
2008
|
+
});
|
|
2009
|
+
}
|
|
2010
|
+
it('Should deploy and upgrade a new warp route', async () => {
|
|
2011
|
+
const domain = 3;
|
|
2012
|
+
const config = {
|
|
2013
|
+
...baseConfig,
|
|
2014
|
+
type: TokenType.collateral,
|
|
2015
|
+
token: token.address,
|
|
2016
|
+
remoteRouters: {
|
|
2017
|
+
[domain]: {
|
|
2018
|
+
address: randomAddress(),
|
|
2019
|
+
},
|
|
2020
|
+
},
|
|
2021
|
+
};
|
|
2022
|
+
// Deploy using WarpModule
|
|
2023
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
2024
|
+
chain,
|
|
2025
|
+
config: {
|
|
2026
|
+
...config,
|
|
2027
|
+
},
|
|
2028
|
+
multiProvider,
|
|
2029
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
2030
|
+
});
|
|
2031
|
+
const { deployedTokenRoute } = evmERC20WarpModule.serialize();
|
|
2032
|
+
// Get original implementation address
|
|
2033
|
+
const origImpl = await proxyImplementation(multiProvider.getProvider(chain), deployedTokenRoute);
|
|
2034
|
+
// I need package_VERSION to return an old version in the `read` call performed in update
|
|
2035
|
+
const versionStub = sinon
|
|
2036
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
2037
|
+
.resolves('6.0.0');
|
|
2038
|
+
// Also stub fetchScale to avoid version mismatch when reading scale
|
|
2039
|
+
// For old contracts (< 11.0.0), scale would default to 1
|
|
2040
|
+
const scaleStub = sinon
|
|
2041
|
+
.stub(evmERC20WarpModule.reader, 'fetchScale')
|
|
2042
|
+
.resolves(undefined);
|
|
2043
|
+
// In update, we do a check see if the package version is old
|
|
2044
|
+
// If it is, we deploy a new implementation and run upgradeTo
|
|
2045
|
+
await sendTxs(await evmERC20WarpModule.update({
|
|
2046
|
+
...config,
|
|
2047
|
+
contractVersion: CONTRACTS_PACKAGE_VERSION,
|
|
2048
|
+
}));
|
|
2049
|
+
versionStub.restore();
|
|
2050
|
+
scaleStub.restore();
|
|
2051
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
2052
|
+
// Assert
|
|
2053
|
+
expect(updatedConfig.contractVersion).to.eq(CONTRACTS_PACKAGE_VERSION);
|
|
2054
|
+
const newImpl = await proxyImplementation(multiProvider.getProvider(chain), deployedTokenRoute);
|
|
2055
|
+
expect(origImpl).to.not.eq(newImpl);
|
|
2056
|
+
});
|
|
2057
|
+
it('Should not upgrade if the contract version is lower than the actual version', async () => {
|
|
2058
|
+
const domain = 3;
|
|
2059
|
+
const config = {
|
|
2060
|
+
...baseConfig,
|
|
2061
|
+
type: TokenType.collateral,
|
|
2062
|
+
token: token.address,
|
|
2063
|
+
remoteRouters: {
|
|
2064
|
+
[domain]: {
|
|
2065
|
+
address: randomAddress(),
|
|
2066
|
+
},
|
|
2067
|
+
},
|
|
2068
|
+
};
|
|
2069
|
+
// Deploy using WarpModule
|
|
2070
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
2071
|
+
chain,
|
|
2072
|
+
config: {
|
|
2073
|
+
...config,
|
|
2074
|
+
},
|
|
2075
|
+
multiProvider,
|
|
2076
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
2077
|
+
});
|
|
2078
|
+
// Return a really high version
|
|
2079
|
+
const reallyHighVersion = '10000.0.0';
|
|
2080
|
+
const versionStub = sinon
|
|
2081
|
+
.stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
|
|
2082
|
+
.resolves(reallyHighVersion);
|
|
2083
|
+
// This will throw an error
|
|
2084
|
+
await expect(evmERC20WarpModule.update({
|
|
2085
|
+
...config,
|
|
2086
|
+
contractVersion: CONTRACTS_PACKAGE_VERSION,
|
|
2087
|
+
})).to.be.rejectedWith(`Expected contract version ${CONTRACTS_PACKAGE_VERSION} is lower than actual contract version ${reallyHighVersion}`);
|
|
2088
|
+
versionStub.restore();
|
|
2089
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
2090
|
+
// Assert
|
|
2091
|
+
expect(updatedConfig.contractVersion).to.eq(CONTRACTS_PACKAGE_VERSION);
|
|
2092
|
+
});
|
|
2093
|
+
it('should deploy a new fee if one does not exist', async () => {
|
|
2094
|
+
const config = {
|
|
2095
|
+
...baseConfig,
|
|
2096
|
+
type: TokenType.native,
|
|
2097
|
+
};
|
|
2098
|
+
// Deploy using WarpModule
|
|
2099
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
2100
|
+
chain,
|
|
2101
|
+
config,
|
|
2102
|
+
multiProvider,
|
|
2103
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
2104
|
+
});
|
|
2105
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
2106
|
+
const expectedConfig = HypTokenRouterConfigSchema.parse({
|
|
2107
|
+
...actualConfig,
|
|
2108
|
+
tokenFee: {
|
|
2109
|
+
type: TokenFeeType.LinearFee,
|
|
2110
|
+
maxFee: 1000000000,
|
|
2111
|
+
halfAmount: 500000000,
|
|
2112
|
+
},
|
|
2113
|
+
});
|
|
2114
|
+
await sendTxs(await evmERC20WarpModule.update(expectedConfig));
|
|
2115
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
2116
|
+
expect(updatedConfig.tokenFee?.type).to.equal(expectedConfig.tokenFee?.type);
|
|
2117
|
+
});
|
|
2118
|
+
it('should not generate setFeeRecipient tx when fee recipient is unchanged (idempotency)', async () => {
|
|
2119
|
+
const config = {
|
|
2120
|
+
...baseConfig,
|
|
2121
|
+
type: TokenType.native,
|
|
2122
|
+
};
|
|
2123
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
2124
|
+
chain,
|
|
2125
|
+
config,
|
|
2126
|
+
multiProvider,
|
|
2127
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
2128
|
+
});
|
|
2129
|
+
const tokenFeeConfig = {
|
|
2130
|
+
type: TokenFeeType.LinearFee,
|
|
2131
|
+
maxFee: 1000000000,
|
|
2132
|
+
halfAmount: 500000000,
|
|
2133
|
+
};
|
|
2134
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
2135
|
+
const expectedConfig = HypTokenRouterConfigSchema.parse({
|
|
2136
|
+
...actualConfig,
|
|
2137
|
+
tokenFee: tokenFeeConfig,
|
|
2138
|
+
});
|
|
2139
|
+
const firstTxs = await evmERC20WarpModule.update(expectedConfig);
|
|
2140
|
+
const SET_FEE_RECIPIENT_SELECTOR = '0xe74b981b';
|
|
2141
|
+
const firstSetFeeRecipientTxs = firstTxs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
|
|
2142
|
+
expect(firstSetFeeRecipientTxs.length).to.equal(1);
|
|
2143
|
+
await sendTxs(firstTxs);
|
|
2144
|
+
const secondTxs = await evmERC20WarpModule.update(expectedConfig);
|
|
2145
|
+
const secondSetFeeRecipientTxs = secondTxs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
|
|
2146
|
+
expect(secondSetFeeRecipientTxs.length, 'setFeeRecipient should not be called when fee recipient is unchanged').to.equal(0);
|
|
2147
|
+
});
|
|
2148
|
+
it('should generate setFeeRecipient tx when fee recipient changes', async () => {
|
|
2149
|
+
const config = {
|
|
2150
|
+
...baseConfig,
|
|
2151
|
+
type: TokenType.native,
|
|
2152
|
+
};
|
|
2153
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
2154
|
+
chain,
|
|
2155
|
+
config,
|
|
2156
|
+
multiProvider,
|
|
2157
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
2158
|
+
});
|
|
2159
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
2160
|
+
const firstFeeConfig = HypTokenRouterConfigSchema.parse({
|
|
2161
|
+
...actualConfig,
|
|
2162
|
+
tokenFee: {
|
|
2163
|
+
type: TokenFeeType.LinearFee,
|
|
2164
|
+
maxFee: 1000000000,
|
|
2165
|
+
halfAmount: 500000000,
|
|
2166
|
+
},
|
|
2167
|
+
});
|
|
2168
|
+
await sendTxs(await evmERC20WarpModule.update(firstFeeConfig));
|
|
2169
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
2170
|
+
const secondFeeConfig = HypTokenRouterConfigSchema.parse({
|
|
2171
|
+
...updatedConfig,
|
|
2172
|
+
tokenFee: {
|
|
2173
|
+
type: TokenFeeType.LinearFee,
|
|
2174
|
+
maxFee: 2000000000,
|
|
2175
|
+
halfAmount: 1000000000,
|
|
2176
|
+
},
|
|
2177
|
+
});
|
|
2178
|
+
const txs = await evmERC20WarpModule.update(secondFeeConfig);
|
|
2179
|
+
const SET_FEE_RECIPIENT_SELECTOR = '0xe74b981b';
|
|
2180
|
+
const setFeeRecipientTxs = txs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
|
|
2181
|
+
expect(setFeeRecipientTxs.length, 'setFeeRecipient should be called when fee contract address changes').to.equal(1);
|
|
2182
|
+
});
|
|
2183
|
+
it('should deploy and update OffchainQuotedLinearFee via warp apply', async () => {
|
|
2184
|
+
const config = {
|
|
2185
|
+
...baseConfig,
|
|
2186
|
+
type: TokenType.native,
|
|
2187
|
+
};
|
|
2188
|
+
const evmERC20WarpModule = await EvmWarpModule.create({
|
|
2189
|
+
chain,
|
|
2190
|
+
config,
|
|
2191
|
+
multiProvider,
|
|
2192
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
2193
|
+
});
|
|
2194
|
+
const actualConfig = await evmERC20WarpModule.read();
|
|
2195
|
+
const signerAddress = await multiProvider.getSignerAddress(chain);
|
|
2196
|
+
// Deploy with OffchainQuotedLinearFee
|
|
2197
|
+
const expectedConfig = HypTokenRouterConfigSchema.parse({
|
|
2198
|
+
...actualConfig,
|
|
2199
|
+
tokenFee: {
|
|
2200
|
+
type: TokenFeeType.OffchainQuotedLinearFee,
|
|
2201
|
+
maxFee: 1000000000,
|
|
2202
|
+
halfAmount: 500000000,
|
|
2203
|
+
quoteSigners: [signerAddress],
|
|
2204
|
+
},
|
|
2205
|
+
});
|
|
2206
|
+
await sendTxs(await evmERC20WarpModule.update(expectedConfig));
|
|
2207
|
+
const updatedConfig = await evmERC20WarpModule.read();
|
|
2208
|
+
expect(updatedConfig.tokenFee?.type).to.equal(TokenFeeType.OffchainQuotedLinearFee);
|
|
2209
|
+
// Update signers without redeploying
|
|
2210
|
+
const [, otherSigner] = await hre.ethers.getSigners();
|
|
2211
|
+
const updatedFeeConfig = HypTokenRouterConfigSchema.parse({
|
|
2212
|
+
...updatedConfig,
|
|
2213
|
+
tokenFee: {
|
|
2214
|
+
type: TokenFeeType.OffchainQuotedLinearFee,
|
|
2215
|
+
maxFee: 1000000000,
|
|
2216
|
+
halfAmount: 500000000,
|
|
2217
|
+
quoteSigners: [signerAddress, otherSigner.address],
|
|
2218
|
+
},
|
|
2219
|
+
});
|
|
2220
|
+
const signerUpdateTxs = await evmERC20WarpModule.update(updatedFeeConfig);
|
|
2221
|
+
// 1 tx to add signer (no setFeeRecipient since address unchanged)
|
|
2222
|
+
expect(signerUpdateTxs.length).to.equal(1);
|
|
2223
|
+
await sendTxs(signerUpdateTxs);
|
|
2224
|
+
const finalConfig = await evmERC20WarpModule.read();
|
|
2225
|
+
expect(finalConfig.tokenFee?.type).to.equal(TokenFeeType.OffchainQuotedLinearFee);
|
|
2226
|
+
if (finalConfig.tokenFee?.type === TokenFeeType.OffchainQuotedLinearFee) {
|
|
2227
|
+
expect(finalConfig.tokenFee.quoteSigners).to.have.lengthOf(2);
|
|
2228
|
+
}
|
|
2229
|
+
});
|
|
2230
|
+
describe('xERC20 token fee', () => {
|
|
2231
|
+
const SET_FEE_RECIPIENT_SELECTOR = '0xe74b981b';
|
|
2232
|
+
// The default test4 metadata configures an Etherscan explorer, which the
|
|
2233
|
+
// xERC20 reader would call to derive extra-lockbox configs on every
|
|
2234
|
+
// read(). Strip it on a scoped MultiProvider so lockbox derivation
|
|
2235
|
+
// early-returns []; XERC20Test has no extra lockboxes anyway.
|
|
2236
|
+
let xerc20MultiProvider;
|
|
2237
|
+
before(() => {
|
|
2238
|
+
xerc20MultiProvider = MultiProvider.createTestMultiProvider({ signer });
|
|
2239
|
+
xerc20MultiProvider.metadata[chain] = {
|
|
2240
|
+
...xerc20MultiProvider.getChainMetadata(chain),
|
|
2241
|
+
blockExplorers: [],
|
|
2242
|
+
};
|
|
2243
|
+
});
|
|
2244
|
+
// Deploys a fresh xERC20 warp route so each test starts with no fee.
|
|
2245
|
+
// XERC20Test grants unlimited mint/burn limits to any bridge, so no
|
|
2246
|
+
// limit-granting is required to exercise the fee-setting path.
|
|
2247
|
+
async function deployXERC20Route() {
|
|
2248
|
+
const xerc20 = await new XERC20Test__factory(signer).deploy(TOKEN_NAME, TOKEN_NAME, TOKEN_SUPPLY, TOKEN_DECIMALS);
|
|
2249
|
+
const config = {
|
|
2250
|
+
...baseConfig,
|
|
2251
|
+
type: TokenType.XERC20,
|
|
2252
|
+
token: xerc20.address,
|
|
2253
|
+
};
|
|
2254
|
+
const warpModule = await EvmWarpModule.create({
|
|
2255
|
+
chain,
|
|
2256
|
+
config,
|
|
2257
|
+
multiProvider: xerc20MultiProvider,
|
|
2258
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
2259
|
+
});
|
|
2260
|
+
return { warpModule, xerc20 };
|
|
2261
|
+
}
|
|
2262
|
+
// LinearFee = min(maxFee, (amount * maxFee) / (2 * halfAmount)).
|
|
2263
|
+
function expectedLinearFee(maxFee, halfAmount, amount) {
|
|
2264
|
+
const uncapped = (amount * maxFee) / (2n * halfAmount);
|
|
2265
|
+
return uncapped > maxFee ? maxFee : uncapped;
|
|
2266
|
+
}
|
|
2267
|
+
// Reads the deployed LinearFee contract wired to the router and asserts
|
|
2268
|
+
// its on-chain params. Critically verifies fee.token() == router.token(),
|
|
2269
|
+
// the exact invariant the router enforces at transfer time
|
|
2270
|
+
// ("FungibleTokenRouter: fee must match token").
|
|
2271
|
+
async function assertOnchainLinearFee(warpModule, expected) {
|
|
2272
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2273
|
+
const router = HypXERC20__factory.connect(deployedTokenRoute, signer);
|
|
2274
|
+
const feeRecipient = await router.feeRecipient();
|
|
2275
|
+
expect(eqAddress(feeRecipient, ethers.constants.AddressZero)).to.be
|
|
2276
|
+
.false;
|
|
2277
|
+
const fee = LinearFee__factory.connect(feeRecipient, signer);
|
|
2278
|
+
expect(eqAddress(await fee.token(), await router.token())).to.be.true;
|
|
2279
|
+
expect((await fee.maxFee()).toBigInt()).to.equal(expected.maxFee);
|
|
2280
|
+
expect((await fee.halfAmount()).toBigInt()).to.equal(expected.halfAmount);
|
|
2281
|
+
}
|
|
2282
|
+
it('charges the resolved token when quoting a fee-bearing transfer', async () => {
|
|
2283
|
+
const { warpModule } = await deployXERC20Route();
|
|
2284
|
+
const maxFee = 1000000000n;
|
|
2285
|
+
const halfAmount = 500000000n;
|
|
2286
|
+
const actualConfig = await warpModule.read();
|
|
2287
|
+
const feeConfig = HypTokenRouterConfigSchema.parse({
|
|
2288
|
+
...actualConfig,
|
|
2289
|
+
tokenFee: {
|
|
2290
|
+
type: TokenFeeType.LinearFee,
|
|
2291
|
+
maxFee: maxFee.toString(),
|
|
2292
|
+
halfAmount: halfAmount.toString(),
|
|
2293
|
+
},
|
|
2294
|
+
});
|
|
2295
|
+
await sendTxs(await warpModule.update(feeConfig));
|
|
2296
|
+
await assertOnchainLinearFee(warpModule, { maxFee, halfAmount });
|
|
2297
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2298
|
+
const router = HypXERC20__factory.connect(deployedTokenRoute, signer);
|
|
2299
|
+
const fee = LinearFee__factory.connect(await router.feeRecipient(), signer);
|
|
2300
|
+
// Quote a transfer through the deployed fee contract: fee token must be
|
|
2301
|
+
// the router token and the amount must match the LinearFee formula.
|
|
2302
|
+
const amount = halfAmount; // fee = maxFee / 2
|
|
2303
|
+
const quotes = await fee.quoteTransferRemote(1, addressToBytes32(signer.address), amount);
|
|
2304
|
+
expect(quotes.length).to.equal(1);
|
|
2305
|
+
expect(eqAddress(quotes[0].token, await router.token())).to.be.true;
|
|
2306
|
+
const expected = expectedLinearFee(maxFee, halfAmount, amount);
|
|
2307
|
+
expect(quotes[0].amount.toBigInt()).to.equal(expected);
|
|
2308
|
+
expect(expected > 0n, 'expected a non-zero fee').to.be.true;
|
|
2309
|
+
});
|
|
2310
|
+
it('should set a LinearFee on an xERC20 route via warp apply', async () => {
|
|
2311
|
+
const { warpModule } = await deployXERC20Route();
|
|
2312
|
+
const actualConfig = await warpModule.read();
|
|
2313
|
+
expect(actualConfig.tokenFee).to.be.undefined;
|
|
2314
|
+
const expectedConfig = HypTokenRouterConfigSchema.parse({
|
|
2315
|
+
...actualConfig,
|
|
2316
|
+
tokenFee: {
|
|
2317
|
+
type: TokenFeeType.LinearFee,
|
|
2318
|
+
maxFee: 1000000000,
|
|
2319
|
+
halfAmount: 500000000,
|
|
2320
|
+
},
|
|
2321
|
+
});
|
|
2322
|
+
const txs = await warpModule.update(expectedConfig);
|
|
2323
|
+
const setFeeRecipientTxs = txs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
|
|
2324
|
+
expect(setFeeRecipientTxs.length).to.equal(1);
|
|
2325
|
+
await sendTxs(txs);
|
|
2326
|
+
const updatedConfig = await warpModule.read();
|
|
2327
|
+
expect(updatedConfig.tokenFee?.type).to.equal(TokenFeeType.LinearFee);
|
|
2328
|
+
});
|
|
2329
|
+
it('should update the fee on an xERC20 route', async () => {
|
|
2330
|
+
const { warpModule } = await deployXERC20Route();
|
|
2331
|
+
const actualConfig = await warpModule.read();
|
|
2332
|
+
const firstFeeConfig = HypTokenRouterConfigSchema.parse({
|
|
2333
|
+
...actualConfig,
|
|
2334
|
+
tokenFee: {
|
|
2335
|
+
type: TokenFeeType.LinearFee,
|
|
2336
|
+
maxFee: 1000000000,
|
|
2337
|
+
halfAmount: 500000000,
|
|
2338
|
+
},
|
|
2339
|
+
});
|
|
2340
|
+
await sendTxs(await warpModule.update(firstFeeConfig));
|
|
2341
|
+
const afterFirst = await warpModule.read();
|
|
2342
|
+
assert(afterFirst.tokenFee?.type === TokenFeeType.LinearFee, 'LinearFee');
|
|
2343
|
+
const secondFeeConfig = HypTokenRouterConfigSchema.parse({
|
|
2344
|
+
...afterFirst,
|
|
2345
|
+
tokenFee: {
|
|
2346
|
+
type: TokenFeeType.LinearFee,
|
|
2347
|
+
maxFee: 2000000000,
|
|
2348
|
+
halfAmount: 1000000000,
|
|
2349
|
+
},
|
|
2350
|
+
});
|
|
2351
|
+
const txs = await warpModule.update(secondFeeConfig);
|
|
2352
|
+
// Immutable fee contract is redeployed on change, so the router must be
|
|
2353
|
+
// repointed at the new fee contract via setFeeRecipient.
|
|
2354
|
+
const setFeeRecipientTxs = txs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
|
|
2355
|
+
expect(setFeeRecipientTxs.length).to.equal(1);
|
|
2356
|
+
await sendTxs(txs);
|
|
2357
|
+
const finalConfig = await warpModule.read();
|
|
2358
|
+
expect(finalConfig.tokenFee?.type).to.equal(TokenFeeType.LinearFee);
|
|
2359
|
+
// Assert the updated amounts and token are live on-chain, not just the
|
|
2360
|
+
// fee type. Confirms the new fee contract was wired with the new params.
|
|
2361
|
+
await assertOnchainLinearFee(warpModule, {
|
|
2362
|
+
maxFee: 2000000000n,
|
|
2363
|
+
halfAmount: 1000000000n,
|
|
2364
|
+
});
|
|
2365
|
+
});
|
|
2366
|
+
it('should set and update OffchainQuotedLinearFee on an xERC20 route', async () => {
|
|
2367
|
+
const { warpModule } = await deployXERC20Route();
|
|
2368
|
+
const signerAddress = await xerc20MultiProvider.getSignerAddress(chain);
|
|
2369
|
+
const actualConfig = await warpModule.read();
|
|
2370
|
+
const expectedConfig = HypTokenRouterConfigSchema.parse({
|
|
2371
|
+
...actualConfig,
|
|
2372
|
+
tokenFee: {
|
|
2373
|
+
type: TokenFeeType.OffchainQuotedLinearFee,
|
|
2374
|
+
maxFee: 1000000000,
|
|
2375
|
+
halfAmount: 500000000,
|
|
2376
|
+
quoteSigners: [signerAddress],
|
|
2377
|
+
},
|
|
2378
|
+
});
|
|
2379
|
+
await sendTxs(await warpModule.update(expectedConfig));
|
|
2380
|
+
const updatedConfig = await warpModule.read();
|
|
2381
|
+
expect(updatedConfig.tokenFee?.type).to.equal(TokenFeeType.OffchainQuotedLinearFee);
|
|
2382
|
+
const [, otherSigner] = await hre.ethers.getSigners();
|
|
2383
|
+
const updatedFeeConfig = HypTokenRouterConfigSchema.parse({
|
|
2384
|
+
...updatedConfig,
|
|
2385
|
+
tokenFee: {
|
|
2386
|
+
type: TokenFeeType.OffchainQuotedLinearFee,
|
|
2387
|
+
maxFee: 1000000000,
|
|
2388
|
+
halfAmount: 500000000,
|
|
2389
|
+
quoteSigners: [signerAddress, otherSigner.address],
|
|
2390
|
+
},
|
|
2391
|
+
});
|
|
2392
|
+
const signerUpdateTxs = await warpModule.update(updatedFeeConfig);
|
|
2393
|
+
// Only add the new signer; fee contract address is unchanged so no
|
|
2394
|
+
// setFeeRecipient tx.
|
|
2395
|
+
expect(signerUpdateTxs.length).to.equal(1);
|
|
2396
|
+
await sendTxs(signerUpdateTxs);
|
|
2397
|
+
const finalConfig = await warpModule.read();
|
|
2398
|
+
assert(finalConfig.tokenFee?.type === TokenFeeType.OffchainQuotedLinearFee, 'OffchainQuotedLinearFee');
|
|
2399
|
+
expect(finalConfig.tokenFee.quoteSigners).to.have.lengthOf(2);
|
|
2400
|
+
});
|
|
2401
|
+
});
|
|
2402
|
+
it('clears orphan CCR fee pointer without explicit tokenReaderParams (CLI path)', async () => {
|
|
2403
|
+
// Simulates the production CLI path: EvmWarpModule.update() → createTokenFeeUpdateTxs()
|
|
2404
|
+
// called without explicit tokenReaderParams. The fix derives crossCollateralRouters hints
|
|
2405
|
+
// from actualConfig.crossCollateralRouters so orphan on-chain pointers are detected.
|
|
2406
|
+
// 1. Deploy a CCR fee contract and wire a stale router key to a sub-fee
|
|
2407
|
+
const ccrFactory = new CrossCollateralRoutingFee__factory(signer);
|
|
2408
|
+
const ccrf = await ccrFactory.deploy(signer.address);
|
|
2409
|
+
await ccrf.deployed();
|
|
2410
|
+
const linearFeeConfig = await EvmTokenFeeModule.expandConfig({
|
|
2411
|
+
multiProvider,
|
|
2412
|
+
chainName: chain,
|
|
2413
|
+
config: {
|
|
2414
|
+
type: TokenFeeType.LinearFee,
|
|
2415
|
+
token: token.address,
|
|
2416
|
+
owner: signer.address,
|
|
2417
|
+
bps: 100,
|
|
2418
|
+
},
|
|
2419
|
+
});
|
|
2420
|
+
const staleSubFeeModule = await EvmTokenFeeModule.create({
|
|
2421
|
+
multiProvider,
|
|
2422
|
+
chain,
|
|
2423
|
+
config: linearFeeConfig,
|
|
2424
|
+
});
|
|
2425
|
+
const staleSubFeeAddress = staleSubFeeModule.serialize().deployedFee;
|
|
2426
|
+
const routingDomain = multiProvider.getDomainId(chain);
|
|
2427
|
+
const staleRouterKey = hre.ethers.utils.hexZeroPad(signer.address, 32);
|
|
2428
|
+
await ccrf.setCrossCollateralRouterFeeContracts([routingDomain], [staleRouterKey], [staleSubFeeAddress]);
|
|
2429
|
+
// 2. Build an EvmWarpModule with a fake token route address (not needed for this code path)
|
|
2430
|
+
const warpModule = new EvmWarpModule(multiProvider, {
|
|
2431
|
+
chain,
|
|
2432
|
+
config: {
|
|
2433
|
+
...baseConfig,
|
|
2434
|
+
type: TokenType.crossCollateral,
|
|
2435
|
+
token: token.address,
|
|
2436
|
+
},
|
|
2437
|
+
addresses: {
|
|
2438
|
+
deployedTokenRoute: randomAddress(),
|
|
2439
|
+
...ismFactoryAddresses,
|
|
2440
|
+
},
|
|
2441
|
+
});
|
|
2442
|
+
// 3. actualConfig: CCR token with the stale router enrolled in crossCollateralRouters
|
|
2443
|
+
const actualConfig = {
|
|
2444
|
+
...baseConfig,
|
|
2445
|
+
type: TokenType.crossCollateral,
|
|
2446
|
+
token: token.address,
|
|
2447
|
+
crossCollateralRouters: {
|
|
2448
|
+
[routingDomain]: [staleRouterKey],
|
|
2449
|
+
},
|
|
2450
|
+
tokenFee: {
|
|
2451
|
+
type: TokenFeeType.CrossCollateralRoutingFee,
|
|
2452
|
+
owner: signer.address,
|
|
2453
|
+
address: ccrf.address,
|
|
2454
|
+
feeContracts: {},
|
|
2455
|
+
},
|
|
2456
|
+
};
|
|
2457
|
+
// 4. expectedConfig: CCR fee with only DEFAULT_ROUTER_KEY (stale key removed)
|
|
2458
|
+
const expectedConfig = {
|
|
2459
|
+
...baseConfig,
|
|
2460
|
+
type: TokenType.crossCollateral,
|
|
2461
|
+
token: token.address,
|
|
2462
|
+
tokenFee: {
|
|
2463
|
+
type: TokenFeeType.CrossCollateralRoutingFee,
|
|
2464
|
+
owner: signer.address,
|
|
2465
|
+
feeContracts: {
|
|
2466
|
+
[chain]: {
|
|
2467
|
+
[DEFAULT_ROUTER_KEY]: {
|
|
2468
|
+
...linearFeeConfig,
|
|
2469
|
+
},
|
|
2470
|
+
},
|
|
2471
|
+
},
|
|
2472
|
+
},
|
|
2473
|
+
};
|
|
2474
|
+
// 5. Call createTokenFeeUpdateTxs WITHOUT explicit tokenReaderParams
|
|
2475
|
+
const txs = await warpModule.createTokenFeeUpdateTxs(actualConfig, expectedConfig);
|
|
2476
|
+
// Must include a clearing tx for the stale router key
|
|
2477
|
+
const clearTx = txs.find((tx) => tx.annotation?.includes('Clearing removed CrossCollateralRoutingFee'));
|
|
2478
|
+
expect(clearTx, 'expected orphan clearing tx').to.not.be.undefined;
|
|
2479
|
+
// Verify the tx encodes AddressZero for the stale key
|
|
2480
|
+
const iface = CrossCollateralRoutingFee__factory.createInterface();
|
|
2481
|
+
const decoded = iface.decodeFunctionData('setCrossCollateralRouterFeeContracts', clearTx.data);
|
|
2482
|
+
expect(decoded[1].map((k) => k.toLowerCase())).to.deep.equal([
|
|
2483
|
+
staleRouterKey.toLowerCase(),
|
|
2484
|
+
]);
|
|
2485
|
+
expect(decoded[2]).to.deep.equal([hre.ethers.constants.AddressZero]);
|
|
2486
|
+
});
|
|
2487
|
+
});
|
|
2488
|
+
describe('createSetMaxFeePpmTxs', () => {
|
|
2489
|
+
const ROUTE_ADDRESS = '0x1111111111111111111111111111111111111111';
|
|
2490
|
+
const TOKEN_ADDRESS = '0x2222222222222222222222222222222222222222';
|
|
2491
|
+
const MESSENGER_ADDRESS = '0x3333333333333333333333333333333333333333';
|
|
2492
|
+
const TRANSMITTER_ADDRESS = '0x4444444444444444444444444444444444444444';
|
|
2493
|
+
let warpModule;
|
|
2494
|
+
before(() => {
|
|
2495
|
+
warpModule = new EvmWarpModule(multiProvider, {
|
|
2496
|
+
chain,
|
|
2497
|
+
config: {},
|
|
2498
|
+
addresses: {
|
|
2499
|
+
deployedTokenRoute: ROUTE_ADDRESS,
|
|
2500
|
+
...ismFactoryAddresses,
|
|
2501
|
+
},
|
|
2502
|
+
});
|
|
2503
|
+
});
|
|
2504
|
+
const makeCctpV2Config = (maxFeeBps, overrides) => ({
|
|
2505
|
+
...baseConfig,
|
|
2506
|
+
type: TokenType.collateralCctp,
|
|
2507
|
+
token: TOKEN_ADDRESS,
|
|
2508
|
+
tokenMessenger: MESSENGER_ADDRESS,
|
|
2509
|
+
messageTransmitter: TRANSMITTER_ADDRESS,
|
|
2510
|
+
cctpVersion: 'V2',
|
|
2511
|
+
urls: ['https://fake-cctp-url.com'],
|
|
2512
|
+
maxFeeBps,
|
|
2513
|
+
...overrides,
|
|
2514
|
+
});
|
|
2515
|
+
it('returns empty when expectedConfig is not CCTP', () => {
|
|
2516
|
+
const actual = makeCctpV2Config(100);
|
|
2517
|
+
const expected = {
|
|
2518
|
+
...baseConfig,
|
|
2519
|
+
type: TokenType.collateral,
|
|
2520
|
+
token: TOKEN_ADDRESS,
|
|
2521
|
+
};
|
|
2522
|
+
expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
|
|
2523
|
+
});
|
|
2524
|
+
it('returns empty when cctpVersion is V1', () => {
|
|
2525
|
+
const actual = makeCctpV2Config(100);
|
|
2526
|
+
const expected = makeCctpV2Config(200, { cctpVersion: 'V1' });
|
|
2527
|
+
expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
|
|
2528
|
+
});
|
|
2529
|
+
it('returns empty when maxFeeBps is undefined', () => {
|
|
2530
|
+
const actual = makeCctpV2Config(100);
|
|
2531
|
+
const expected = makeCctpV2Config(undefined);
|
|
2532
|
+
expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
|
|
2533
|
+
});
|
|
2534
|
+
it('returns empty when actual matches expected', () => {
|
|
2535
|
+
const actual = makeCctpV2Config(1.3);
|
|
2536
|
+
const expected = makeCctpV2Config(1.3);
|
|
2537
|
+
expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
|
|
2538
|
+
});
|
|
2539
|
+
it('returns setMaxFeePpm tx when fee differs', () => {
|
|
2540
|
+
const actual = makeCctpV2Config(1);
|
|
2541
|
+
const expected = makeCctpV2Config(1.3);
|
|
2542
|
+
const txs = warpModule.createSetMaxFeePpmTxs(actual, expected);
|
|
2543
|
+
expect(txs).to.have.length(1);
|
|
2544
|
+
expect(txs[0].to).to.equal(ROUTE_ADDRESS);
|
|
2545
|
+
expect(txs[0].data).to.equal(TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [130]));
|
|
2546
|
+
});
|
|
2547
|
+
it('converts fractional bps to ppm correctly', () => {
|
|
2548
|
+
const actual = makeCctpV2Config(0);
|
|
2549
|
+
const expected = makeCctpV2Config(1.5);
|
|
2550
|
+
const txs = warpModule.createSetMaxFeePpmTxs(actual, expected);
|
|
2551
|
+
expect(txs).to.have.length(1);
|
|
2552
|
+
expect(txs[0].data).to.equal(TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [150]));
|
|
2553
|
+
});
|
|
2554
|
+
it('emits setMaxFeePpm when upgrading across PPM storage boundary even if values match', () => {
|
|
2555
|
+
const actual = makeCctpV2Config(1.3, {
|
|
2556
|
+
contractVersion: '10.1.0',
|
|
2557
|
+
});
|
|
2558
|
+
const expected = makeCctpV2Config(1.3, {
|
|
2559
|
+
contractVersion: '10.2.0',
|
|
2560
|
+
});
|
|
2561
|
+
const txs = warpModule.createSetMaxFeePpmTxs(actual, expected);
|
|
2562
|
+
expect(txs).to.have.length(1);
|
|
2563
|
+
expect(txs[0].data).to.equal(TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [130]));
|
|
2564
|
+
});
|
|
2565
|
+
it('skips setMaxFeePpm when both versions are above PPM boundary and values match', () => {
|
|
2566
|
+
const actual = makeCctpV2Config(1.3, {
|
|
2567
|
+
contractVersion: '10.2.0',
|
|
2568
|
+
});
|
|
2569
|
+
const expected = makeCctpV2Config(1.3, {
|
|
2570
|
+
contractVersion: '10.3.0',
|
|
2571
|
+
});
|
|
2572
|
+
expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
|
|
2573
|
+
});
|
|
2574
|
+
it('returns tx when actual has no maxFeeBps', () => {
|
|
2575
|
+
const actual = {
|
|
2576
|
+
...baseConfig,
|
|
2577
|
+
type: TokenType.collateral,
|
|
2578
|
+
token: TOKEN_ADDRESS,
|
|
2579
|
+
};
|
|
2580
|
+
const expected = makeCctpV2Config(2);
|
|
2581
|
+
const txs = warpModule.createSetMaxFeePpmTxs(actual, expected);
|
|
2582
|
+
expect(txs).to.have.length(1);
|
|
2583
|
+
expect(txs[0].data).to.equal(TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [200]));
|
|
2584
|
+
});
|
|
2585
|
+
});
|
|
2586
|
+
describe('hybrid hook/ISM updates', () => {
|
|
2587
|
+
// Mirrors the shape `warp apply` produces: the hybrid must be composed
|
|
2588
|
+
// under an authenticating ISM, and expandWarpDeployConfig defaults the
|
|
2589
|
+
// expected hook to the hybrid node when the user leaves `hook` unset.
|
|
2590
|
+
function delayedFlowNode(owner, maxDelay = 3600) {
|
|
2591
|
+
return {
|
|
2592
|
+
type: IsmType.DELAYED_FLOW_ROUTER,
|
|
2593
|
+
thresholdBps: 10000,
|
|
2594
|
+
maxDelay,
|
|
2595
|
+
duration: 86400n,
|
|
2596
|
+
owner,
|
|
2597
|
+
};
|
|
2598
|
+
}
|
|
2599
|
+
// Hook-side view of the same contract (same type string by design), which
|
|
2600
|
+
// is what expandWarpDeployConfig puts in the expected `hook` field.
|
|
2601
|
+
function delayedFlowHookNode(owner, maxDelay = 3600) {
|
|
2602
|
+
return {
|
|
2603
|
+
type: HookType.DELAYED_FLOW_ROUTER,
|
|
2604
|
+
thresholdBps: 10000,
|
|
2605
|
+
maxDelay,
|
|
2606
|
+
duration: 86400n,
|
|
2607
|
+
owner,
|
|
2608
|
+
};
|
|
2609
|
+
}
|
|
2610
|
+
// Hook-side view of the OTHER hybrid: same family, different contract.
|
|
2611
|
+
function netFlowHookNode(owner) {
|
|
2612
|
+
return {
|
|
2613
|
+
type: HookType.NET_FLOW_RATE_LIMITED,
|
|
2614
|
+
thresholdBps: 5000,
|
|
2615
|
+
duration: 86400n,
|
|
2616
|
+
owner,
|
|
2617
|
+
};
|
|
2618
|
+
}
|
|
2619
|
+
function delayedFlowIsm(owner, maxDelay = 3600) {
|
|
2620
|
+
return {
|
|
2621
|
+
type: IsmType.AGGREGATION,
|
|
2622
|
+
threshold: 2,
|
|
2623
|
+
modules: [
|
|
2624
|
+
{ type: IsmType.TRUSTED_RELAYER, relayer: owner },
|
|
2625
|
+
delayedFlowNode(owner, maxDelay),
|
|
2626
|
+
],
|
|
2627
|
+
};
|
|
2628
|
+
}
|
|
2629
|
+
// ISM-side view of the OTHER hybrid, with the same parameters as
|
|
2630
|
+
// netFlowHookNode so the pair describes one instance.
|
|
2631
|
+
function netFlowIsm(owner) {
|
|
2632
|
+
return {
|
|
2633
|
+
type: IsmType.AGGREGATION,
|
|
2634
|
+
threshold: 2,
|
|
2635
|
+
modules: [
|
|
2636
|
+
{ type: IsmType.TRUSTED_RELAYER, relayer: owner },
|
|
2637
|
+
{
|
|
2638
|
+
type: IsmType.NET_FLOW_RATE_LIMITED,
|
|
2639
|
+
thresholdBps: 5000,
|
|
2640
|
+
duration: 86400n,
|
|
2641
|
+
owner,
|
|
2642
|
+
},
|
|
2643
|
+
],
|
|
2644
|
+
};
|
|
2645
|
+
}
|
|
2646
|
+
// A route that exists without any hybrid: the starting point for
|
|
2647
|
+
// "user adds a DFR to an existing route".
|
|
2648
|
+
async function createPlainRoute() {
|
|
2649
|
+
return EvmWarpModule.create({
|
|
2650
|
+
chain,
|
|
2651
|
+
config: {
|
|
2652
|
+
...baseConfig,
|
|
2653
|
+
type: TokenType.collateral,
|
|
2654
|
+
token: token.address,
|
|
2655
|
+
interchainSecurityModule: ismAddress,
|
|
2656
|
+
},
|
|
2657
|
+
multiProvider,
|
|
2658
|
+
proxyFactoryFactories: ismFactoryAddresses,
|
|
2659
|
+
});
|
|
2660
|
+
}
|
|
2661
|
+
it('adds a hybrid hook/ISM to an existing route, wiring it as ISM and hook', async () => {
|
|
2662
|
+
const warpModule = await createPlainRoute();
|
|
2663
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2664
|
+
const expectedConfig = {
|
|
2665
|
+
...(await warpModule.read()),
|
|
2666
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2667
|
+
hook: delayedFlowHookNode(signer.address),
|
|
2668
|
+
};
|
|
2669
|
+
const txs = await warpModule.update(expectedConfig);
|
|
2670
|
+
await sendTxs(txs);
|
|
2671
|
+
const client = MailboxClient__factory.connect(deployedTokenRoute, multiProvider.getProvider(chain));
|
|
2672
|
+
const installedIsm = await client.interchainSecurityModule();
|
|
2673
|
+
const installedHook = await client.hook();
|
|
2674
|
+
expect(isZeroishAddress(installedHook)).to.be.false;
|
|
2675
|
+
// the hook is the DFR paired with this router...
|
|
2676
|
+
const dfr = DelayedFlowRouterHookIsm__factory.connect(installedHook, multiProvider.getProvider(chain));
|
|
2677
|
+
expect(eqAddress(await dfr.warpRouter(), deployedTokenRoute)).to.be.true;
|
|
2678
|
+
expect(await dfr.maxDelay()).to.equal(3600);
|
|
2679
|
+
// ...and the same instance is a member of the installed aggregation ISM
|
|
2680
|
+
const aggregation = StaticAggregationIsm__factory.connect(installedIsm, multiProvider.getProvider(chain));
|
|
2681
|
+
const [modules] = await aggregation.modulesAndThreshold(ethers.constants.AddressZero);
|
|
2682
|
+
expect(modules.map((m) => m.toLowerCase())).to.include(installedHook.toLowerCase());
|
|
2683
|
+
});
|
|
2684
|
+
// A DFR installed as the ISM before it is the hook refuses every inbound
|
|
2685
|
+
// message (`readyAt == 0`) while nothing sends the preverification, and no
|
|
2686
|
+
// later run can preverify an already-dispatched message: the reverse order
|
|
2687
|
+
// only leaves the previous ISM in charge for the rest of the batch.
|
|
2688
|
+
it('wires the hybrid as the hook before installing it as the ISM', async () => {
|
|
2689
|
+
const warpModule = await createPlainRoute();
|
|
2690
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2691
|
+
const expectedConfig = {
|
|
2692
|
+
...(await warpModule.read()),
|
|
2693
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2694
|
+
hook: delayedFlowHookNode(signer.address),
|
|
2695
|
+
};
|
|
2696
|
+
const txs = await warpModule.update(expectedConfig);
|
|
2697
|
+
const hookIndex = routerInstallIndex(txs, deployedTokenRoute, 'setHook');
|
|
2698
|
+
const ismIndex = routerInstallIndex(txs, deployedTokenRoute, 'setInterchainSecurityModule');
|
|
2699
|
+
expect(hookIndex).to.be.greaterThan(-1);
|
|
2700
|
+
expect(ismIndex).to.be.greaterThan(-1);
|
|
2701
|
+
expect(hookIndex).to.be.lessThan(ismIndex);
|
|
2702
|
+
});
|
|
2703
|
+
it('removes the hybrid ISM before removing its hook', async () => {
|
|
2704
|
+
const warpModule = await createPlainRoute();
|
|
2705
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2706
|
+
const hybridConfig = {
|
|
2707
|
+
...(await warpModule.read()),
|
|
2708
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2709
|
+
hook: delayedFlowHookNode(signer.address),
|
|
2710
|
+
};
|
|
2711
|
+
await sendTxs(await warpModule.update(hybridConfig));
|
|
2712
|
+
const client = MailboxClient__factory.connect(deployedTokenRoute, multiProvider.getProvider(chain));
|
|
2713
|
+
const installedHook = await client.hook();
|
|
2714
|
+
const removalConfig = {
|
|
2715
|
+
...(await warpModule.read()),
|
|
2716
|
+
interchainSecurityModule: ethers.constants.AddressZero,
|
|
2717
|
+
hook: ethers.constants.AddressZero,
|
|
2718
|
+
};
|
|
2719
|
+
const txs = await warpModule.update(removalConfig);
|
|
2720
|
+
const hookIndex = routerInstallIndex(txs, deployedTokenRoute, 'setHook');
|
|
2721
|
+
const ismIndex = routerInstallIndex(txs, deployedTokenRoute, 'setInterchainSecurityModule');
|
|
2722
|
+
expect(ismIndex).to.be.greaterThan(-1);
|
|
2723
|
+
expect(hookIndex).to.be.greaterThan(-1);
|
|
2724
|
+
expect(ismIndex).to.be.lessThan(hookIndex);
|
|
2725
|
+
// If submission stops at this boundary, inbound verification is already
|
|
2726
|
+
// back on the mailbox default while origins may harmlessly send an extra
|
|
2727
|
+
// preverification until their hook-removal phase executes.
|
|
2728
|
+
await sendTxs(txs.slice(0, hookIndex));
|
|
2729
|
+
expect(await client.interchainSecurityModule()).to.equal(ethers.constants.AddressZero);
|
|
2730
|
+
expect(await client.hook()).to.equal(installedHook);
|
|
2731
|
+
await sendTxs(txs.slice(hookIndex));
|
|
2732
|
+
expect(await client.hook()).to.equal(ethers.constants.AddressZero);
|
|
2733
|
+
});
|
|
2734
|
+
it('rejects a hybrid config that also sets a predicateWrapper', async () => {
|
|
2735
|
+
const warpModule = await createPlainRoute();
|
|
2736
|
+
const actualConfig = await warpModule.read();
|
|
2737
|
+
assert(actualConfig.type === TokenType.collateral, 'Expected a collateral warp router config');
|
|
2738
|
+
const expectedConfig = {
|
|
2739
|
+
...actualConfig,
|
|
2740
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2741
|
+
hook: delayedFlowHookNode(signer.address),
|
|
2742
|
+
predicateWrapper: {
|
|
2743
|
+
predicateRegistry: randomAddress(),
|
|
2744
|
+
policyId: 'test-policy',
|
|
2745
|
+
owner: signer.address,
|
|
2746
|
+
},
|
|
2747
|
+
};
|
|
2748
|
+
// Both want the router's hook slot; silently dropping either would
|
|
2749
|
+
// remove a policy hook or the flow limiter from the dispatch path.
|
|
2750
|
+
await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('both must own');
|
|
2751
|
+
});
|
|
2752
|
+
it('rejects a hybrid added to a router type it cannot meter', async () => {
|
|
2753
|
+
const warpModule = await createPlainRoute();
|
|
2754
|
+
// collateralVault is not an LpCollateralRouter, so localCollateral()
|
|
2755
|
+
// reverts: the DFR would deploy fine and then brick every dispatch and
|
|
2756
|
+
// delivery. The deploy path rejects this; apply must too.
|
|
2757
|
+
const expectedConfig = {
|
|
2758
|
+
...(await warpModule.read()),
|
|
2759
|
+
type: TokenType.collateralVault,
|
|
2760
|
+
token: token.address,
|
|
2761
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2762
|
+
hook: delayedFlowHookNode(signer.address),
|
|
2763
|
+
};
|
|
2764
|
+
await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('cannot meter');
|
|
2765
|
+
});
|
|
2766
|
+
it('rejects an unsupported hybrid config without deploying the ISM', async () => {
|
|
2767
|
+
const warpModule = await createPlainRoute();
|
|
2768
|
+
// The config-only guards used to run after the ISM step, so a rejected
|
|
2769
|
+
// apply had already paid for (and orphaned) a fresh hybrid instance.
|
|
2770
|
+
const deploySpy = sinon.spy(warpModule, 'deployOrUpdateIsm');
|
|
2771
|
+
const expectedConfig = {
|
|
2772
|
+
...(await warpModule.read()),
|
|
2773
|
+
type: TokenType.collateralVault,
|
|
2774
|
+
token: token.address,
|
|
2775
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2776
|
+
hook: delayedFlowHookNode(signer.address),
|
|
2777
|
+
};
|
|
2778
|
+
try {
|
|
2779
|
+
await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('cannot meter');
|
|
2780
|
+
expect(deploySpy.called).to.be.false;
|
|
2781
|
+
}
|
|
2782
|
+
finally {
|
|
2783
|
+
deploySpy.restore();
|
|
2784
|
+
}
|
|
2785
|
+
});
|
|
2786
|
+
it('rejects a hybrid ISM tree pointed at a different hook', async () => {
|
|
2787
|
+
const warpModule = await createPlainRoute();
|
|
2788
|
+
// A read -> edit -> apply round trip that keeps an explicit non-hybrid
|
|
2789
|
+
// hook (e.g. an IGP) while adding a DFR to the ISM tree. Without a
|
|
2790
|
+
// guard the ISM deploys and is installed, but the hybrid never becomes
|
|
2791
|
+
// the router's hook, so it can never preverify: every delivery from
|
|
2792
|
+
// this chain would revert forever while `warp check` still converges.
|
|
2793
|
+
const nonHybridHook = await mailbox.defaultHook();
|
|
2794
|
+
const expectedConfig = {
|
|
2795
|
+
...(await warpModule.read()),
|
|
2796
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2797
|
+
hook: nonHybridHook,
|
|
2798
|
+
};
|
|
2799
|
+
await expect(warpModule.update(expectedConfig)).to.be.rejectedWith("not in the 'hook' tree");
|
|
2800
|
+
});
|
|
2801
|
+
it('rejects a hook node of a different hybrid type than the ISM tree installs', async () => {
|
|
2802
|
+
const warpModule = await createPlainRoute();
|
|
2803
|
+
// The ISM tree installs a DELAYED_FLOW instance while `hook` declares a
|
|
2804
|
+
// NET_FLOW one. Only the tree's own instance is ever wired, so the
|
|
2805
|
+
// declared hook would be silently ignored and the route would stay
|
|
2806
|
+
// permanently divergent from the config the operator wrote.
|
|
2807
|
+
const expectedConfig = {
|
|
2808
|
+
...(await warpModule.read()),
|
|
2809
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2810
|
+
hook: netFlowHookNode(signer.address),
|
|
2811
|
+
};
|
|
2812
|
+
await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('is declared differently on the two surfaces');
|
|
2813
|
+
});
|
|
2814
|
+
it('ignores derived address metadata when hybrid declarations match', async () => {
|
|
2815
|
+
const warpModule = await createPlainRoute();
|
|
2816
|
+
// `address` is reader output, not declarative identity. Ignoring stale
|
|
2817
|
+
// metadata lets read -> edit -> apply replace a hybrid whose parameters
|
|
2818
|
+
// changed while the two config surfaces still describe the same target.
|
|
2819
|
+
const foreignInstanceHook = {
|
|
2820
|
+
type: HookType.DELAYED_FLOW_ROUTER,
|
|
2821
|
+
thresholdBps: 10000,
|
|
2822
|
+
maxDelay: 3600,
|
|
2823
|
+
duration: 86400n,
|
|
2824
|
+
owner: signer.address,
|
|
2825
|
+
address: randomAddress(),
|
|
2826
|
+
};
|
|
2827
|
+
const expectedConfig = {
|
|
2828
|
+
...(await warpModule.read()),
|
|
2829
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2830
|
+
hook: foreignInstanceHook,
|
|
2831
|
+
};
|
|
2832
|
+
await expect(warpModule.update(expectedConfig)).to.be.fulfilled;
|
|
2833
|
+
});
|
|
2834
|
+
it('explains a router whose ISM tree has no hybrid instance during enrollment', async () => {
|
|
2835
|
+
const warpModule = await createPlainRoute();
|
|
2836
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2837
|
+
// No hybrid was ever wired, so the enrollment pass cannot resolve a
|
|
2838
|
+
// DelayedFlowRouterHookIsm from the router's ISM tree.
|
|
2839
|
+
const deployConfig = {
|
|
2840
|
+
[chain]: {
|
|
2841
|
+
...baseConfig,
|
|
2842
|
+
type: TokenType.collateral,
|
|
2843
|
+
token: token.address,
|
|
2844
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2845
|
+
},
|
|
2846
|
+
};
|
|
2847
|
+
await expect(deriveDelayedFlowEnrollmentTargets(multiProvider, deployConfig, {
|
|
2848
|
+
[chain]: deployedTokenRoute,
|
|
2849
|
+
})).to.be.rejectedWith('no instance was resolved');
|
|
2850
|
+
});
|
|
2851
|
+
it('rejects a NetFlowRateLimitedHookIsm as a delayed-flow enrollment target', async () => {
|
|
2852
|
+
const warpModule = await createPlainRoute();
|
|
2853
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2854
|
+
// Wire the OTHER hybrid as the router's hook and ISM.
|
|
2855
|
+
await sendTxs(await warpModule.update({
|
|
2856
|
+
...(await warpModule.read()),
|
|
2857
|
+
interchainSecurityModule: netFlowIsm(signer.address),
|
|
2858
|
+
hook: netFlowHookNode(signer.address),
|
|
2859
|
+
}));
|
|
2860
|
+
// Both hybrids expose warpRouter() and both are paired with this router,
|
|
2861
|
+
// so a warpRouter()-only probe returns the NetFlow instance as a
|
|
2862
|
+
// DELAYED_FLOW_ROUTER enrollment target and pairs the wrong contract.
|
|
2863
|
+
const deployConfig = {
|
|
2864
|
+
[chain]: {
|
|
2865
|
+
...baseConfig,
|
|
2866
|
+
type: TokenType.collateral,
|
|
2867
|
+
token: token.address,
|
|
2868
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2869
|
+
},
|
|
2870
|
+
};
|
|
2871
|
+
await expect(deriveDelayedFlowEnrollmentTargets(multiProvider, deployConfig, {
|
|
2872
|
+
[chain]: deployedTokenRoute,
|
|
2873
|
+
})).to.be.rejectedWith('does not expose maxDelay()');
|
|
2874
|
+
});
|
|
2875
|
+
it('converges to zero transactions once the hybrid is wired', async () => {
|
|
2876
|
+
const warpModule = await createPlainRoute();
|
|
2877
|
+
const expectedConfig = {
|
|
2878
|
+
...(await warpModule.read()),
|
|
2879
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2880
|
+
hook: delayedFlowHookNode(signer.address),
|
|
2881
|
+
};
|
|
2882
|
+
await sendTxs(await warpModule.update(expectedConfig));
|
|
2883
|
+
// second apply of the same config must be a no-op
|
|
2884
|
+
expect(await warpModule.update(expectedConfig)).to.deep.equal([]);
|
|
2885
|
+
});
|
|
2886
|
+
it('round-trips a delayed-flow hybrid nested in an aggregation hook', async () => {
|
|
2887
|
+
const warpModule = await createPlainRoute();
|
|
2888
|
+
const expectedConfig = {
|
|
2889
|
+
...(await warpModule.read()),
|
|
2890
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2891
|
+
hook: {
|
|
2892
|
+
type: HookType.AGGREGATION,
|
|
2893
|
+
hooks: [
|
|
2894
|
+
delayedFlowHookNode(signer.address),
|
|
2895
|
+
{ type: HookType.MERKLE_TREE },
|
|
2896
|
+
],
|
|
2897
|
+
},
|
|
2898
|
+
};
|
|
2899
|
+
await sendTxs(await warpModule.update(expectedConfig));
|
|
2900
|
+
const readConfig = await warpModule.read();
|
|
2901
|
+
assert(typeof readConfig.hook === 'object' &&
|
|
2902
|
+
readConfig.hook.type === HookType.AGGREGATION, 'Expected the aggregation hook to round-trip');
|
|
2903
|
+
expect(readConfig.hook.hooks.some((hook) => typeof hook === 'object' &&
|
|
2904
|
+
hook.type === HookType.DELAYED_FLOW_ROUTER)).to.be.true;
|
|
2905
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2906
|
+
const deployConfig = {
|
|
2907
|
+
[chain]: {
|
|
2908
|
+
...baseConfig,
|
|
2909
|
+
type: TokenType.collateral,
|
|
2910
|
+
token: token.address,
|
|
2911
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2912
|
+
},
|
|
2913
|
+
};
|
|
2914
|
+
const targets = await deriveDelayedFlowEnrollmentTargets(multiProvider, deployConfig, { [chain]: deployedTokenRoute });
|
|
2915
|
+
const delayedHook = readConfig.hook.hooks.find((hook) => typeof hook === 'object' &&
|
|
2916
|
+
hook.type === HookType.DELAYED_FLOW_ROUTER);
|
|
2917
|
+
assert(delayedHook &&
|
|
2918
|
+
typeof delayedHook === 'object' &&
|
|
2919
|
+
'address' in delayedHook, 'Expected the delayed-flow hook address');
|
|
2920
|
+
expect(targets[chain].ismAddress).to.equal(delayedHook.address);
|
|
2921
|
+
expect(await warpModule.update(readConfig)).to.deep.equal([]);
|
|
2922
|
+
});
|
|
2923
|
+
it('rejects an aggregated hybrid when warp apply would retain an existing fee hook', async () => {
|
|
2924
|
+
const warpModule = await createPlainRoute();
|
|
2925
|
+
const feeHook = randomAddress();
|
|
2926
|
+
await sendTxs(await warpModule.update({
|
|
2927
|
+
...(await warpModule.read()),
|
|
2928
|
+
feeHook,
|
|
2929
|
+
}));
|
|
2930
|
+
const actualConfig = await warpModule.read();
|
|
2931
|
+
expect(actualConfig.feeHook && eqAddress(actualConfig.feeHook, feeHook)).to.equal(true);
|
|
2932
|
+
const expectedConfig = {
|
|
2933
|
+
...actualConfig,
|
|
2934
|
+
// Omission means "leave unchanged" during warp apply.
|
|
2935
|
+
feeHook: undefined,
|
|
2936
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2937
|
+
hook: {
|
|
2938
|
+
type: HookType.AGGREGATION,
|
|
2939
|
+
hooks: [
|
|
2940
|
+
delayedFlowHookNode(signer.address),
|
|
2941
|
+
{ type: HookType.MERKLE_TREE },
|
|
2942
|
+
],
|
|
2943
|
+
},
|
|
2944
|
+
tokenFee: {
|
|
2945
|
+
type: TokenFeeType.LinearFee,
|
|
2946
|
+
owner: signer.address,
|
|
2947
|
+
bps: 100,
|
|
2948
|
+
},
|
|
2949
|
+
};
|
|
2950
|
+
const nonceBefore = await signer.getTransactionCount();
|
|
2951
|
+
await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('cannot be combined with non-zero feeHook');
|
|
2952
|
+
await expect(warpModule.update({
|
|
2953
|
+
...expectedConfig,
|
|
2954
|
+
feeHook: ethers.constants.AddressZero,
|
|
2955
|
+
})).to.be.rejectedWith('while clearing existing feeHook');
|
|
2956
|
+
expect(await signer.getTransactionCount()).to.equal(nonceBefore);
|
|
2957
|
+
});
|
|
2958
|
+
it('requires fee-hook clearing before replacing or recomposing an installed delayed-flow hook', async () => {
|
|
2959
|
+
const warpModule = await createPlainRoute();
|
|
2960
|
+
const initialConfig = {
|
|
2961
|
+
...(await warpModule.read()),
|
|
2962
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
2963
|
+
hook: delayedFlowHookNode(signer.address),
|
|
2964
|
+
};
|
|
2965
|
+
await sendTxs(await warpModule.update(initialConfig));
|
|
2966
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2967
|
+
const feeHook = randomAddress();
|
|
2968
|
+
await TokenRouter__factory.connect(deployedTokenRoute, signer).setFeeHook(feeHook);
|
|
2969
|
+
const actualConfig = await warpModule.read();
|
|
2970
|
+
assert(typeof actualConfig.hook === 'object' &&
|
|
2971
|
+
actualConfig.hook.type === HookType.DELAYED_FLOW_ROUTER, 'Expected an installed delayed-flow hook');
|
|
2972
|
+
const nonceBefore = await signer.getTransactionCount();
|
|
2973
|
+
await expect(warpModule.update({
|
|
2974
|
+
...actualConfig,
|
|
2975
|
+
feeHook: ethers.constants.AddressZero,
|
|
2976
|
+
interchainSecurityModule: delayedFlowIsm(signer.address, 7200),
|
|
2977
|
+
hook: delayedFlowHookNode(signer.address, 7200),
|
|
2978
|
+
})).to.be.rejectedWith('introduce, replace, or recompose');
|
|
2979
|
+
await expect(warpModule.update({
|
|
2980
|
+
...actualConfig,
|
|
2981
|
+
feeHook: ethers.constants.AddressZero,
|
|
2982
|
+
hook: {
|
|
2983
|
+
type: HookType.AGGREGATION,
|
|
2984
|
+
hooks: [actualConfig.hook, { type: HookType.MERKLE_TREE }],
|
|
2985
|
+
},
|
|
2986
|
+
})).to.be.rejectedWith('introduce, replace, or recompose');
|
|
2987
|
+
expect(await signer.getTransactionCount()).to.equal(nonceBefore);
|
|
2988
|
+
const clearTxs = await warpModule.update({
|
|
2989
|
+
...actualConfig,
|
|
2990
|
+
feeHook: ethers.constants.AddressZero,
|
|
2991
|
+
});
|
|
2992
|
+
expect(clearTxs.some((tx) => tx.data?.startsWith(MailboxClient__factory.createInterface().getSighash('setHook')) ?? false)).to.equal(false);
|
|
2993
|
+
await sendTxs(clearTxs);
|
|
2994
|
+
expect((await warpModule.read()).feeHook).to.equal(undefined);
|
|
2995
|
+
});
|
|
2996
|
+
it('rejects an existing hybrid owned separately from its router', async () => {
|
|
2997
|
+
const warpModule = await createPlainRoute();
|
|
2998
|
+
const { deployedTokenRoute } = warpModule.serialize();
|
|
2999
|
+
const expectedConfig = {
|
|
3000
|
+
...(await warpModule.read()),
|
|
3001
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
3002
|
+
hook: delayedFlowHookNode(signer.address),
|
|
3003
|
+
};
|
|
3004
|
+
await sendTxs(await warpModule.update(expectedConfig));
|
|
3005
|
+
const client = MailboxClient__factory.connect(deployedTokenRoute, multiProvider.getProvider(chain));
|
|
3006
|
+
const hybrid = DelayedFlowRouterHookIsm__factory.connect(await client.hook(), signer);
|
|
3007
|
+
const separateOwner = randomAddress();
|
|
3008
|
+
await hybrid.transferOwnership(separateOwner);
|
|
3009
|
+
await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('is owned by');
|
|
3010
|
+
});
|
|
3011
|
+
it('hands a replacement hybrid and its router to the new owner last', async () => {
|
|
3012
|
+
const warpModule = await createPlainRoute();
|
|
3013
|
+
const initialConfig = {
|
|
3014
|
+
...(await warpModule.read()),
|
|
3015
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
3016
|
+
hook: delayedFlowHookNode(signer.address),
|
|
3017
|
+
};
|
|
3018
|
+
await sendTxs(await warpModule.update(initialConfig));
|
|
3019
|
+
const newOwner = randomAddress();
|
|
3020
|
+
const expectedConfig = {
|
|
3021
|
+
...(await warpModule.read()),
|
|
3022
|
+
owner: newOwner,
|
|
3023
|
+
interchainSecurityModule: delayedFlowIsm(newOwner, 7200),
|
|
3024
|
+
hook: delayedFlowHookNode(newOwner, 7200),
|
|
3025
|
+
};
|
|
3026
|
+
const phases = await warpModule.updatePhases(expectedConfig);
|
|
3027
|
+
expect(phases.ownershipTxs).to.have.length(2);
|
|
3028
|
+
await sendTxs([
|
|
3029
|
+
...phases.upgradeTxs,
|
|
3030
|
+
...phases.instanceTxs,
|
|
3031
|
+
...phases.hookTxs,
|
|
3032
|
+
...phases.ismTxs,
|
|
3033
|
+
...phases.txs,
|
|
3034
|
+
...phases.feeTxs,
|
|
3035
|
+
...phases.ownershipTxs,
|
|
3036
|
+
]);
|
|
3037
|
+
const actual = await warpModule.read();
|
|
3038
|
+
expect(eqAddress(actual.owner, newOwner)).to.be.true;
|
|
3039
|
+
const hybrid = collectHybridIsmNodes(actual.interchainSecurityModule)[0];
|
|
3040
|
+
assert(hybrid.type === IsmType.DELAYED_FLOW_ROUTER, 'Expected delayed-flow hybrid');
|
|
3041
|
+
expect(hybrid.owner && eqAddress(hybrid.owner, newOwner)).to.be.true;
|
|
3042
|
+
expect(hybrid.maxDelay).to.equal(7200);
|
|
3043
|
+
});
|
|
3044
|
+
it('returns hybrid instance mutations before installation and ownership', async () => {
|
|
3045
|
+
const warpModule = await createPlainRoute();
|
|
3046
|
+
const initialConfig = {
|
|
3047
|
+
...(await warpModule.read()),
|
|
3048
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
3049
|
+
hook: delayedFlowHookNode(signer.address),
|
|
3050
|
+
};
|
|
3051
|
+
await sendTxs(await warpModule.update(initialConfig));
|
|
3052
|
+
const instanceTx = {
|
|
3053
|
+
chainId: Number(multiProvider.getChainId(chain)),
|
|
3054
|
+
to: randomAddress(),
|
|
3055
|
+
data: '0x1234',
|
|
3056
|
+
};
|
|
3057
|
+
const updateStub = sinon
|
|
3058
|
+
.stub(EvmIsmModule.prototype, 'updateDeployedInstance')
|
|
3059
|
+
.resolves([instanceTx]);
|
|
3060
|
+
try {
|
|
3061
|
+
const currentConfig = await warpModule.read();
|
|
3062
|
+
const currentHybrid = collectHybridIsmNodes(currentConfig.interchainSecurityModule)[0];
|
|
3063
|
+
assert(currentHybrid && 'address' in currentHybrid, 'Expected an installed delayed-flow hybrid');
|
|
3064
|
+
const targetConfig = {
|
|
3065
|
+
...currentConfig,
|
|
3066
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
3067
|
+
hook: delayedFlowHookNode(signer.address),
|
|
3068
|
+
};
|
|
3069
|
+
const phases = await warpModule.updatePhases(targetConfig);
|
|
3070
|
+
expect(updateStub.calledOnce).to.be.true;
|
|
3071
|
+
expect(phases.instanceTxs).to.deep.equal([instanceTx]);
|
|
3072
|
+
expect(phases.ownershipTxs).not.to.include(instanceTx);
|
|
3073
|
+
}
|
|
3074
|
+
finally {
|
|
3075
|
+
updateStub.restore();
|
|
3076
|
+
}
|
|
3077
|
+
});
|
|
3078
|
+
it('resumes after hybrid ownership transfers but router ownership does not', async () => {
|
|
3079
|
+
const warpModule = await createPlainRoute();
|
|
3080
|
+
const initialConfig = {
|
|
3081
|
+
...(await warpModule.read()),
|
|
3082
|
+
interchainSecurityModule: delayedFlowIsm(signer.address),
|
|
3083
|
+
hook: delayedFlowHookNode(signer.address),
|
|
3084
|
+
};
|
|
3085
|
+
await sendTxs(await warpModule.update(initialConfig));
|
|
3086
|
+
const newOwner = randomAddress();
|
|
3087
|
+
const expectedConfig = {
|
|
3088
|
+
...(await warpModule.read()),
|
|
3089
|
+
owner: newOwner,
|
|
3090
|
+
interchainSecurityModule: delayedFlowIsm(newOwner),
|
|
3091
|
+
hook: delayedFlowHookNode(newOwner),
|
|
3092
|
+
};
|
|
3093
|
+
const interruptedPhases = await warpModule.updatePhases(expectedConfig);
|
|
3094
|
+
expect(interruptedPhases.ownershipTxs).to.have.length(2);
|
|
3095
|
+
await sendTxs([interruptedPhases.ownershipTxs[0]]);
|
|
3096
|
+
const nonceBeforeRejectedChange = await signer.getTransactionCount();
|
|
3097
|
+
await expect(warpModule.updatePhases({
|
|
3098
|
+
...expectedConfig,
|
|
3099
|
+
interchainSecurityModule: delayedFlowIsm(newOwner, 7200),
|
|
3100
|
+
hook: delayedFlowHookNode(newOwner, 7200),
|
|
3101
|
+
})).to.be.rejectedWith('was already transferred to the target owner');
|
|
3102
|
+
expect(await signer.getTransactionCount()).to.equal(nonceBeforeRejectedChange);
|
|
3103
|
+
const resumedPhases = await warpModule.updatePhases(expectedConfig);
|
|
3104
|
+
expect(resumedPhases.ownershipTxs).to.have.length(1);
|
|
3105
|
+
await sendTxs(resumedPhases.ownershipTxs);
|
|
3106
|
+
const actual = await warpModule.read();
|
|
3107
|
+
expect(eqAddress(actual.owner, newOwner)).to.be.true;
|
|
3108
|
+
const hybrid = collectHybridIsmNodes(actual.interchainSecurityModule)[0];
|
|
3109
|
+
assert(hybrid.type === IsmType.DELAYED_FLOW_ROUTER, 'Expected delayed-flow hybrid');
|
|
3110
|
+
expect(hybrid.owner && eqAddress(hybrid.owner, newOwner)).to.be.true;
|
|
3111
|
+
});
|
|
3112
|
+
});
|
|
3113
|
+
describe('createHookUpdateTxs', () => {
|
|
3114
|
+
const ROUTE_ADDRESS = '0x1111111111111111111111111111111111111111';
|
|
3115
|
+
const TOKEN_ADDRESS = '0x2222222222222222222222222222222222222222';
|
|
3116
|
+
let warpModule;
|
|
3117
|
+
before(() => {
|
|
3118
|
+
warpModule = new EvmWarpModule(multiProvider, {
|
|
3119
|
+
chain,
|
|
3120
|
+
config: {},
|
|
3121
|
+
addresses: {
|
|
3122
|
+
deployedTokenRoute: ROUTE_ADDRESS,
|
|
3123
|
+
...ismFactoryAddresses,
|
|
3124
|
+
},
|
|
3125
|
+
});
|
|
3126
|
+
});
|
|
3127
|
+
it('returns empty when expected hook is AddressZero', async () => {
|
|
3128
|
+
const actual = {
|
|
3129
|
+
...baseConfig,
|
|
3130
|
+
type: TokenType.collateral,
|
|
3131
|
+
token: TOKEN_ADDRESS,
|
|
3132
|
+
};
|
|
3133
|
+
const expected = {
|
|
3134
|
+
...baseConfig,
|
|
3135
|
+
type: TokenType.collateral,
|
|
3136
|
+
token: TOKEN_ADDRESS,
|
|
3137
|
+
hook: ethers.constants.AddressZero,
|
|
3138
|
+
};
|
|
3139
|
+
expect(await warpModule.createHookUpdateTxs(actual, expected)).to.deep.equal([]);
|
|
3140
|
+
});
|
|
3141
|
+
});
|
|
3142
|
+
});
|
|
3143
|
+
//# sourceMappingURL=EvmWarpModule.hardhat-test.js.map
|