@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,1800 @@
|
|
|
1
|
+
// import { expect } from 'chai';
|
|
2
|
+
import { compareVersions } from 'compare-versions';
|
|
3
|
+
import { constants, utils } from 'ethers';
|
|
4
|
+
import { CrossCollateralRouter__factory, EverclearTokenBridge__factory, GasRouter__factory, IERC20__factory, MailboxClient__factory, MovableCollateralRouter__factory, PredicateRouterWrapper__factory, ProxyAdmin__factory, StaticAggregationHook__factory, StaticAggregationHookFactory__factory, TimelockController__factory, TokenBridgeCctpBase__factory, TokenBridgeCctpV2__factory, TokenRouter__factory, } from '@recoillink/core';
|
|
5
|
+
import { buildArtifact as coreBuildArtifact } from '@recoillink/core/buildArtifact.js';
|
|
6
|
+
import { ZERO_ADDRESS_HEX_32, addressToBytes32, assert, concurrentMap, deepEquals, difference, eqAddress, isAddressEvm, isNullish, isObjEmpty, isZeroishAddress, normalizeAddressEvm, objDiff, objFilter, objKeys, objMap, promiseObjAll, rootLogger, } from '@recoillink/utils';
|
|
7
|
+
import { ExplorerLicenseType } from '../block-explorer/etherscan.js';
|
|
8
|
+
import { DEFAULT_CONTRACT_READ_CONCURRENCY } from '../consts/concurrency.js';
|
|
9
|
+
import { transferOwnershipTransactions } from '../contracts/contracts.js';
|
|
10
|
+
import { HyperlaneModule, } from '../core/AbstractHyperlaneModule.js';
|
|
11
|
+
import { contractHasCode, isInitialized, isStorageEmpty, proxyAdmin, proxyAdminUpdateTxs, } from '../deploy/proxy.js';
|
|
12
|
+
import { ContractVerifier } from '../deploy/verify/ContractVerifier.js';
|
|
13
|
+
import { EvmTokenFeeModule } from '../fee/EvmTokenFeeModule.js';
|
|
14
|
+
import { mergeCrossCollateralRouters } from '../fee/crossCollateralUtils.js';
|
|
15
|
+
import { TokenFeeType } from '../fee/types.js';
|
|
16
|
+
import { getEvmHookUpdateTransactions } from '../hook/updates.js';
|
|
17
|
+
import { collectHybridHookNodes, resolveHybridHookNodesToAddress, stripPredicateSubHook, } from '../hook/utils.js';
|
|
18
|
+
import { HookType, OnchainHookType, } from '../hook/types.js';
|
|
19
|
+
import { EvmIsmModule } from '../ism/EvmIsmModule.js';
|
|
20
|
+
import { EvmIsmReader } from '../ism/EvmIsmReader.js';
|
|
21
|
+
import { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory.js';
|
|
22
|
+
import { moduleMatchesConfig } from '../ism/utils.js';
|
|
23
|
+
import { PredicateWrapperDeployer } from '../predicate/PredicateDeployer.js';
|
|
24
|
+
import { resolveRouterMapConfig } from '../router/types.js';
|
|
25
|
+
import { CANCELLER_ROLE, EXECUTOR_ROLE, PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE, } from '../timelock/evm/constants.js';
|
|
26
|
+
import { isDeterministicTimelockReadError } from '../timelock/evm/errors.js';
|
|
27
|
+
import { planChainHybrid, } from '../deploy/warpHybridPlan.js';
|
|
28
|
+
import { scalesEqual } from '../utils/decimals.js';
|
|
29
|
+
import { isRevertData } from '../utils/contract.js';
|
|
30
|
+
import { IsmType } from '../ism/types.js';
|
|
31
|
+
import { DelayedFlowRemoteIsmsSourceType, collectHybridIsmNodes, completeHybridIsmNodes, extractIsmAndHookFactoryAddresses, ismTreeContainsHybridHookIsm, ismTreeContainsRateLimited, normalizeConfig, resolveHybridIsmNodesToAddress, setRateLimitedIsmRecipient, } from '../utils/ism.js';
|
|
32
|
+
import { CCTP_PPM_STORAGE_VERSION, EvmWarpRouteReader, } from './EvmWarpRouteReader.js';
|
|
33
|
+
import { EvmXERC20Module } from './EvmXERC20Module.js';
|
|
34
|
+
import { TokenType } from './config.js';
|
|
35
|
+
import { resolveAndValidateRebalanceConfig, resolveTokenFeeAddress, } from './configUtils.js';
|
|
36
|
+
import { hypERC20contracts } from './contracts.js';
|
|
37
|
+
import { HypERC20Deployer } from './deploy.js';
|
|
38
|
+
import { HypTokenRouterConfigSchema, PredicateWrapperConfigSchema, VERSION_ERROR_MESSAGE, contractVersionMatchesDependency, derivedHookAddress, derivedIsmAddress, isCctpTokenConfig, isEverclearTokenBridgeConfig, isMovableCollateralTokenConfig, isCrossCollateralTokenConfig, isOftTokenConfig, isXERC20TokenConfig, } from './types.js';
|
|
39
|
+
// The last contract version where `approveTokenForBridge` granted max allowance
|
|
40
|
+
// instead of revoking it. Hardcoded (not CONTRACTS_PACKAGE_VERSION) because the
|
|
41
|
+
// package version moves to the next major at release and would wrongly match the
|
|
42
|
+
// new revoke-semantics implementations.
|
|
43
|
+
export const MAX_LEGACY_BRIDGE_APPROVAL_VERSION = '11.3.1';
|
|
44
|
+
/**
|
|
45
|
+
* Whether `approveTokenForBridge` GRANTS a standing max allowance on the given
|
|
46
|
+
* contract version (legacy impls) rather than REVOKING it (new impls). The
|
|
47
|
+
* selector is overloaded by implementation version.
|
|
48
|
+
*/
|
|
49
|
+
export function bridgeApprovalGrantsMaxAllowance(contractVersion) {
|
|
50
|
+
return (compareVersions(contractVersion, MAX_LEGACY_BRIDGE_APPROVAL_VERSION) <= 0);
|
|
51
|
+
}
|
|
52
|
+
const getAllowedRebalancingBridgesByDomain = (allowedRebalancingBridgesByDomain) => {
|
|
53
|
+
return objMap(allowedRebalancingBridgesByDomain, (_domainId, allowedRebalancingBridges) => {
|
|
54
|
+
return new Set(allowedRebalancingBridges.map((bridgeConfig) => normalizeAddressEvm(bridgeConfig.bridge)));
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
const getRebalanceTargetsByDomain = (rebalanceTargetsByDomain) => {
|
|
58
|
+
return objMap(rebalanceTargetsByDomain, (_domainId, targets) => new Set(targets.map((target) => addressToBytes32(target).toLowerCase())));
|
|
59
|
+
};
|
|
60
|
+
const getRebalanceRecipientsByDomain = (rebalanceRecipientsByDomain) => {
|
|
61
|
+
return objMap(rebalanceRecipientsByDomain, (_domainId, recipient) => addressToBytes32(recipient).toLowerCase());
|
|
62
|
+
};
|
|
63
|
+
export class EvmWarpModule extends HyperlaneModule {
|
|
64
|
+
multiProvider;
|
|
65
|
+
ccipContractCache;
|
|
66
|
+
contractVerifier;
|
|
67
|
+
static deployedTimelockByProvider = new WeakMap();
|
|
68
|
+
logger = rootLogger.child({
|
|
69
|
+
module: 'EvmWarpModule',
|
|
70
|
+
});
|
|
71
|
+
reader;
|
|
72
|
+
chainName;
|
|
73
|
+
chainId;
|
|
74
|
+
domainId;
|
|
75
|
+
constructor(multiProvider, args, ccipContractCache, contractVerifier) {
|
|
76
|
+
super(args);
|
|
77
|
+
this.multiProvider = multiProvider;
|
|
78
|
+
this.ccipContractCache = ccipContractCache;
|
|
79
|
+
this.contractVerifier = contractVerifier;
|
|
80
|
+
this.reader = new EvmWarpRouteReader(multiProvider, args.chain);
|
|
81
|
+
this.chainName = this.multiProvider.getChainName(args.chain);
|
|
82
|
+
this.chainId = multiProvider.getEvmChainId(args.chain);
|
|
83
|
+
this.domainId = multiProvider.getDomainId(args.chain);
|
|
84
|
+
this.chainId = multiProvider.getEvmChainId(args.chain);
|
|
85
|
+
this.contractVerifier ??= new ContractVerifier(multiProvider, {}, coreBuildArtifact, ExplorerLicenseType.MIT);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Retrieves the token router configuration for the specified address.
|
|
89
|
+
*
|
|
90
|
+
* @param address - The address to derive the token router configuration from.
|
|
91
|
+
* @returns A promise that resolves to the token router configuration.
|
|
92
|
+
*/
|
|
93
|
+
async read() {
|
|
94
|
+
const config = await this.reader.deriveWarpRouteConfig(this.args.addresses.deployedTokenRoute);
|
|
95
|
+
// recipient is always the token address itself — implicit in the warp
|
|
96
|
+
// context, so omit it from read() output to keep configs clean.
|
|
97
|
+
// Mutate in place to preserve the DerivedIsmConfig type (WithAddress<...>).
|
|
98
|
+
const stripRecipient = (node) => {
|
|
99
|
+
if (typeof node !== 'object' || node === null)
|
|
100
|
+
return;
|
|
101
|
+
const n = node;
|
|
102
|
+
if (n.type === IsmType.RATE_LIMITED) {
|
|
103
|
+
delete n.recipient;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (Array.isArray(n.modules))
|
|
107
|
+
n.modules.forEach(stripRecipient);
|
|
108
|
+
if (typeof n.domains === 'object' && n.domains !== null)
|
|
109
|
+
Object.values(n.domains).forEach(stripRecipient);
|
|
110
|
+
if (n.lowerIsm)
|
|
111
|
+
stripRecipient(n.lowerIsm);
|
|
112
|
+
if (n.upperIsm)
|
|
113
|
+
stripRecipient(n.upperIsm);
|
|
114
|
+
};
|
|
115
|
+
const ism = config.interchainSecurityModule;
|
|
116
|
+
if (typeof ism !== 'string' && ismTreeContainsRateLimited(ism))
|
|
117
|
+
stripRecipient(ism);
|
|
118
|
+
return config;
|
|
119
|
+
}
|
|
120
|
+
async timelockMatchesConfig(timelockAddress, config, codeAlreadyVerified = false) {
|
|
121
|
+
const provider = this.multiProvider.getProvider(this.chainName);
|
|
122
|
+
if (!codeAlreadyVerified &&
|
|
123
|
+
isStorageEmpty(await provider.getCode(timelockAddress))) {
|
|
124
|
+
this.logger.debug({ chain: this.chainName, timelockAddress }, 'ProxyAdmin owner has no contract code and is not a TimelockController');
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
const timelockController = TimelockController__factory.connect(timelockAddress, provider);
|
|
128
|
+
try {
|
|
129
|
+
const [delay, hasProposer, hasExecutor, hasCanceller, hasAdminSelf] = await Promise.all([
|
|
130
|
+
timelockController.getMinDelay(),
|
|
131
|
+
timelockController.hasRole(PROPOSER_ROLE, config.roles.proposer),
|
|
132
|
+
timelockController.hasRole(EXECUTOR_ROLE, config.roles.executor),
|
|
133
|
+
timelockController.hasRole(CANCELLER_ROLE, config.roles.proposer),
|
|
134
|
+
timelockController.hasRole(TIMELOCK_ADMIN_ROLE, timelockAddress),
|
|
135
|
+
]);
|
|
136
|
+
return (delay.eq(config.delay) &&
|
|
137
|
+
hasProposer &&
|
|
138
|
+
hasExecutor &&
|
|
139
|
+
hasCanceller &&
|
|
140
|
+
hasAdminSelf);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (!isDeterministicTimelockReadError(error))
|
|
144
|
+
throw error;
|
|
145
|
+
this.logger.debug({ chain: this.chainName, error, timelockAddress }, 'ProxyAdmin owner does not match the expected timelock config');
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async cachedTimelockMatchesConfig(timelockAddress, config) {
|
|
150
|
+
const provider = this.multiProvider.getProvider(this.chainName);
|
|
151
|
+
if (!(await contractHasCode(provider, timelockAddress))) {
|
|
152
|
+
this.logger.debug({ chain: this.chainName, timelockAddress }, 'Cached TimelockController has no code after visibility retry');
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
return this.timelockMatchesConfig(timelockAddress, config, true);
|
|
156
|
+
}
|
|
157
|
+
async configWithTimelockProxyAdminOwner(actualConfig, expectedConfig) {
|
|
158
|
+
if (!expectedConfig.timelock)
|
|
159
|
+
return expectedConfig;
|
|
160
|
+
assert(actualConfig.proxyAdmin?.address && actualConfig.proxyAdmin.owner, `Cannot configure timelock for non-proxied warp route on ${this.chainName}`);
|
|
161
|
+
assert(!expectedConfig.proxyAdmin?.address ||
|
|
162
|
+
eqAddress(expectedConfig.proxyAdmin.address, actualConfig.proxyAdmin.address), `Cannot configure timelock while changing ProxyAdmin address on ${this.chainName}`);
|
|
163
|
+
let timelockControllerAddress;
|
|
164
|
+
if (await this.timelockMatchesConfig(actualConfig.proxyAdmin.owner, expectedConfig.timelock)) {
|
|
165
|
+
timelockControllerAddress = actualConfig.proxyAdmin.owner;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const timelockCacheKey = this.timelockDeploymentCacheKey(actualConfig.proxyAdmin.address, expectedConfig.timelock);
|
|
169
|
+
const deployedTimelockByConfig = EvmWarpModule.deployedTimelockByConfig(this.multiProvider);
|
|
170
|
+
const cachedTimelockControllerAddress = deployedTimelockByConfig.get(timelockCacheKey);
|
|
171
|
+
if (cachedTimelockControllerAddress &&
|
|
172
|
+
(await this.cachedTimelockMatchesConfig(cachedTimelockControllerAddress, expectedConfig.timelock))) {
|
|
173
|
+
timelockControllerAddress = cachedTimelockControllerAddress;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
timelockControllerAddress = (await new HypERC20Deployer(this.multiProvider, undefined, this.contractVerifier).deployTimelock(this.chainName, expectedConfig.timelock)).address;
|
|
177
|
+
deployedTimelockByConfig.set(timelockCacheKey, timelockControllerAddress);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
...expectedConfig,
|
|
182
|
+
proxyAdmin: {
|
|
183
|
+
...expectedConfig.proxyAdmin,
|
|
184
|
+
address: actualConfig.proxyAdmin.address,
|
|
185
|
+
owner: timelockControllerAddress,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
timelockDeploymentCacheKey(proxyAdminAddress, config) {
|
|
190
|
+
return JSON.stringify({
|
|
191
|
+
chainName: this.chainName,
|
|
192
|
+
delay: config.delay.toString(),
|
|
193
|
+
executor: normalizeAddressEvm(config.roles.executor),
|
|
194
|
+
proposer: normalizeAddressEvm(config.roles.proposer),
|
|
195
|
+
proxyAdminAddress: normalizeAddressEvm(proxyAdminAddress),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
static deployedTimelockByConfig(multiProvider) {
|
|
199
|
+
let deployedTimelockByConfig = EvmWarpModule.deployedTimelockByProvider.get(multiProvider);
|
|
200
|
+
if (!deployedTimelockByConfig) {
|
|
201
|
+
deployedTimelockByConfig = new Map();
|
|
202
|
+
EvmWarpModule.deployedTimelockByProvider.set(multiProvider, deployedTimelockByConfig);
|
|
203
|
+
}
|
|
204
|
+
return deployedTimelockByConfig;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Plans a Warp Route update as per-chain transaction groups.
|
|
208
|
+
*
|
|
209
|
+
* IMPORTANT — irreversible side effects when expectedConfig includes `predicateWrapper`:
|
|
210
|
+
* The PredicateRouterWrapper contract is deployed on-chain during planning (before this
|
|
211
|
+
* method returns). If the returned transactions are never submitted, the wrapper is
|
|
212
|
+
* orphaned. See PredicateWrapperDeployer.deployAndConfigure for details.
|
|
213
|
+
*
|
|
214
|
+
* IMPORTANT — irreversible side effects when expectedConfig includes `timelock`:
|
|
215
|
+
* A TimelockController may be deployed on-chain during planning so the returned ownership
|
|
216
|
+
* transactions can transfer ProxyAdmin ownership to it. The deployment address is cached
|
|
217
|
+
* per MultiProvider, revalidated, and reused across retries for the same
|
|
218
|
+
* chain/ProxyAdmin/timelock config, but a declined or externally persisted
|
|
219
|
+
* transaction plan can still leave an untracked timelock deployment.
|
|
220
|
+
*
|
|
221
|
+
* @param expectedConfig - The configuration for the token router to be updated.
|
|
222
|
+
* Used by warp apply to assemble one ordered batch for this chain.
|
|
223
|
+
*/
|
|
224
|
+
async updatePhases(expectedConfig, tokenReaderParams, cctpDomains = []) {
|
|
225
|
+
HypTokenRouterConfigSchema.parse(expectedConfig);
|
|
226
|
+
const actualConfig = await this.read();
|
|
227
|
+
const hybridPlan = this.planHybridUpdate(actualConfig, expectedConfig);
|
|
228
|
+
const actualHasDelayedFlowRouter = (typeof actualConfig.hook === 'object' &&
|
|
229
|
+
collectHybridHookNodes(actualConfig.hook).some(({ type }) => type === HookType.DELAYED_FLOW_ROUTER)) ||
|
|
230
|
+
(typeof actualConfig.interchainSecurityModule === 'object' &&
|
|
231
|
+
collectHybridIsmNodes(actualConfig.interchainSecurityModule).some(({ type }) => type === IsmType.DELAYED_FLOW_ROUTER));
|
|
232
|
+
const targetHasDelayedFlowRouter = (typeof expectedConfig.hook === 'object' &&
|
|
233
|
+
collectHybridHookNodes(expectedConfig.hook).some(({ type }) => type === HookType.DELAYED_FLOW_ROUTER)) ||
|
|
234
|
+
(typeof expectedConfig.interchainSecurityModule === 'object' &&
|
|
235
|
+
collectHybridIsmNodes(expectedConfig.interchainSecurityModule).some(({ type }) => type === IsmType.DELAYED_FLOW_ROUTER));
|
|
236
|
+
const removesDelayedFlowRouter = actualHasDelayedFlowRouter && !targetHasDelayedFlowRouter;
|
|
237
|
+
expectedConfig = await this.configWithTimelockProxyAdminOwner(actualConfig, expectedConfig);
|
|
238
|
+
const transactions = [];
|
|
239
|
+
let xerc20Txs = [];
|
|
240
|
+
if (isXERC20TokenConfig(expectedConfig)) {
|
|
241
|
+
const { module, config } = await EvmXERC20Module.fromWarpRouteConfig(this.multiProvider, this.chainName, expectedConfig, this.args.addresses.deployedTokenRoute);
|
|
242
|
+
xerc20Txs = await module.update(config);
|
|
243
|
+
}
|
|
244
|
+
const allFeeTxs = await this.createTokenFeeUpdateTxs(actualConfig, expectedConfig, tokenReaderParams);
|
|
245
|
+
// Split feeTxs by authority: setFeeRecipient targets the token router (router
|
|
246
|
+
// owner gated) while all other fee txs target the fee contract (fee-contract
|
|
247
|
+
// owner gated). Keeping them in the same bucket means a dedicated feeSubmitter
|
|
248
|
+
// (which owns the fee contract) would try to call setFeeRecipient — which reverts
|
|
249
|
+
// because it doesn't own the router. Router-owner txs go into the main batch;
|
|
250
|
+
// only fee-contract-owner txs are returned as feeTxs for the feeSubmitter.
|
|
251
|
+
const routerAddress = this.args.addresses.deployedTokenRoute.toLowerCase();
|
|
252
|
+
const routerOwnerFeeTxs = allFeeTxs.filter((tx) => tx.to?.toLowerCase() === routerAddress);
|
|
253
|
+
const feeTxs = allFeeTxs.filter((tx) => tx.to?.toLowerCase() !== routerAddress);
|
|
254
|
+
/**
|
|
255
|
+
* @remark
|
|
256
|
+
* The order of operations matter
|
|
257
|
+
* 1. createOwnershipUpdateTxs() must always be LAST because no updates possible after ownership transferred
|
|
258
|
+
* 2. createEnrollRemoteRoutersUpdateTxs() must be BEFORE createSetDestinationGasUpdateTxs()
|
|
259
|
+
* because GasRouter requires routers to be enrolled before setting destination gas
|
|
260
|
+
* 3. createHookAndPredicateUpdateTxs() handles hook + predicate wrapper together so the
|
|
261
|
+
* pending new hook address is threaded through without leaking into other method signatures
|
|
262
|
+
* 4. The hook transactions are pushed BEFORE the ISM transactions, whatever the order they
|
|
263
|
+
* are built in — see the comment at the push
|
|
264
|
+
*/
|
|
265
|
+
const upgradeTxs = await this.upgradeWarpRouteImplementationTx(actualConfig, expectedConfig);
|
|
266
|
+
if (upgradeTxs.length === 0 &&
|
|
267
|
+
isCctpTokenConfig(actualConfig) &&
|
|
268
|
+
isCctpTokenConfig(expectedConfig) &&
|
|
269
|
+
expectedConfig.cctpVersion === 'V2') {
|
|
270
|
+
assert(eqAddress(actualConfig.messageTransmitter, expectedConfig.messageTransmitter), `Configured CCTP message transmitter ${expectedConfig.messageTransmitter} does not match the deployed router's immutable transmitter ${actualConfig.messageTransmitter}`);
|
|
271
|
+
}
|
|
272
|
+
// Pure hybrid validation already ran immediately after the read. Resolve
|
|
273
|
+
// (and, when needed, deploy) the shared instance for both config trees.
|
|
274
|
+
const hybrid = await this.resolveHybridInstance(actualConfig, expectedConfig, hybridPlan);
|
|
275
|
+
// With the shared address known, both trees reference it as an ordinary
|
|
276
|
+
// address child and the existing ISM/hook modules deploy whatever parents
|
|
277
|
+
// remain. Nothing downstream needs to know a hybrid is involved.
|
|
278
|
+
const resolvedConfig = hybrid
|
|
279
|
+
? {
|
|
280
|
+
...expectedConfig,
|
|
281
|
+
interchainSecurityModule: resolveHybridIsmNodesToAddress(hybrid.ismTree, hybrid.address),
|
|
282
|
+
hook: resolveHybridHookNodesToAddress(hybrid.hookTree, hybrid.address),
|
|
283
|
+
}
|
|
284
|
+
: expectedConfig;
|
|
285
|
+
const ismTxs = await this.createIsmUpdateTxs(actualConfig, resolvedConfig, hybrid?.address);
|
|
286
|
+
// Built after the ISM step, which may deploy the tree, but ORDERED BEFORE
|
|
287
|
+
// it: a batch executes sequentially with no rollback, so a failure between
|
|
288
|
+
// the two installs is a state the route can be left in. Hook first leaves
|
|
289
|
+
// the previous ISM verifying inbound messages. ISM first can leave a hybrid
|
|
290
|
+
// hook/ISM gating delivery while nothing drives its postDispatch — no
|
|
291
|
+
// preverification is ever sent for the messages dispatched in that window,
|
|
292
|
+
// and none can be sent afterwards, so they are permanently undeliverable.
|
|
293
|
+
// Returned in their own buckets so callers can choose the safe order within
|
|
294
|
+
// this chain's batch, including reversing it when removing delayed flow.
|
|
295
|
+
const hookTxs = await this.createHookAndPredicateUpdateTxs(actualConfig, resolvedConfig, hybrid?.address);
|
|
296
|
+
transactions.push(...this.createFeeHookUpdateTxs(actualConfig, expectedConfig), ...this.createUnenrollRemoteRoutersUpdateTxs(actualConfig, expectedConfig), ...this.createEnrollRemoteRoutersUpdateTxs(actualConfig, expectedConfig),
|
|
297
|
+
// MC unenroll before enroll for consistency with remote routers.
|
|
298
|
+
// MC enrollment must come before gas setting so that MC-only domains
|
|
299
|
+
...this.createUnenrollCrossCollateralRoutersTxs(actualConfig, expectedConfig), ...this.createEnrollCrossCollateralRoutersTxs(actualConfig, expectedConfig), ...this.createSetDestinationGasUpdateTxs(actualConfig, expectedConfig), ...this.createAddRebalancersUpdateTxs(actualConfig, expectedConfig), ...this.createRemoveRebalancersUpdateTxs(actualConfig, expectedConfig), ...(await this.createAddAllowedBridgesUpdateTxs(actualConfig, expectedConfig)), ...this.createRemoveBridgesTxs(actualConfig, expectedConfig), ...this.createAddRebalanceTargetsUpdateTxs(actualConfig, expectedConfig), ...this.createRemoveRebalanceTargetsTxs(actualConfig, expectedConfig), ...this.createSetRecipientsUpdateTxs(actualConfig, expectedConfig), ...this.createRemoveRecipientsTxs(actualConfig, expectedConfig), ...(await this.createRevokeStaleBridgeAllowancesTxs(actualConfig, expectedConfig, upgradeTxs.length > 0)), ...this.createAddRemoteOutputAssetsTxs(actualConfig, expectedConfig), ...this.createRemoveRemoteOutputAssetsTxs(actualConfig, expectedConfig), ...this.createUpdateEverclearFeeParamsTxs(actualConfig, expectedConfig), ...this.createRemoveEverclearFeeParamsTxs(actualConfig, expectedConfig), ...(await this.createAddCctpDomainsTxs(expectedConfig, cctpDomains)), ...this.createSetMaxFeePpmTxs(actualConfig, expectedConfig), ...xerc20Txs,
|
|
300
|
+
// Router-owner fee txs (setFeeRecipient) belong in the main batch so they
|
|
301
|
+
// always execute under the router owner's authority — even when a dedicated
|
|
302
|
+
// feeSubmitter is configured for fee-contract-owner txs.
|
|
303
|
+
...routerOwnerFeeTxs);
|
|
304
|
+
// Ownership/proxyAdmin must always execute last; returned separately so callers
|
|
305
|
+
// can place feeTxs between main txs and ownership (see update() below).
|
|
306
|
+
const ownershipTxs = [
|
|
307
|
+
...(hybrid?.ownershipTxs ?? []),
|
|
308
|
+
...this.createOwnershipUpdateTxs(actualConfig, expectedConfig),
|
|
309
|
+
...proxyAdminUpdateTxs(this.chainId, this.args.addresses.deployedTokenRoute, actualConfig, expectedConfig),
|
|
310
|
+
];
|
|
311
|
+
return {
|
|
312
|
+
upgradeTxs,
|
|
313
|
+
instanceTxs: hybrid?.instanceTxs ?? [],
|
|
314
|
+
hookTxs,
|
|
315
|
+
ismTxs,
|
|
316
|
+
txs: transactions,
|
|
317
|
+
feeTxs,
|
|
318
|
+
ownershipTxs,
|
|
319
|
+
hybridIsm: hybrid?.address,
|
|
320
|
+
removesDelayedFlowRouter,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Main-compatible split: router-owner work, fee-owner work, then ownership.
|
|
325
|
+
*/
|
|
326
|
+
async updateSplit(expectedConfig, tokenReaderParams, cctpDomains = []) {
|
|
327
|
+
const { upgradeTxs, instanceTxs, hookTxs, ismTxs, txs, feeTxs, ownershipTxs, removesDelayedFlowRouter, } = await this.updatePhases(expectedConfig, tokenReaderParams, cctpDomains);
|
|
328
|
+
return {
|
|
329
|
+
txs: removesDelayedFlowRouter
|
|
330
|
+
? [...upgradeTxs, ...instanceTxs, ...ismTxs, ...hookTxs, ...txs]
|
|
331
|
+
: [...upgradeTxs, ...instanceTxs, ...hookTxs, ...ismTxs, ...txs],
|
|
332
|
+
feeTxs,
|
|
333
|
+
ownershipTxs,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/** Returns a flat, ordered transaction array suitable for one submitter. */
|
|
337
|
+
async update(expectedConfig, tokenReaderParams, cctpDomains = []) {
|
|
338
|
+
const { txs, feeTxs, ownershipTxs } = await this.updateSplit(expectedConfig, tokenReaderParams, cctpDomains);
|
|
339
|
+
// feeTxs (fee-contract-owner calls) must come before ownershipTxs so they
|
|
340
|
+
// execute before the router owner changes.
|
|
341
|
+
return [...txs, ...feeTxs, ...ownershipTxs];
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Validates hybrid composition and fee-hook transitions before update
|
|
345
|
+
* planning reaches any operation that may deploy a contract.
|
|
346
|
+
*/
|
|
347
|
+
planHybridUpdate(actualConfig, expectedConfig) {
|
|
348
|
+
// An omitted feeHook is intentionally left unchanged by warp apply. Plan
|
|
349
|
+
// against the effective value so an already-installed ERC20 fee hook
|
|
350
|
+
// cannot bypass hybrid hook composition validation.
|
|
351
|
+
const effectiveFeeHook = expectedConfig.feeHook ?? actualConfig.feeHook;
|
|
352
|
+
const plan = planChainHybrid({
|
|
353
|
+
multiProvider: this.multiProvider,
|
|
354
|
+
chain: this.chainName,
|
|
355
|
+
config: { ...expectedConfig, feeHook: effectiveFeeHook },
|
|
356
|
+
});
|
|
357
|
+
if (!plan)
|
|
358
|
+
return undefined;
|
|
359
|
+
if (plan.node.type === IsmType.DELAYED_FLOW_ROUTER &&
|
|
360
|
+
actualConfig.feeHook &&
|
|
361
|
+
!isZeroishAddress(actualConfig.feeHook) &&
|
|
362
|
+
expectedConfig.feeHook &&
|
|
363
|
+
isZeroishAddress(expectedConfig.feeHook)) {
|
|
364
|
+
const actualHook = actualConfig.hook;
|
|
365
|
+
const expectedHook = expectedConfig.hook;
|
|
366
|
+
const installedHybrid = typeof actualHook === 'object'
|
|
367
|
+
? collectHybridHookNodes(actualHook)[0]
|
|
368
|
+
: undefined;
|
|
369
|
+
const delayedFlowHookStaysInstalled = installedHybrid?.type === HookType.DELAYED_FLOW_ROUTER &&
|
|
370
|
+
installedHybrid.duration === plan.node.duration &&
|
|
371
|
+
installedHybrid.thresholdBps === plan.node.thresholdBps &&
|
|
372
|
+
installedHybrid.maxDelay === plan.node.maxDelay &&
|
|
373
|
+
(plan.node.warpRouter === undefined ||
|
|
374
|
+
(!!installedHybrid.warpRouter &&
|
|
375
|
+
eqAddress(installedHybrid.warpRouter, plan.node.warpRouter))) &&
|
|
376
|
+
typeof expectedHook === 'object' &&
|
|
377
|
+
deepEquals(normalizeConfig(resolveHybridHookNodesToAddress(actualHook, constants.AddressZero)), normalizeConfig(resolveHybridHookNodesToAddress(expectedHook, constants.AddressZero)));
|
|
378
|
+
assert(delayedFlowHookStaysInstalled, `Cannot introduce, replace, or recompose ${IsmType.DELAYED_FLOW_ROUTER} on ${this.chainName} while clearing existing feeHook ${actualConfig.feeHook} in the same warp apply. Hook installation runs before router updates, leaving the delayed-flow hook active while ERC20 fee metadata still prevents its native control dispatch. Apply feeHook address(0) without changing the hook first, execute that update, then apply the ${IsmType.DELAYED_FLOW_ROUTER} config.`);
|
|
379
|
+
}
|
|
380
|
+
return plan;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Reuses or deploys the one hybrid leaf declared on both config surfaces.
|
|
384
|
+
* Parent trees only ever receive the returned address, preventing duplicate
|
|
385
|
+
* bucket state. Instance mutations are returned separately so counterpart
|
|
386
|
+
* enrollment can precede either router-surface change in this chain's batch.
|
|
387
|
+
*/
|
|
388
|
+
async resolveHybridInstance(actualConfig, expectedConfig, plan) {
|
|
389
|
+
if (!plan)
|
|
390
|
+
return undefined;
|
|
391
|
+
const completed = completeHybridIsmNodes(plan.node, this.args.addresses.deployedTokenRoute, { type: DelayedFlowRemoteIsmsSourceType.Deferred }, actualConfig.owner, this.multiProvider);
|
|
392
|
+
assert(typeof completed === 'object' &&
|
|
393
|
+
(completed.type === IsmType.NET_FLOW_RATE_LIMITED ||
|
|
394
|
+
completed.type === IsmType.DELAYED_FLOW_ROUTER), `Failed to complete hybrid hook/ISM config on ${this.chainName}`);
|
|
395
|
+
// Every owner-gated mutation is signed by the router's current owner.
|
|
396
|
+
// Ownership moves to the target owner only in the final ownership phase.
|
|
397
|
+
const desired = {
|
|
398
|
+
...completed,
|
|
399
|
+
owner: actualConfig.owner,
|
|
400
|
+
};
|
|
401
|
+
const actualHook = actualConfig.hook;
|
|
402
|
+
const hookNodes = typeof actualHook === 'object' ? collectHybridHookNodes(actualHook) : [];
|
|
403
|
+
const actualIsm = actualConfig.interchainSecurityModule;
|
|
404
|
+
const ismNodes = typeof actualIsm === 'object' ? collectHybridIsmNodes(actualIsm) : [];
|
|
405
|
+
assert(hookNodes.length <= 1 && ismNodes.length <= 1, `Expected at most one installed hybrid hook/ISM on each surface of ${this.chainName}, found ${hookNodes.length} under hook and ${ismNodes.length} under interchainSecurityModule`);
|
|
406
|
+
// Prefer the hook: submission can be interrupted after its update but before
|
|
407
|
+
// the ISM update, leaving the new leaf installed while the ISM still has the
|
|
408
|
+
// old tree. A later apply must reuse that new leaf.
|
|
409
|
+
const candidate = hookNodes[0] ?? ismNodes[0];
|
|
410
|
+
const currentAddress = candidate &&
|
|
411
|
+
'address' in candidate &&
|
|
412
|
+
typeof candidate.address === 'string'
|
|
413
|
+
? candidate.address
|
|
414
|
+
: undefined;
|
|
415
|
+
if (currentAddress) {
|
|
416
|
+
const current = await new EvmIsmReader(this.multiProvider, this.chainName).deriveIsmConfig(currentAddress);
|
|
417
|
+
assert(typeof current === 'object' &&
|
|
418
|
+
(current.type === IsmType.NET_FLOW_RATE_LIMITED ||
|
|
419
|
+
current.type === IsmType.DELAYED_FLOW_ROUTER), `Expected ${currentAddress} on ${this.chainName} to be a hybrid hook/ISM`);
|
|
420
|
+
const ownedByRouter = current.owner && eqAddress(current.owner, actualConfig.owner);
|
|
421
|
+
const alreadyTransferred = !ownedByRouter &&
|
|
422
|
+
current.owner &&
|
|
423
|
+
expectedConfig.owner &&
|
|
424
|
+
eqAddress(current.owner, expectedConfig.owner);
|
|
425
|
+
assert(ownedByRouter || alreadyTransferred, `Hybrid hook/ISM ${currentAddress} on ${this.chainName} is owned by ${current.owner}, but its warp router is owned by ${actualConfig.owner}. Warp apply uses the router's submitter for every non-fee mutation, so align the owners before applying this config.`);
|
|
426
|
+
if (alreadyTransferred) {
|
|
427
|
+
const factory = HyperlaneIsmFactory.fromAddressesMap({ [this.chainName]: this.args.addresses }, this.multiProvider, this.ccipContractCache, this.contractVerifier);
|
|
428
|
+
const matchesFinalConfig = await moduleMatchesConfig(this.chainName, currentAddress, { ...completed, owner: expectedConfig.owner }, this.multiProvider, factory.getContracts(this.chainName), actualConfig.mailbox);
|
|
429
|
+
assert(matchesFinalConfig, `Hybrid hook/ISM ${currentAddress} on ${this.chainName} was already transferred to the target owner ${expectedConfig.owner}, but its config does not match the target. Complete or revert the interrupted ownership transfer before changing its config.`);
|
|
430
|
+
return {
|
|
431
|
+
address: currentAddress,
|
|
432
|
+
ismTree: plan.ismTree,
|
|
433
|
+
hookTree: plan.hookTree,
|
|
434
|
+
instanceTxs: [],
|
|
435
|
+
ownershipTxs: [],
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
const module = new EvmIsmModule(this.multiProvider, {
|
|
439
|
+
chain: this.chainName,
|
|
440
|
+
config: current,
|
|
441
|
+
addresses: {
|
|
442
|
+
...this.args.addresses,
|
|
443
|
+
mailbox: actualConfig.mailbox,
|
|
444
|
+
deployedIsm: currentAddress,
|
|
445
|
+
},
|
|
446
|
+
}, this.ccipContractCache, this.contractVerifier);
|
|
447
|
+
const txs = await module.updateDeployedInstance(desired);
|
|
448
|
+
const { deployedIsm } = module.serialize();
|
|
449
|
+
assert(deployedIsm, `Failed to resolve hybrid hook/ISM on ${this.chainName}`);
|
|
450
|
+
const ownershipTxs = transferOwnershipTransactions(this.chainId, deployedIsm, { owner: actualConfig.owner }, { owner: expectedConfig.owner }, `hybrid hook/ISM on ${this.chainName}`);
|
|
451
|
+
return {
|
|
452
|
+
address: deployedIsm,
|
|
453
|
+
ismTree: plan.ismTree,
|
|
454
|
+
hookTree: plan.hookTree,
|
|
455
|
+
instanceTxs: txs,
|
|
456
|
+
ownershipTxs,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
const factory = HyperlaneIsmFactory.fromAddressesMap({ [this.chainName]: this.args.addresses }, this.multiProvider, this.ccipContractCache, this.contractVerifier);
|
|
460
|
+
const deployed = await factory.deployInternal({
|
|
461
|
+
destination: this.chainName,
|
|
462
|
+
config: desired,
|
|
463
|
+
mailbox: actualConfig.mailbox,
|
|
464
|
+
});
|
|
465
|
+
const ownershipTxs = transferOwnershipTransactions(this.chainId, deployed.address, { owner: actualConfig.owner }, { owner: expectedConfig.owner }, `hybrid hook/ISM on ${this.chainName}`);
|
|
466
|
+
return {
|
|
467
|
+
address: deployed.address,
|
|
468
|
+
ismTree: plan.ismTree,
|
|
469
|
+
hookTree: plan.hookTree,
|
|
470
|
+
instanceTxs: [],
|
|
471
|
+
ownershipTxs,
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Create a transaction to update the remote routers for the Warp Route contract.
|
|
476
|
+
*
|
|
477
|
+
* @param actualConfig - The on-chain router configuration, including the remoteRouters array.
|
|
478
|
+
* @param expectedConfig - The expected token router configuration.
|
|
479
|
+
* @returns A array with a single Ethereum transaction that need to be executed to enroll the routers
|
|
480
|
+
*/
|
|
481
|
+
createEnrollRemoteRoutersUpdateTxs(actualConfig, expectedConfig) {
|
|
482
|
+
// OFT contracts don't have Router interface — no remote router enrollment
|
|
483
|
+
if (isOftTokenConfig(expectedConfig)) {
|
|
484
|
+
return [];
|
|
485
|
+
}
|
|
486
|
+
const updateTransactions = [];
|
|
487
|
+
if (!expectedConfig.remoteRouters) {
|
|
488
|
+
return [];
|
|
489
|
+
}
|
|
490
|
+
assert(actualConfig.remoteRouters, 'actualRemoteRouters is undefined');
|
|
491
|
+
assert(expectedConfig.remoteRouters, 'actualRemoteRouters is undefined');
|
|
492
|
+
const { remoteRouters: actualRemoteRouters } = actualConfig;
|
|
493
|
+
const { remoteRouters: expectedRemoteRouters } = expectedConfig;
|
|
494
|
+
const routesToEnroll = Object.entries(expectedRemoteRouters)
|
|
495
|
+
.map(([domain, rawRouter]) => [
|
|
496
|
+
domain,
|
|
497
|
+
{ address: addressToBytes32(rawRouter.address) },
|
|
498
|
+
])
|
|
499
|
+
.filter(([domain, expectedRouter]) => {
|
|
500
|
+
const actualRouter = actualRemoteRouters[domain];
|
|
501
|
+
// Enroll if router doesn't exist for domain or has different address
|
|
502
|
+
return !actualRouter || actualRouter.address !== expectedRouter.address;
|
|
503
|
+
})
|
|
504
|
+
.map(([domain]) => domain);
|
|
505
|
+
if (routesToEnroll.length === 0) {
|
|
506
|
+
return updateTransactions;
|
|
507
|
+
}
|
|
508
|
+
const contractToUpdate = TokenRouter__factory.connect(this.args.addresses.deployedTokenRoute, this.multiProvider.getProvider(this.domainId));
|
|
509
|
+
updateTransactions.push({
|
|
510
|
+
chainId: this.chainId,
|
|
511
|
+
annotation: `Enrolling Router ${this.args.addresses.deployedTokenRoute} on ${this.args.chain}`,
|
|
512
|
+
to: contractToUpdate.address,
|
|
513
|
+
data: contractToUpdate.interface.encodeFunctionData('enrollRemoteRouters', [
|
|
514
|
+
routesToEnroll.map((k) => Number(k)),
|
|
515
|
+
routesToEnroll.map((a) => addressToBytes32(expectedRemoteRouters[a].address)),
|
|
516
|
+
]),
|
|
517
|
+
});
|
|
518
|
+
return updateTransactions;
|
|
519
|
+
}
|
|
520
|
+
createUnenrollRemoteRoutersUpdateTxs(actualConfig, expectedConfig) {
|
|
521
|
+
// OFT contracts don't have Router interface — no remote router unenrollment
|
|
522
|
+
if (isOftTokenConfig(expectedConfig)) {
|
|
523
|
+
return [];
|
|
524
|
+
}
|
|
525
|
+
const updateTransactions = [];
|
|
526
|
+
if (!expectedConfig.remoteRouters) {
|
|
527
|
+
return [];
|
|
528
|
+
}
|
|
529
|
+
assert(actualConfig.remoteRouters, 'actualRemoteRouters is undefined');
|
|
530
|
+
assert(expectedConfig.remoteRouters, 'actualRemoteRouters is undefined');
|
|
531
|
+
const { remoteRouters: actualRemoteRouters } = actualConfig;
|
|
532
|
+
const { remoteRouters: expectedRemoteRouters } = expectedConfig;
|
|
533
|
+
const routesToUnenroll = Array.from(difference(new Set(Object.keys(actualRemoteRouters)), new Set(Object.keys(expectedRemoteRouters))));
|
|
534
|
+
if (routesToUnenroll.length === 0) {
|
|
535
|
+
return updateTransactions;
|
|
536
|
+
}
|
|
537
|
+
const contractToUpdate = TokenRouter__factory.connect(this.args.addresses.deployedTokenRoute, this.multiProvider.getProvider(this.domainId));
|
|
538
|
+
updateTransactions.push({
|
|
539
|
+
annotation: `Unenrolling Router ${this.args.addresses.deployedTokenRoute} on ${this.args.chain}`,
|
|
540
|
+
chainId: this.chainId,
|
|
541
|
+
to: contractToUpdate.address,
|
|
542
|
+
data: contractToUpdate.interface.encodeFunctionData('unenrollRemoteRouters(uint32[])', [routesToUnenroll.map((k) => Number(k))]),
|
|
543
|
+
});
|
|
544
|
+
return updateTransactions;
|
|
545
|
+
}
|
|
546
|
+
createAddRebalancersUpdateTxs(actualConfig, expectedConfig) {
|
|
547
|
+
if (!isMovableCollateralTokenConfig(expectedConfig) ||
|
|
548
|
+
!isMovableCollateralTokenConfig(actualConfig)) {
|
|
549
|
+
return [];
|
|
550
|
+
}
|
|
551
|
+
if (!expectedConfig.allowedRebalancers) {
|
|
552
|
+
return [];
|
|
553
|
+
}
|
|
554
|
+
const formattedExpectedRebalancers = new Set(expectedConfig.allowedRebalancers.map(normalizeAddressEvm));
|
|
555
|
+
const formattedActualRebalancers = new Set((actualConfig.allowedRebalancers ?? []).map(normalizeAddressEvm));
|
|
556
|
+
const rebalancersToAdd = Array.from(difference(formattedExpectedRebalancers, formattedActualRebalancers));
|
|
557
|
+
if (rebalancersToAdd.length === 0) {
|
|
558
|
+
return [];
|
|
559
|
+
}
|
|
560
|
+
return rebalancersToAdd.map((rebalancerToAdd) => ({
|
|
561
|
+
chainId: this.chainId,
|
|
562
|
+
annotation: `Adding rebalancer role to "${rebalancerToAdd}" on token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
563
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
564
|
+
data: MovableCollateralRouter__factory.createInterface().encodeFunctionData('addRebalancer(address)', [rebalancerToAdd]),
|
|
565
|
+
}));
|
|
566
|
+
}
|
|
567
|
+
createRemoveRebalancersUpdateTxs(actualConfig, expectedConfig) {
|
|
568
|
+
if (!isMovableCollateralTokenConfig(expectedConfig) ||
|
|
569
|
+
!isMovableCollateralTokenConfig(actualConfig)) {
|
|
570
|
+
return [];
|
|
571
|
+
}
|
|
572
|
+
if (!expectedConfig.allowedRebalancers) {
|
|
573
|
+
return [];
|
|
574
|
+
}
|
|
575
|
+
const formattedExpectedRebalancers = new Set(expectedConfig.allowedRebalancers.map(normalizeAddressEvm));
|
|
576
|
+
const formattedActualRebalancers = new Set((actualConfig.allowedRebalancers ?? []).map(normalizeAddressEvm));
|
|
577
|
+
const rebalancersToRemove = Array.from(difference(formattedActualRebalancers, formattedExpectedRebalancers));
|
|
578
|
+
if (rebalancersToRemove.length === 0) {
|
|
579
|
+
return [];
|
|
580
|
+
}
|
|
581
|
+
return rebalancersToRemove.map((rebalancerToRemove) => ({
|
|
582
|
+
chainId: this.chainId,
|
|
583
|
+
annotation: `Removing rebalancer role from "${rebalancerToRemove}" on token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
584
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
585
|
+
data: MovableCollateralRouter__factory.createInterface().encodeFunctionData('removeRebalancer(address)', [rebalancerToRemove]),
|
|
586
|
+
}));
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Create transactions to enroll CrossCollateralRouter routers.
|
|
590
|
+
*/
|
|
591
|
+
createEnrollCrossCollateralRoutersTxs(actualConfig, expectedConfig) {
|
|
592
|
+
if (!isCrossCollateralTokenConfig(expectedConfig) ||
|
|
593
|
+
!isCrossCollateralTokenConfig(actualConfig)) {
|
|
594
|
+
return [];
|
|
595
|
+
}
|
|
596
|
+
if (!expectedConfig.crossCollateralRouters) {
|
|
597
|
+
return [];
|
|
598
|
+
}
|
|
599
|
+
const actualEnrolled = resolveRouterMapConfig(this.multiProvider, actualConfig.crossCollateralRouters ?? {});
|
|
600
|
+
const expectedEnrolled = resolveRouterMapConfig(this.multiProvider, expectedConfig.crossCollateralRouters);
|
|
601
|
+
const domainsToEnroll = [];
|
|
602
|
+
const routersToEnroll = [];
|
|
603
|
+
for (const [domain, expectedRouters] of Object.entries(expectedEnrolled)) {
|
|
604
|
+
const domainId = Number(domain);
|
|
605
|
+
const actualRouters = new Set((actualEnrolled[domainId] ?? []).map((router) => this.toCanonicalRouterId(router)));
|
|
606
|
+
for (const router of expectedRouters) {
|
|
607
|
+
const canonicalRouter = this.toCanonicalRouterId(router);
|
|
608
|
+
if (!actualRouters.has(canonicalRouter)) {
|
|
609
|
+
domainsToEnroll.push(domainId);
|
|
610
|
+
routersToEnroll.push(canonicalRouter);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
if (domainsToEnroll.length === 0) {
|
|
615
|
+
return [];
|
|
616
|
+
}
|
|
617
|
+
return [
|
|
618
|
+
{
|
|
619
|
+
chainId: this.chainId,
|
|
620
|
+
annotation: `Enrolling ${domainsToEnroll.length} CrossCollateralRouter routers on ${this.args.addresses.deployedTokenRoute} on ${this.chainName}`,
|
|
621
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
622
|
+
data: CrossCollateralRouter__factory.createInterface().encodeFunctionData('enrollCrossCollateralRouters', [domainsToEnroll, routersToEnroll]),
|
|
623
|
+
},
|
|
624
|
+
];
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Create transactions to unenroll CrossCollateralRouter routers.
|
|
628
|
+
*/
|
|
629
|
+
createUnenrollCrossCollateralRoutersTxs(actualConfig, expectedConfig) {
|
|
630
|
+
if (!isCrossCollateralTokenConfig(expectedConfig) ||
|
|
631
|
+
!isCrossCollateralTokenConfig(actualConfig)) {
|
|
632
|
+
return [];
|
|
633
|
+
}
|
|
634
|
+
const expectedCrossCollateralRouters = expectedConfig.crossCollateralRouters ?? {};
|
|
635
|
+
const actualEnrolled = resolveRouterMapConfig(this.multiProvider, actualConfig.crossCollateralRouters ?? {});
|
|
636
|
+
const expectedEnrolled = resolveRouterMapConfig(this.multiProvider, expectedCrossCollateralRouters);
|
|
637
|
+
const domainsToUnenroll = [];
|
|
638
|
+
const routersToUnenroll = [];
|
|
639
|
+
for (const [domain, actualRouters] of Object.entries(actualEnrolled)) {
|
|
640
|
+
const domainId = Number(domain);
|
|
641
|
+
const expectedRouters = new Set((expectedEnrolled[domainId] ?? []).map((router) => this.toCanonicalRouterId(router)));
|
|
642
|
+
for (const router of actualRouters) {
|
|
643
|
+
const canonicalRouter = this.toCanonicalRouterId(router);
|
|
644
|
+
if (!expectedRouters.has(canonicalRouter)) {
|
|
645
|
+
domainsToUnenroll.push(domainId);
|
|
646
|
+
routersToUnenroll.push(canonicalRouter);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
if (domainsToUnenroll.length === 0) {
|
|
651
|
+
return [];
|
|
652
|
+
}
|
|
653
|
+
return [
|
|
654
|
+
{
|
|
655
|
+
chainId: this.chainId,
|
|
656
|
+
annotation: `Unenrolling ${domainsToUnenroll.length} CrossCollateralRouter routers on ${this.args.addresses.deployedTokenRoute} on ${this.chainName}`,
|
|
657
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
658
|
+
data: CrossCollateralRouter__factory.createInterface().encodeFunctionData('unenrollCrossCollateralRouters', [domainsToUnenroll, routersToUnenroll]),
|
|
659
|
+
},
|
|
660
|
+
];
|
|
661
|
+
}
|
|
662
|
+
toCanonicalRouterId(router) {
|
|
663
|
+
const lower = router.toLowerCase();
|
|
664
|
+
if (isAddressEvm(lower)) {
|
|
665
|
+
return addressToBytes32(lower);
|
|
666
|
+
}
|
|
667
|
+
return lower;
|
|
668
|
+
}
|
|
669
|
+
/**
|
|
670
|
+
* Grants standing ERC20 allowances declared in `allowedRebalancingBridges[].approvedTokens`.
|
|
671
|
+
*
|
|
672
|
+
* Only legacy (pre-atomic-rebalancing) routers need explicit grants: their
|
|
673
|
+
* `approveTokenForBridge` sets max allowance. New impls grant an exact temporary
|
|
674
|
+
* allowance per rebalance and the same selector REVOKES, so emitting grants there
|
|
675
|
+
* would be wrong. Gated on the on-chain version being legacy, mirroring
|
|
676
|
+
* `createRevokeStaleBridgeAllowancesTxs`.
|
|
677
|
+
*/
|
|
678
|
+
async getAllowedBridgesApprovalTxs(actualConfig, expectedConfig) {
|
|
679
|
+
if (!isMovableCollateralTokenConfig(expectedConfig) ||
|
|
680
|
+
!isMovableCollateralTokenConfig(actualConfig)) {
|
|
681
|
+
return [];
|
|
682
|
+
}
|
|
683
|
+
if (!expectedConfig.allowedRebalancingBridges) {
|
|
684
|
+
return [];
|
|
685
|
+
}
|
|
686
|
+
// Only routers on a legacy impl grant max via `approveTokenForBridge`; on a new
|
|
687
|
+
// impl the same selector revokes, so there is nothing to grant ahead of time.
|
|
688
|
+
if (!actualConfig.contractVersion ||
|
|
689
|
+
!bridgeApprovalGrantsMaxAllowance(actualConfig.contractVersion)) {
|
|
690
|
+
return [];
|
|
691
|
+
}
|
|
692
|
+
const tokensToApproveByAllowedBridge = Object.values(expectedConfig.allowedRebalancingBridges).reduce((acc, allowedBridgesConfigs) => {
|
|
693
|
+
allowedBridgesConfigs.forEach((bridgeConfig) => {
|
|
694
|
+
acc[bridgeConfig.bridge] ??= [];
|
|
695
|
+
acc[bridgeConfig.bridge].push(...(bridgeConfig.approvedTokens ?? []));
|
|
696
|
+
});
|
|
697
|
+
return acc;
|
|
698
|
+
},
|
|
699
|
+
// allowed bridge -> tokens to approve
|
|
700
|
+
{});
|
|
701
|
+
const filteredTokensToApproveByAllowedBridge = await promiseObjAll(objMap(tokensToApproveByAllowedBridge, async (bridge, tokens) => {
|
|
702
|
+
const filteredApprovals = [];
|
|
703
|
+
for (const token of tokens) {
|
|
704
|
+
const instance = IERC20__factory.connect(token, this.multiProvider.getProvider(this.chainId));
|
|
705
|
+
const allowance = await instance.allowance(this.args.addresses.deployedTokenRoute, bridge);
|
|
706
|
+
if (!allowance.eq(constants.MaxUint256)) {
|
|
707
|
+
filteredApprovals.push(token);
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
return filteredApprovals;
|
|
711
|
+
}));
|
|
712
|
+
return Object.entries(filteredTokensToApproveByAllowedBridge).flatMap(([bridge, tokensToApprove]) => tokensToApprove.map((tokenToApprove) => ({
|
|
713
|
+
chainId: this.chainId,
|
|
714
|
+
annotation: `Approving allowed bridge "${bridge}" to spend token "${tokenToApprove}" on behalf of "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
715
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
716
|
+
data: MovableCollateralRouter__factory.createInterface().encodeFunctionData('approveTokenForBridge(address,address)', [tokenToApprove, bridge]),
|
|
717
|
+
})));
|
|
718
|
+
}
|
|
719
|
+
async createAddAllowedBridgesUpdateTxs(actualConfig, expectedConfig) {
|
|
720
|
+
if (!isMovableCollateralTokenConfig(expectedConfig) ||
|
|
721
|
+
!isMovableCollateralTokenConfig(actualConfig)) {
|
|
722
|
+
return [];
|
|
723
|
+
}
|
|
724
|
+
if (!expectedConfig.allowedRebalancingBridges) {
|
|
725
|
+
return [];
|
|
726
|
+
}
|
|
727
|
+
const actualAllowedBridges = getAllowedRebalancingBridgesByDomain(resolveRouterMapConfig(this.multiProvider, actualConfig.allowedRebalancingBridges ?? {}));
|
|
728
|
+
const expectedAllowedBridges = getAllowedRebalancingBridgesByDomain(resolveRouterMapConfig(this.multiProvider, expectedConfig.allowedRebalancingBridges));
|
|
729
|
+
const rebalancingBridgesToAddByDomain = objMap(expectedAllowedBridges, (domain, bridges) => {
|
|
730
|
+
const actualBridges = actualAllowedBridges[domain] ?? new Set();
|
|
731
|
+
return Array.from(difference(bridges, actualBridges));
|
|
732
|
+
});
|
|
733
|
+
const bridgesToAllow = Object.entries(rebalancingBridgesToAddByDomain).flatMap(([domain, allowedBridgesToAdd]) => {
|
|
734
|
+
return allowedBridgesToAdd.map((bridgeToAdd) => {
|
|
735
|
+
return {
|
|
736
|
+
chainId: this.chainId,
|
|
737
|
+
annotation: `Adding allowed bridge "${bridgeToAdd}" on token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
738
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
739
|
+
data: MovableCollateralRouter__factory.createInterface().encodeFunctionData('addBridge(uint32,address)', [domain, bridgeToAdd]),
|
|
740
|
+
};
|
|
741
|
+
});
|
|
742
|
+
});
|
|
743
|
+
const approvalTxs = await this.getAllowedBridgesApprovalTxs(actualConfig, expectedConfig);
|
|
744
|
+
return [...bridgesToAllow, ...approvalTxs];
|
|
745
|
+
}
|
|
746
|
+
createRemoveBridgesTxs(actualConfig, expectedConfig) {
|
|
747
|
+
if (!isMovableCollateralTokenConfig(expectedConfig) ||
|
|
748
|
+
!isMovableCollateralTokenConfig(actualConfig)) {
|
|
749
|
+
return [];
|
|
750
|
+
}
|
|
751
|
+
if (!expectedConfig.allowedRebalancingBridges) {
|
|
752
|
+
return [];
|
|
753
|
+
}
|
|
754
|
+
const actualAllowedBridges = getAllowedRebalancingBridgesByDomain(resolveRouterMapConfig(this.multiProvider, actualConfig.allowedRebalancingBridges ?? {}));
|
|
755
|
+
const expectedAllowedBridges = getAllowedRebalancingBridgesByDomain(resolveRouterMapConfig(this.multiProvider, expectedConfig.allowedRebalancingBridges));
|
|
756
|
+
const rebalancingBridgesToAddByDomain = objMap(actualAllowedBridges, (domain, bridges) => {
|
|
757
|
+
const expectedBridges = expectedAllowedBridges[domain] ?? new Set();
|
|
758
|
+
return Array.from(difference(bridges, expectedBridges));
|
|
759
|
+
});
|
|
760
|
+
return Object.entries(rebalancingBridgesToAddByDomain).flatMap(([domain, allowedBridgesToAdd]) => {
|
|
761
|
+
return allowedBridgesToAdd.map((bridgeToAdd) => {
|
|
762
|
+
return {
|
|
763
|
+
chainId: this.chainId,
|
|
764
|
+
annotation: `Removing allowed bridge "${bridgeToAdd}" on token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
765
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
766
|
+
data: MovableCollateralRouter__factory.createInterface().encodeFunctionData('removeBridge(uint32,address)', [domain, bridgeToAdd]),
|
|
767
|
+
};
|
|
768
|
+
});
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
createAddRebalanceTargetsUpdateTxs(actualConfig, expectedConfig) {
|
|
772
|
+
if (!isCrossCollateralTokenConfig(expectedConfig) ||
|
|
773
|
+
!isCrossCollateralTokenConfig(actualConfig)) {
|
|
774
|
+
return [];
|
|
775
|
+
}
|
|
776
|
+
if (!expectedConfig.rebalanceTargets) {
|
|
777
|
+
return [];
|
|
778
|
+
}
|
|
779
|
+
const actualTargets = getRebalanceTargetsByDomain(resolveRouterMapConfig(this.multiProvider, actualConfig.rebalanceTargets ?? {}));
|
|
780
|
+
const { rebalanceTargets } = resolveAndValidateRebalanceConfig(this.multiProvider, this.chainName, expectedConfig);
|
|
781
|
+
const expectedTargets = getRebalanceTargetsByDomain(rebalanceTargets);
|
|
782
|
+
const targetsToAddByDomain = objMap(expectedTargets, (domain, targets) => {
|
|
783
|
+
const actual = actualTargets[domain] ?? new Set();
|
|
784
|
+
return Array.from(difference(targets, actual));
|
|
785
|
+
});
|
|
786
|
+
return Object.entries(targetsToAddByDomain).flatMap(([domain, toAdd]) => toAdd.map((target) => ({
|
|
787
|
+
chainId: this.chainId,
|
|
788
|
+
annotation: `Adding rebalance target "${target}" for domain ${domain} on token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
789
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
790
|
+
data: CrossCollateralRouter__factory.createInterface().encodeFunctionData('addRebalanceTarget(uint32,bytes32)', [domain, target]),
|
|
791
|
+
})));
|
|
792
|
+
}
|
|
793
|
+
createRemoveRebalanceTargetsTxs(actualConfig, expectedConfig) {
|
|
794
|
+
if (!isCrossCollateralTokenConfig(expectedConfig) ||
|
|
795
|
+
!isCrossCollateralTokenConfig(actualConfig)) {
|
|
796
|
+
return [];
|
|
797
|
+
}
|
|
798
|
+
const actualTargets = getRebalanceTargetsByDomain(resolveRouterMapConfig(this.multiProvider, actualConfig.rebalanceTargets ?? {}));
|
|
799
|
+
const { rebalanceTargets } = resolveAndValidateRebalanceConfig(this.multiProvider, this.chainName, expectedConfig);
|
|
800
|
+
const expectedTargets = getRebalanceTargetsByDomain(rebalanceTargets);
|
|
801
|
+
const targetsToRemoveByDomain = objMap(actualTargets, (domain, targets) => {
|
|
802
|
+
const expected = expectedTargets[domain] ?? new Set();
|
|
803
|
+
return Array.from(difference(targets, expected));
|
|
804
|
+
});
|
|
805
|
+
return Object.entries(targetsToRemoveByDomain).flatMap(([domain, toRemove]) => toRemove.map((target) => ({
|
|
806
|
+
chainId: this.chainId,
|
|
807
|
+
annotation: `Removing rebalance target "${target}" for domain ${domain} on token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
808
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
809
|
+
data: CrossCollateralRouter__factory.createInterface().encodeFunctionData('removeRebalanceTarget(uint32,bytes32)', [domain, target]),
|
|
810
|
+
})));
|
|
811
|
+
}
|
|
812
|
+
createSetRecipientsUpdateTxs(actualConfig, expectedConfig) {
|
|
813
|
+
if (!isCrossCollateralTokenConfig(expectedConfig) ||
|
|
814
|
+
!isCrossCollateralTokenConfig(actualConfig)) {
|
|
815
|
+
return [];
|
|
816
|
+
}
|
|
817
|
+
if (!expectedConfig.rebalanceRecipients) {
|
|
818
|
+
return [];
|
|
819
|
+
}
|
|
820
|
+
const actualRecipients = getRebalanceRecipientsByDomain(resolveRouterMapConfig(this.multiProvider, actualConfig.rebalanceRecipients ?? {}));
|
|
821
|
+
const { rebalanceRecipients } = resolveAndValidateRebalanceConfig(this.multiProvider, this.chainName, expectedConfig);
|
|
822
|
+
const expectedRecipients = getRebalanceRecipientsByDomain(rebalanceRecipients);
|
|
823
|
+
const recipientsToSetByDomain = objDiff(expectedRecipients, actualRecipients);
|
|
824
|
+
return Object.entries(recipientsToSetByDomain).map(([domain, recipient]) => ({
|
|
825
|
+
chainId: this.chainId,
|
|
826
|
+
annotation: `Setting rebalance recipient "${recipient}" for domain ${domain} on token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
827
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
828
|
+
data: CrossCollateralRouter__factory.createInterface().encodeFunctionData('setRecipient(uint32,bytes32)', [domain, recipient]),
|
|
829
|
+
}));
|
|
830
|
+
}
|
|
831
|
+
createRemoveRecipientsTxs(actualConfig, expectedConfig) {
|
|
832
|
+
if (!isCrossCollateralTokenConfig(expectedConfig) ||
|
|
833
|
+
!isCrossCollateralTokenConfig(actualConfig)) {
|
|
834
|
+
return [];
|
|
835
|
+
}
|
|
836
|
+
const actualRecipients = getRebalanceRecipientsByDomain(resolveRouterMapConfig(this.multiProvider, actualConfig.rebalanceRecipients ?? {}));
|
|
837
|
+
const { rebalanceRecipients } = resolveAndValidateRebalanceConfig(this.multiProvider, this.chainName, expectedConfig);
|
|
838
|
+
const expectedRecipients = getRebalanceRecipientsByDomain(rebalanceRecipients);
|
|
839
|
+
const recipientDomainsToRemove = Array.from(difference(new Set(Object.keys(actualRecipients)), new Set(Object.keys(expectedRecipients))));
|
|
840
|
+
return recipientDomainsToRemove.map((domain) => ({
|
|
841
|
+
chainId: this.chainId,
|
|
842
|
+
annotation: `Removing rebalance recipient for domain ${domain} on token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
843
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
844
|
+
data: CrossCollateralRouter__factory.createInterface().encodeFunctionData('removeRecipient(uint32)', [domain]),
|
|
845
|
+
}));
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* Revokes legacy standing ERC20 allowances for bridges that remain allowlisted
|
|
849
|
+
* after an in-place upgrade.
|
|
850
|
+
*
|
|
851
|
+
* Pre-atomic-rebalancing routers granted `type(uint256).max` to every enrolled
|
|
852
|
+
* bridge in `_addBridge` (the collateral token) and, via the legacy
|
|
853
|
+
* `approvedTokens` grant path, to arbitrary tokens. After upgrading, bridges that
|
|
854
|
+
* are removed have their allowance revoked on-chain by `_removeBridge`, and
|
|
855
|
+
* newly-added bridges never received a legacy allowance. Bridges that REMAIN
|
|
856
|
+
* allowlisted, however, keep those stale max allowances until the next rebalance.
|
|
857
|
+
* This method emits txs that set the collateral token AND any configured
|
|
858
|
+
* `approvedTokens` allowances back to zero so an allowlisted bridge has no
|
|
859
|
+
* out-of-band transferFrom power over the router balance.
|
|
860
|
+
*
|
|
861
|
+
* `approveTokenForBridge` only has revoke semantics on the new implementation;
|
|
862
|
+
* on legacy impls the same selector GRANTS max. Revoke txs are therefore emitted
|
|
863
|
+
* unless the router is on a legacy impl that is not being upgraded this run, so
|
|
864
|
+
* they always execute against the new revoke-semantics impl — whether this run
|
|
865
|
+
* upgrades it in place or it was already upgraded (which keeps cleanup retryable
|
|
866
|
+
* if an earlier run upgraded but its revoke txs never executed).
|
|
867
|
+
*/
|
|
868
|
+
async createRevokeStaleBridgeAllowancesTxs(actualConfig, expectedConfig, upgradeScheduled) {
|
|
869
|
+
if (!isMovableCollateralTokenConfig(expectedConfig) ||
|
|
870
|
+
!isMovableCollateralTokenConfig(actualConfig)) {
|
|
871
|
+
return [];
|
|
872
|
+
}
|
|
873
|
+
if (!expectedConfig.allowedRebalancingBridges) {
|
|
874
|
+
return [];
|
|
875
|
+
}
|
|
876
|
+
// `approveTokenForBridge` only revokes on the new implementation; on a legacy
|
|
877
|
+
// impl the same selector GRANTS max. Skip only when the router is on a legacy
|
|
878
|
+
// impl and is NOT being upgraded this run — emitting there would re-create the
|
|
879
|
+
// allowance. Otherwise the revoke executes against the new impl: either because
|
|
880
|
+
// this run upgrades it in place, or because it is already upgraded. The latter
|
|
881
|
+
// keeps cleanup retryable if a prior run upgraded but its revoke txs never
|
|
882
|
+
// executed; the non-zero on-chain allowance check below filters out routers
|
|
883
|
+
// with nothing stale left to clear.
|
|
884
|
+
if (!actualConfig.contractVersion ||
|
|
885
|
+
(bridgeApprovalGrantsMaxAllowance(actualConfig.contractVersion) &&
|
|
886
|
+
!upgradeScheduled)) {
|
|
887
|
+
return [];
|
|
888
|
+
}
|
|
889
|
+
const provider = this.multiProvider.getProvider(this.chainId);
|
|
890
|
+
// The collateral token backing the router. Native routes (address(0)) have no
|
|
891
|
+
// ERC20 collateral, but may still carry stale `approvedTokens` grants.
|
|
892
|
+
const collateralToken = await MovableCollateralRouter__factory.connect(this.args.addresses.deployedTokenRoute, provider).token();
|
|
893
|
+
// Bridge addresses currently allowlisted on-chain (across all domains).
|
|
894
|
+
// Allowances are keyed by (router, bridge) and are domain-agnostic, so we match
|
|
895
|
+
// bridges by address rather than per domain — this catches a bridge moved between
|
|
896
|
+
// domains, whose stale allowance a per-domain comparison would miss.
|
|
897
|
+
const actualBridges = new Set();
|
|
898
|
+
for (const bridges of Object.values(getAllowedRebalancingBridgesByDomain(resolveRouterMapConfig(this.multiProvider, actualConfig.allowedRebalancingBridges ?? {})))) {
|
|
899
|
+
for (const bridge of bridges) {
|
|
900
|
+
actualBridges.add(bridge);
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
// For each bridge that remains allowlisted (present in both configs by address),
|
|
904
|
+
// the tokens whose stale legacy allowance must be revoked: the collateral token
|
|
905
|
+
// plus any `approvedTokens` the legacy grant path could have approved. Removed
|
|
906
|
+
// bridges are revoked on-chain by `_removeBridge`; newly added bridges never held
|
|
907
|
+
// a legacy allowance. `actualConfig` does not derive approvedTokens, so the
|
|
908
|
+
// expected config is the signal of what was granted; each candidate is gated on a
|
|
909
|
+
// non-zero on-chain allowance below.
|
|
910
|
+
const tokensByBridge = new Map();
|
|
911
|
+
for (const bridgeConfigs of Object.values(resolveRouterMapConfig(this.multiProvider, expectedConfig.allowedRebalancingBridges))) {
|
|
912
|
+
for (const { bridge, approvedTokens } of bridgeConfigs) {
|
|
913
|
+
const normalizedBridge = normalizeAddressEvm(bridge);
|
|
914
|
+
if (!actualBridges.has(normalizedBridge)) {
|
|
915
|
+
continue;
|
|
916
|
+
}
|
|
917
|
+
const tokens = tokensByBridge.get(normalizedBridge) ?? new Set();
|
|
918
|
+
if (!isZeroishAddress(collateralToken)) {
|
|
919
|
+
tokens.add(normalizeAddressEvm(collateralToken));
|
|
920
|
+
}
|
|
921
|
+
for (const token of approvedTokens ?? []) {
|
|
922
|
+
tokens.add(normalizeAddressEvm(token));
|
|
923
|
+
}
|
|
924
|
+
tokensByBridge.set(normalizedBridge, tokens);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
const revokeTxs = [];
|
|
928
|
+
for (const [bridge, tokensToRevoke] of tokensByBridge) {
|
|
929
|
+
for (const token of tokensToRevoke) {
|
|
930
|
+
const allowance = await IERC20__factory.connect(token, provider).allowance(this.args.addresses.deployedTokenRoute, bridge);
|
|
931
|
+
if (allowance.isZero()) {
|
|
932
|
+
continue;
|
|
933
|
+
}
|
|
934
|
+
revokeTxs.push({
|
|
935
|
+
chainId: this.chainId,
|
|
936
|
+
annotation: `Revoking legacy bridge allowance for token "${token}" and bridge "${bridge}" on "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
937
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
938
|
+
data: MovableCollateralRouter__factory.createInterface().encodeFunctionData('approveTokenForBridge(address,address)', [token, bridge]),
|
|
939
|
+
});
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
return revokeTxs;
|
|
943
|
+
}
|
|
944
|
+
createAddRemoteOutputAssetsTxs(actualConfig, expectedConfig) {
|
|
945
|
+
if (!isEverclearTokenBridgeConfig(expectedConfig) ||
|
|
946
|
+
!isEverclearTokenBridgeConfig(actualConfig)) {
|
|
947
|
+
return [];
|
|
948
|
+
}
|
|
949
|
+
const actualOutputAssets = resolveRouterMapConfig(this.multiProvider, actualConfig.outputAssets);
|
|
950
|
+
const expectedOutputAssets = resolveRouterMapConfig(this.multiProvider, expectedConfig.outputAssets);
|
|
951
|
+
const outputAssetsToAdd = objDiff(expectedOutputAssets, actualOutputAssets, (address, address2) => addressToBytes32(address) === addressToBytes32(address2));
|
|
952
|
+
if (isObjEmpty(outputAssetsToAdd)) {
|
|
953
|
+
return [];
|
|
954
|
+
}
|
|
955
|
+
const assets = Object.entries(outputAssetsToAdd).map(([domainId, outputAsset]) => ({
|
|
956
|
+
destination: parseInt(domainId),
|
|
957
|
+
outputAsset: addressToBytes32(outputAsset),
|
|
958
|
+
}));
|
|
959
|
+
return [
|
|
960
|
+
{
|
|
961
|
+
chainId: this.multiProvider.getEvmChainId(this.chainId),
|
|
962
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
963
|
+
annotation: `Adding "${Object.keys(assets)}" output assets for token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
964
|
+
data: EverclearTokenBridge__factory.createInterface().encodeFunctionData('setOutputAssetsBatch((uint32,bytes32)[])', [assets]),
|
|
965
|
+
},
|
|
966
|
+
];
|
|
967
|
+
}
|
|
968
|
+
createRemoveRemoteOutputAssetsTxs(actualConfig, expectedConfig) {
|
|
969
|
+
if (!isEverclearTokenBridgeConfig(expectedConfig) ||
|
|
970
|
+
!isEverclearTokenBridgeConfig(actualConfig)) {
|
|
971
|
+
return [];
|
|
972
|
+
}
|
|
973
|
+
const actualOutputAssets = resolveRouterMapConfig(this.multiProvider, actualConfig.outputAssets);
|
|
974
|
+
const expectedOutputAssets = resolveRouterMapConfig(this.multiProvider, expectedConfig.outputAssets);
|
|
975
|
+
const outputAssetsToRemove = Array.from(difference(new Set(objKeys(actualOutputAssets)), new Set(objKeys(expectedOutputAssets))));
|
|
976
|
+
if (outputAssetsToRemove.length === 0) {
|
|
977
|
+
return [];
|
|
978
|
+
}
|
|
979
|
+
const assets = outputAssetsToRemove.map((domainId) => ({
|
|
980
|
+
destination: domainId,
|
|
981
|
+
outputAsset: ZERO_ADDRESS_HEX_32,
|
|
982
|
+
}));
|
|
983
|
+
return [
|
|
984
|
+
{
|
|
985
|
+
chainId: this.multiProvider.getEvmChainId(this.chainId),
|
|
986
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
987
|
+
annotation: `Removing "${outputAssetsToRemove}" output assets from token "${this.args.addresses.deployedTokenRoute}" on chain "${this.chainName}"`,
|
|
988
|
+
data: EverclearTokenBridge__factory.createInterface().encodeFunctionData('setOutputAssetsBatch((uint32,bytes32)[])', [assets]),
|
|
989
|
+
},
|
|
990
|
+
];
|
|
991
|
+
}
|
|
992
|
+
createUpdateEverclearFeeParamsTxs(actualConfig, expectedConfig) {
|
|
993
|
+
if (!isEverclearTokenBridgeConfig(expectedConfig) ||
|
|
994
|
+
!isEverclearTokenBridgeConfig(actualConfig)) {
|
|
995
|
+
return [];
|
|
996
|
+
}
|
|
997
|
+
if (deepEquals(expectedConfig.everclearFeeParams, actualConfig.everclearFeeParams)) {
|
|
998
|
+
return [];
|
|
999
|
+
}
|
|
1000
|
+
const resolvedEverclearExpectedFeeConfig = resolveRouterMapConfig(this.multiProvider, expectedConfig.everclearFeeParams);
|
|
1001
|
+
const resolvedActualEverclearFeeConfig = resolveRouterMapConfig(this.multiProvider, actualConfig.everclearFeeParams);
|
|
1002
|
+
const feesToSet = objFilter(resolvedEverclearExpectedFeeConfig, (domainId, currentDomainConfig) => {
|
|
1003
|
+
return (isNullish(resolvedActualEverclearFeeConfig[Number(domainId)]) ||
|
|
1004
|
+
!deepEquals(currentDomainConfig, resolvedActualEverclearFeeConfig[Number(domainId)]));
|
|
1005
|
+
});
|
|
1006
|
+
return Object.entries(feesToSet).map(([domainId, feeConfig]) => {
|
|
1007
|
+
const { deadline, fee, signature } = feeConfig;
|
|
1008
|
+
// Deadline is in seconds
|
|
1009
|
+
const humanReadableDeadline = new Date(deadline * 1000).toISOString();
|
|
1010
|
+
return {
|
|
1011
|
+
annotation: `Setting Everclear fee params with deadline "${humanReadableDeadline}" for domain "${domainId}" on token "${this.args.addresses.deployedTokenRoute}" and chain "${this.chainName}"`,
|
|
1012
|
+
chainId: this.multiProvider.getEvmChainId(this.chainName),
|
|
1013
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1014
|
+
data: EverclearTokenBridge__factory.createInterface().encodeFunctionData('setFeeParams', [domainId, fee, deadline, signature]),
|
|
1015
|
+
};
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
createRemoveEverclearFeeParamsTxs(actualConfig, expectedConfig) {
|
|
1019
|
+
if (!isEverclearTokenBridgeConfig(expectedConfig) ||
|
|
1020
|
+
!isEverclearTokenBridgeConfig(actualConfig)) {
|
|
1021
|
+
return [];
|
|
1022
|
+
}
|
|
1023
|
+
const resolvedEverclearExpectedFeeConfig = resolveRouterMapConfig(this.multiProvider, expectedConfig.everclearFeeParams);
|
|
1024
|
+
const resolvedActualEverclearFeeConfig = resolveRouterMapConfig(this.multiProvider, actualConfig.everclearFeeParams);
|
|
1025
|
+
const outputAssetsToRemove = Array.from(difference(new Set(objKeys(resolvedActualEverclearFeeConfig)), new Set(objKeys(resolvedEverclearExpectedFeeConfig))));
|
|
1026
|
+
if (outputAssetsToRemove.length === 0) {
|
|
1027
|
+
return [];
|
|
1028
|
+
}
|
|
1029
|
+
return outputAssetsToRemove.map((domainId) => {
|
|
1030
|
+
return {
|
|
1031
|
+
annotation: `Removing Everclear fee params for domain "${domainId}" on token "${this.args.addresses.deployedTokenRoute}" and chain "${this.chainName}"`,
|
|
1032
|
+
chainId: this.multiProvider.getEvmChainId(this.chainName),
|
|
1033
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1034
|
+
data: EverclearTokenBridge__factory.createInterface().encodeFunctionData('setFeeParams',
|
|
1035
|
+
// Setting default values to reset the config for the provided domain
|
|
1036
|
+
[domainId, 0, 0, '0x']),
|
|
1037
|
+
};
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
/**
|
|
1041
|
+
* Create a transaction to update the remote routers for the Warp Route contract.
|
|
1042
|
+
*
|
|
1043
|
+
* @param actualConfig - The on-chain router configuration, including the remoteRouters array.
|
|
1044
|
+
* @param expectedConfig - The expected token router configuration.
|
|
1045
|
+
* @returns A array with a single Ethereum transaction that need to be executed to enroll the routers
|
|
1046
|
+
*/
|
|
1047
|
+
createSetDestinationGasUpdateTxs(actualConfig, expectedConfig) {
|
|
1048
|
+
// OFT contracts don't have GasRouter interface — no destination gas config
|
|
1049
|
+
if (isOftTokenConfig(expectedConfig)) {
|
|
1050
|
+
return [];
|
|
1051
|
+
}
|
|
1052
|
+
const updateTransactions = [];
|
|
1053
|
+
if (!expectedConfig.destinationGas) {
|
|
1054
|
+
return [];
|
|
1055
|
+
}
|
|
1056
|
+
assert(actualConfig.destinationGas, 'actualDestinationGas is undefined');
|
|
1057
|
+
assert(expectedConfig.destinationGas, 'expectedDestinationGas is undefined');
|
|
1058
|
+
// Only set gas for domains that will have routers enrolled after the update.
|
|
1059
|
+
// For CrossCollateralRouter configs, also include domains from crossCollateralRouters.
|
|
1060
|
+
const resolvedExpectedRemoteRouters = resolveRouterMapConfig(this.multiProvider, expectedConfig.remoteRouters ?? {});
|
|
1061
|
+
const expectedRouterDomains = new Set(Object.keys(resolvedExpectedRemoteRouters).map(Number));
|
|
1062
|
+
// Include MC-enrolled router domains
|
|
1063
|
+
if (isCrossCollateralTokenConfig(expectedConfig) &&
|
|
1064
|
+
expectedConfig.crossCollateralRouters) {
|
|
1065
|
+
const localDomain = this.multiProvider.getDomainId(this.chainName);
|
|
1066
|
+
const resolvedEnrolled = resolveRouterMapConfig(this.multiProvider, expectedConfig.crossCollateralRouters);
|
|
1067
|
+
for (const domain of Object.keys(resolvedEnrolled).map(Number)) {
|
|
1068
|
+
if (domain === localDomain)
|
|
1069
|
+
continue;
|
|
1070
|
+
expectedRouterDomains.add(domain);
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
if (expectedRouterDomains.size === 0 &&
|
|
1074
|
+
Object.keys(expectedConfig.destinationGas).length > 0) {
|
|
1075
|
+
throw new Error(`destinationGas is set but remoteRouters and crossCollateralRouters are empty. ` +
|
|
1076
|
+
`Cannot configure gas for domains without corresponding router enrollments.`);
|
|
1077
|
+
}
|
|
1078
|
+
const actualDestinationGas = resolveRouterMapConfig(this.multiProvider, actualConfig.destinationGas);
|
|
1079
|
+
const expectedDestinationGas = resolveRouterMapConfig(this.multiProvider, expectedConfig.destinationGas);
|
|
1080
|
+
// Filter to only domains that will have routers enrolled
|
|
1081
|
+
const filteredExpectedGas = Object.fromEntries(Object.entries(expectedDestinationGas).filter(([domain]) => expectedRouterDomains.has(Number(domain))));
|
|
1082
|
+
// Filter actual gas to the same domains for comparison
|
|
1083
|
+
const filteredActualGas = Object.fromEntries(Object.entries(actualDestinationGas).filter(([domain]) => expectedRouterDomains.has(Number(domain))));
|
|
1084
|
+
if (!deepEquals(filteredActualGas, filteredExpectedGas)) {
|
|
1085
|
+
// Convert { 1: 2, 2: 3, ... } to [{ 1: 2 }, { 2: 3 }]
|
|
1086
|
+
const gasRouterConfigs = [];
|
|
1087
|
+
objMap(filteredExpectedGas, (domain, gas) => {
|
|
1088
|
+
gasRouterConfigs.push({
|
|
1089
|
+
domain,
|
|
1090
|
+
gas,
|
|
1091
|
+
});
|
|
1092
|
+
});
|
|
1093
|
+
const contractToUpdate = GasRouter__factory.connect(this.args.addresses.deployedTokenRoute, this.multiProvider.getProvider(this.domainId));
|
|
1094
|
+
updateTransactions.push({
|
|
1095
|
+
chainId: this.chainId,
|
|
1096
|
+
annotation: `Setting destination gas for ${this.args.addresses.deployedTokenRoute} on ${this.args.chain}`,
|
|
1097
|
+
to: contractToUpdate.address,
|
|
1098
|
+
data: contractToUpdate.interface.encodeFunctionData('setDestinationGas((uint32,uint256)[])', [gasRouterConfigs]),
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
return updateTransactions;
|
|
1102
|
+
}
|
|
1103
|
+
/**
|
|
1104
|
+
* Create transactions to update an existing ISM config, or deploy a new ISM and return a tx to setInterchainSecurityModule
|
|
1105
|
+
*
|
|
1106
|
+
* @param actualConfig - The on-chain router configuration, including the ISM configuration, and address.
|
|
1107
|
+
* @param expectedConfig - The expected token router configuration, including the ISM configuration.
|
|
1108
|
+
* @returns Ethereum transaction that need to be executed to update the ISM configuration.
|
|
1109
|
+
*/
|
|
1110
|
+
async createIsmUpdateTxs(actualConfig, expectedConfig, opaqueHybridAddress) {
|
|
1111
|
+
const updateTransactions = [];
|
|
1112
|
+
if (!expectedConfig.interchainSecurityModule) {
|
|
1113
|
+
return [];
|
|
1114
|
+
}
|
|
1115
|
+
const actualDeployedIsm = derivedIsmAddress(actualConfig);
|
|
1116
|
+
// Try to update (may also deploy) Ism with the expected config
|
|
1117
|
+
const { deployedIsm: expectedDeployedIsm, updateTransactions: ismUpdateTransactions, } = await this.deployOrUpdateIsm(actualConfig, expectedConfig, opaqueHybridAddress);
|
|
1118
|
+
// If an ISM is updated in-place, push the update txs
|
|
1119
|
+
updateTransactions.push(...ismUpdateTransactions);
|
|
1120
|
+
// If a new ISM is deployed, push the setInterchainSecurityModule tx
|
|
1121
|
+
if (!eqAddress(actualDeployedIsm, expectedDeployedIsm)) {
|
|
1122
|
+
const contractToUpdate = MailboxClient__factory.connect(this.args.addresses.deployedTokenRoute, this.multiProvider.getProvider(this.domainId));
|
|
1123
|
+
updateTransactions.push({
|
|
1124
|
+
chainId: this.chainId,
|
|
1125
|
+
annotation: `Setting ISM for Warp Route to ${expectedDeployedIsm}`,
|
|
1126
|
+
to: contractToUpdate.address,
|
|
1127
|
+
data: contractToUpdate.interface.encodeFunctionData('setInterchainSecurityModule', [expectedDeployedIsm]),
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1130
|
+
return updateTransactions;
|
|
1131
|
+
}
|
|
1132
|
+
async createHookUpdateTxs(actualConfig, expectedConfig) {
|
|
1133
|
+
return this.createHookAndPredicateUpdateTxs(actualConfig, expectedConfig);
|
|
1134
|
+
}
|
|
1135
|
+
/**
|
|
1136
|
+
* Deploys hook updates and predicate wrapper together so the post-update hook address
|
|
1137
|
+
* is available to deployAndConfigure without a stale on-chain read.
|
|
1138
|
+
*/
|
|
1139
|
+
async createHookAndPredicateUpdateTxs(actualConfig, expectedConfig, opaqueHybridAddress) {
|
|
1140
|
+
let hookTransactions = [];
|
|
1141
|
+
let newHookAddress;
|
|
1142
|
+
// Explicit type annotation narrows away the undefined that TypeScript infers
|
|
1143
|
+
// from the RouterConfig & DerivedMailboxClientConfig intersection.
|
|
1144
|
+
const actualHook = actualConfig.hook;
|
|
1145
|
+
// Predicate removal: on-chain wrapper exists but expected config omits it.
|
|
1146
|
+
// When the user provides an explicit hook that differs from the underlying hook
|
|
1147
|
+
// (predicate stripped), the hook-diff path generates the setHook to the new hook.
|
|
1148
|
+
// Otherwise (no hook, or a stale aggregation from a warp read), the
|
|
1149
|
+
// needsPredicateRemoval block below clears the hook to zero so the router uses the
|
|
1150
|
+
// mailbox default — the user who removed predicateWrapper without supplying a
|
|
1151
|
+
// replacement hook wants the default behavior restored, not the underlying sub-hook
|
|
1152
|
+
// silently preserved.
|
|
1153
|
+
const actualPredicateWrapper = 'predicateWrapper' in actualConfig
|
|
1154
|
+
? actualConfig.predicateWrapper
|
|
1155
|
+
: undefined;
|
|
1156
|
+
const expectedPredicateWrapper = 'predicateWrapper' in expectedConfig
|
|
1157
|
+
? expectedConfig.predicateWrapper
|
|
1158
|
+
: undefined;
|
|
1159
|
+
const needsPredicateRemoval = actualPredicateWrapper != null && !expectedPredicateWrapper;
|
|
1160
|
+
const needsDelayedFlowRemoval = typeof expectedConfig.hook === 'string' &&
|
|
1161
|
+
isZeroishAddress(expectedConfig.hook) &&
|
|
1162
|
+
typeof actualHook === 'object' &&
|
|
1163
|
+
collectHybridHookNodes(actualHook).some(({ type }) => type === HookType.DELAYED_FLOW_ROUTER);
|
|
1164
|
+
// Treat a zero-address hook the same as "no explicit hook": expandWarpDeployConfig
|
|
1165
|
+
// sets hook: zeroAddress as a default when the user config omits the hook field.
|
|
1166
|
+
// EvmHookModule.update(zeroAddress) returns [] early without updating deployedHook,
|
|
1167
|
+
// so a zero-address target produces no setHook tx and the predicate removal branch
|
|
1168
|
+
// would never be reached. Exclude zero addresses so needsPredicateRemoval can fire.
|
|
1169
|
+
if (expectedConfig.hook &&
|
|
1170
|
+
(typeof expectedConfig.hook !== 'string' ||
|
|
1171
|
+
!isZeroishAddress(expectedConfig.hook))) {
|
|
1172
|
+
const proxyAdminAddress = expectedConfig.proxyAdmin?.address ?? actualConfig.proxyAdmin?.address;
|
|
1173
|
+
assert(proxyAdminAddress, 'ProxyAdmin address is undefined');
|
|
1174
|
+
// The reader leaves the PREDICATE sub-hook inside actualConfig.hook
|
|
1175
|
+
// (e.g. Agg([Predicate, IGP])). When expectedConfig is derived from
|
|
1176
|
+
// actualConfig (e.g. during the enrollment step after initial deploy, OR
|
|
1177
|
+
// during a read→edit→apply round-trip where the operator removed predicateWrapper
|
|
1178
|
+
// but kept the hook field unchanged), expectedConfig.hook carries the same
|
|
1179
|
+
// aggregation. Strip the predicate from BOTH sides so the hook diff sees the bare
|
|
1180
|
+
// hook (e.g. IGP) on both sides and doesn't generate a spurious setHook.
|
|
1181
|
+
// The needsPredicateRemoval block below then fires to clear the hook to zero.
|
|
1182
|
+
const shouldStripHookForComparison = !!expectedPredicateWrapper || needsPredicateRemoval;
|
|
1183
|
+
const actualHookForComparison = shouldStripHookForComparison
|
|
1184
|
+
? stripPredicateSubHook(actualHook)
|
|
1185
|
+
: actualHook;
|
|
1186
|
+
const expectedHookForComparison = shouldStripHookForComparison && expectedConfig.hook
|
|
1187
|
+
? stripPredicateSubHook(expectedConfig.hook)
|
|
1188
|
+
: expectedConfig.hook;
|
|
1189
|
+
const result = await getEvmHookUpdateTransactions(this.args.addresses.deployedTokenRoute, {
|
|
1190
|
+
actualConfig: actualHookForComparison,
|
|
1191
|
+
expectedConfig: expectedHookForComparison,
|
|
1192
|
+
ccipContractCache: this.ccipContractCache,
|
|
1193
|
+
contractVerifier: this.contractVerifier,
|
|
1194
|
+
evmChainName: this.chainName,
|
|
1195
|
+
hookAndIsmFactories: extractIsmAndHookFactoryAddresses(this.args.addresses),
|
|
1196
|
+
setHookFunctionCallEncoder: (addr) => MailboxClient__factory.createInterface().encodeFunctionData('setHook', [addr]),
|
|
1197
|
+
logger: this.logger,
|
|
1198
|
+
mailbox: actualConfig.mailbox,
|
|
1199
|
+
multiProvider: this.multiProvider,
|
|
1200
|
+
proxyAdminAddress,
|
|
1201
|
+
rateLimitedSender: this.args.addresses.deployedTokenRoute,
|
|
1202
|
+
opaqueHybridAddresses: opaqueHybridAddress
|
|
1203
|
+
? [opaqueHybridAddress]
|
|
1204
|
+
: undefined,
|
|
1205
|
+
});
|
|
1206
|
+
hookTransactions = result.transactions;
|
|
1207
|
+
newHookAddress = result.newHookAddress;
|
|
1208
|
+
}
|
|
1209
|
+
// Predicate and delayed-flow removals clear the custom hook when no
|
|
1210
|
+
// replacement was deployed. Delayed flow requires an explicit zero target;
|
|
1211
|
+
// omission retains the existing hook like every ordinary update.
|
|
1212
|
+
if ((needsPredicateRemoval || needsDelayedFlowRemoval) && !newHookAddress) {
|
|
1213
|
+
const currentAddress = typeof actualHook === 'string' ? actualHook : actualHook.address;
|
|
1214
|
+
if (!isZeroishAddress(currentAddress)) {
|
|
1215
|
+
this.logger.debug({ chain: this.chainName }, 'Removing custom hook: generating setHook(zero)');
|
|
1216
|
+
hookTransactions.push({
|
|
1217
|
+
annotation: needsDelayedFlowRemoval
|
|
1218
|
+
? 'Remove delayed-flow hook (router will use mailbox default)'
|
|
1219
|
+
: 'Remove predicate wrapper: clear custom hook (router will use mailbox default)',
|
|
1220
|
+
chainId: this.chainId,
|
|
1221
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1222
|
+
data: MailboxClient__factory.createInterface().encodeFunctionData('setHook', [constants.AddressZero]),
|
|
1223
|
+
});
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
const { transactions: predicateTransactions, deploysNewWrapper } = await this.createPredicateWrapperUpdateTxs(actualConfig, expectedConfig, newHookAddress);
|
|
1227
|
+
// When predicate wrapper is being deployed, its setHook(aggregation) sets the final
|
|
1228
|
+
// router hook and already incorporates newHookAddress inside the aggregation.
|
|
1229
|
+
// Drop the intermediate setHook(newHookAddress) from hookTransactions to avoid a
|
|
1230
|
+
// redundant write that would be immediately overwritten.
|
|
1231
|
+
//
|
|
1232
|
+
// IMPORTANT: only drop when a NEW wrapper is being deployed. The ownership-only
|
|
1233
|
+
// path (deploysNewWrapper=false) must not suppress the hook update even though
|
|
1234
|
+
// predicateTransactions is non-empty.
|
|
1235
|
+
const effectiveHookTransactions = hookTransactions.length > 0 && deploysNewWrapper
|
|
1236
|
+
? hookTransactions.filter((tx) => !(tx.to &&
|
|
1237
|
+
eqAddress(tx.to, this.args.addresses.deployedTokenRoute) &&
|
|
1238
|
+
tx.data?.startsWith(MailboxClient__factory.createInterface().getSighash('setHook'))))
|
|
1239
|
+
: hookTransactions;
|
|
1240
|
+
return [...effectiveHookTransactions, ...predicateTransactions];
|
|
1241
|
+
}
|
|
1242
|
+
/**
|
|
1243
|
+
* Searches the current on-chain hook tree for a PredicateRouterWrapper that
|
|
1244
|
+
* matches by registry and policyId. Returns the wrapper address and its current
|
|
1245
|
+
* on-chain owner when found, undefined otherwise.
|
|
1246
|
+
*
|
|
1247
|
+
* Uses unbounded recursion into aggregation hooks (consistent with
|
|
1248
|
+
* EvmTokenAdapter.findPredicateWrapperInHook and EvmWarpRouteReader.findPredicateAddressInHook).
|
|
1249
|
+
*/
|
|
1250
|
+
async findDeployedPredicateWrapper(actualConfig, expectedPredicateConfig) {
|
|
1251
|
+
const hookAddress = derivedHookAddress(actualConfig);
|
|
1252
|
+
if (!hookAddress || isZeroishAddress(hookAddress))
|
|
1253
|
+
return undefined;
|
|
1254
|
+
try {
|
|
1255
|
+
const provider = this.multiProvider.getProvider(this.domainId);
|
|
1256
|
+
return await this.searchPredicateInHook(hookAddress, provider, expectedPredicateConfig);
|
|
1257
|
+
}
|
|
1258
|
+
catch (error) {
|
|
1259
|
+
this.logger.debug({ chain: this.chainName, error }, 'Error checking predicate wrapper deployment');
|
|
1260
|
+
}
|
|
1261
|
+
return undefined;
|
|
1262
|
+
}
|
|
1263
|
+
/**
|
|
1264
|
+
* Recursively searches a hook tree for a matching PredicateRouterWrapper.
|
|
1265
|
+
* Descends into StaticAggregationHook sub-hooks without depth limit.
|
|
1266
|
+
*/
|
|
1267
|
+
async searchPredicateInHook(hookAddr, provider, expectedPredicateConfig) {
|
|
1268
|
+
const match = await this.matchPredicateWrapper(hookAddr, provider, expectedPredicateConfig);
|
|
1269
|
+
if (match)
|
|
1270
|
+
return match;
|
|
1271
|
+
let subHooks;
|
|
1272
|
+
try {
|
|
1273
|
+
subHooks = await StaticAggregationHook__factory.connect(hookAddr, provider).hooks('0x');
|
|
1274
|
+
}
|
|
1275
|
+
catch {
|
|
1276
|
+
// Any call failure means hookAddr is not a StaticAggregationHook.
|
|
1277
|
+
// HyperlaneSmartProvider wraps CALL_EXCEPTION as "Invalid response from provider"
|
|
1278
|
+
// with code: undefined, so checking error.code is insufficient.
|
|
1279
|
+
return undefined;
|
|
1280
|
+
}
|
|
1281
|
+
for (const subHook of subHooks) {
|
|
1282
|
+
const found = await this.searchPredicateInHook(subHook, provider, expectedPredicateConfig);
|
|
1283
|
+
if (found)
|
|
1284
|
+
return found;
|
|
1285
|
+
}
|
|
1286
|
+
return undefined;
|
|
1287
|
+
}
|
|
1288
|
+
/**
|
|
1289
|
+
* Checks whether a single hook address is a PredicateRouterWrapper matching
|
|
1290
|
+
* the warp route and expected config. Returns the match or undefined.
|
|
1291
|
+
*/
|
|
1292
|
+
async matchPredicateWrapper(hookAddr, provider, expectedPredicateConfig) {
|
|
1293
|
+
try {
|
|
1294
|
+
const predicateWrapper = PredicateRouterWrapper__factory.connect(hookAddr, provider);
|
|
1295
|
+
// Verify identity: warpRoute + hookType confirm it's a PredicateRouterWrapper
|
|
1296
|
+
// for this route. Then compare registry + policyId so config rotations
|
|
1297
|
+
// (e.g. changing compliance policy) trigger a redeploy rather than silently no-op.
|
|
1298
|
+
const [warpRoute, hookType, onchainRegistry, onchainPolicyId, onchainOwner,] = await Promise.all([
|
|
1299
|
+
predicateWrapper.warpRoute(),
|
|
1300
|
+
predicateWrapper.hookType(),
|
|
1301
|
+
predicateWrapper.getRegistry(),
|
|
1302
|
+
predicateWrapper.getPolicyID(),
|
|
1303
|
+
predicateWrapper.owner(),
|
|
1304
|
+
]);
|
|
1305
|
+
if (eqAddress(warpRoute, this.args.addresses.deployedTokenRoute) &&
|
|
1306
|
+
hookType === OnchainHookType.PREDICATE_ROUTER_WRAPPER &&
|
|
1307
|
+
eqAddress(onchainRegistry, expectedPredicateConfig.predicateRegistry) &&
|
|
1308
|
+
onchainPolicyId === expectedPredicateConfig.policyId) {
|
|
1309
|
+
return { address: hookAddr, onchainOwner };
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
catch {
|
|
1313
|
+
// Any call failure means hookAddr is not a PredicateRouterWrapper.
|
|
1314
|
+
// HyperlaneSmartProvider wraps CALL_EXCEPTION as "Invalid response from provider"
|
|
1315
|
+
// with code: undefined, so checking error.code === 'CALL_EXCEPTION' is insufficient.
|
|
1316
|
+
return undefined;
|
|
1317
|
+
}
|
|
1318
|
+
return undefined;
|
|
1319
|
+
}
|
|
1320
|
+
/**
|
|
1321
|
+
* Check if predicate wrapper is already deployed with fully matching config
|
|
1322
|
+
* (registry, policyId, and owner).
|
|
1323
|
+
*
|
|
1324
|
+
* @param actualConfig - The on-chain router configuration.
|
|
1325
|
+
* @param expectedPredicateConfig - The expected predicate wrapper configuration.
|
|
1326
|
+
* @returns True if wrapper is deployed with all fields matching, false otherwise.
|
|
1327
|
+
*/
|
|
1328
|
+
async isPredicateWrapperDeployed(actualConfig, expectedPredicateConfig) {
|
|
1329
|
+
const found = await this.findDeployedPredicateWrapper(actualConfig, expectedPredicateConfig);
|
|
1330
|
+
return (found !== undefined &&
|
|
1331
|
+
eqAddress(found.onchainOwner, expectedPredicateConfig.owner));
|
|
1332
|
+
}
|
|
1333
|
+
/**
|
|
1334
|
+
* Create transactions to deploy predicate wrapper and update hook.
|
|
1335
|
+
*
|
|
1336
|
+
* @param actualConfig - The on-chain router configuration.
|
|
1337
|
+
* @param expectedConfig - The expected token router configuration.
|
|
1338
|
+
* @returns transactions to execute and whether a new wrapper is being deployed.
|
|
1339
|
+
* deploysNewWrapper=true means the predicate emits its own setHook(aggregation)
|
|
1340
|
+
* that supersedes any hook update in the same batch.
|
|
1341
|
+
*/
|
|
1342
|
+
async createPredicateWrapperUpdateTxs(actualConfig, expectedConfig, pendingHookAddress) {
|
|
1343
|
+
// Only proceed if expectedConfig has predicateWrapper
|
|
1344
|
+
if (!('predicateWrapper' in expectedConfig) ||
|
|
1345
|
+
!expectedConfig.predicateWrapper) {
|
|
1346
|
+
return { transactions: [], deploysNewWrapper: false };
|
|
1347
|
+
}
|
|
1348
|
+
const predicateWrapperConfig = PredicateWrapperConfigSchema.parse(expectedConfig.predicateWrapper);
|
|
1349
|
+
// Check if a wrapper matching by registry+policyId already exists on-chain.
|
|
1350
|
+
// If so, only a transferOwnership tx is needed (not a full redeploy).
|
|
1351
|
+
const existingWrapper = await this.findDeployedPredicateWrapper(actualConfig, predicateWrapperConfig);
|
|
1352
|
+
if (existingWrapper) {
|
|
1353
|
+
if (eqAddress(existingWrapper.onchainOwner, predicateWrapperConfig.owner)) {
|
|
1354
|
+
this.logger.debug({ chain: this.chainName }, 'Predicate wrapper already deployed with matching config, skipping');
|
|
1355
|
+
return { transactions: [], deploysNewWrapper: false };
|
|
1356
|
+
}
|
|
1357
|
+
// Owner changed — generate a transferOwnership tx without redeploying.
|
|
1358
|
+
this.logger.debug({ chain: this.chainName, wrapper: existingWrapper.address }, 'Predicate wrapper owner changed, generating transferOwnership transaction');
|
|
1359
|
+
const transferOwnershipTx = await PredicateRouterWrapper__factory.connect(existingWrapper.address, this.multiProvider.getProvider(this.chainName)).populateTransaction.transferOwnership(predicateWrapperConfig.owner);
|
|
1360
|
+
return {
|
|
1361
|
+
transactions: [
|
|
1362
|
+
{
|
|
1363
|
+
...transferOwnershipTx,
|
|
1364
|
+
chainId: this.chainId,
|
|
1365
|
+
annotation: `Transferring predicate wrapper ownership to ${predicateWrapperConfig.owner}`,
|
|
1366
|
+
},
|
|
1367
|
+
],
|
|
1368
|
+
deploysNewWrapper: false,
|
|
1369
|
+
};
|
|
1370
|
+
}
|
|
1371
|
+
const staticAggregationHookFactory = this.args.addresses.staticAggregationHookFactory;
|
|
1372
|
+
if (!staticAggregationHookFactory) {
|
|
1373
|
+
throw new Error(`staticAggregationHookFactory not found for ${this.chainName}. Ensure proxy factories are deployed.`);
|
|
1374
|
+
}
|
|
1375
|
+
const signer = this.multiProvider.getSigner(this.chainName);
|
|
1376
|
+
const factory = StaticAggregationHookFactory__factory.connect(staticAggregationHookFactory, signer);
|
|
1377
|
+
const predicateDeployer = new PredicateWrapperDeployer(this.multiProvider, factory, this.logger);
|
|
1378
|
+
// Deploy predicate wrapper and get addresses.
|
|
1379
|
+
// Pass token type to deploy the appropriate wrapper.
|
|
1380
|
+
// Pass pendingHookAddress (if any) so deployAndConfigure uses the post-update hook
|
|
1381
|
+
// instead of reading the stale on-chain value when hook and predicate wrapper are
|
|
1382
|
+
// both being changed in the same update() call.
|
|
1383
|
+
const result = await predicateDeployer.deployAndConfigure(this.chainName, this.args.addresses.deployedTokenRoute, predicateWrapperConfig, expectedConfig.type, pendingHookAddress);
|
|
1384
|
+
this.logger.info({
|
|
1385
|
+
chain: this.chainName,
|
|
1386
|
+
wrapper: result.wrapperAddress,
|
|
1387
|
+
aggregationHook: result.aggregationHookAddress,
|
|
1388
|
+
}, 'Predicate wrapper deployed, returning setHook transaction');
|
|
1389
|
+
return {
|
|
1390
|
+
transactions: [
|
|
1391
|
+
{
|
|
1392
|
+
annotation: 'Set aggregation hook wrapping PredicateRouterWrapper on warp route',
|
|
1393
|
+
chainId: this.chainId,
|
|
1394
|
+
...result.setHookTx,
|
|
1395
|
+
},
|
|
1396
|
+
],
|
|
1397
|
+
deploysNewWrapper: true,
|
|
1398
|
+
};
|
|
1399
|
+
}
|
|
1400
|
+
createFeeHookUpdateTxs(actualConfig, expectedConfig) {
|
|
1401
|
+
if (isOftTokenConfig(expectedConfig))
|
|
1402
|
+
return [];
|
|
1403
|
+
const expectedFeeHook = expectedConfig.feeHook;
|
|
1404
|
+
const actualFeeHook = actualConfig.feeHook;
|
|
1405
|
+
// No change needed
|
|
1406
|
+
if (!expectedFeeHook && !actualFeeHook)
|
|
1407
|
+
return [];
|
|
1408
|
+
// Unset in expected config → leave the on-chain feeHook unchanged.
|
|
1409
|
+
// Clearing an existing feeHook requires an explicit address(0) in the config.
|
|
1410
|
+
if (!expectedFeeHook && actualFeeHook)
|
|
1411
|
+
return [];
|
|
1412
|
+
if (expectedFeeHook &&
|
|
1413
|
+
actualFeeHook &&
|
|
1414
|
+
eqAddress(expectedFeeHook, actualFeeHook))
|
|
1415
|
+
return [];
|
|
1416
|
+
const newFeeHook = expectedFeeHook ?? constants.AddressZero;
|
|
1417
|
+
return [
|
|
1418
|
+
{
|
|
1419
|
+
chainId: this.chainId,
|
|
1420
|
+
annotation: `Setting feeHook to ${newFeeHook}`,
|
|
1421
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1422
|
+
data: TokenRouter__factory.createInterface().encodeFunctionData('setFeeHook', [newFeeHook]),
|
|
1423
|
+
},
|
|
1424
|
+
];
|
|
1425
|
+
}
|
|
1426
|
+
/**
|
|
1427
|
+
* Create transactions to update token fee configuration.
|
|
1428
|
+
*
|
|
1429
|
+
* @param actualConfig - The on-chain router configuration.
|
|
1430
|
+
* @param expectedConfig - The expected token router configuration.
|
|
1431
|
+
* @returns Ethereum transactions that need to be executed to update the token fee.
|
|
1432
|
+
*
|
|
1433
|
+
* @remarks
|
|
1434
|
+
* The returned transactions may include both `setFeeRecipient` (gated by the
|
|
1435
|
+
* token-router owner) and fee-contract config calls (gated by the fee-contract
|
|
1436
|
+
* owner). When routing these to a dedicated `feeSubmitter`, that submitter
|
|
1437
|
+
* must own both the token router and the fee contract.
|
|
1438
|
+
*/
|
|
1439
|
+
async createTokenFeeUpdateTxs(actualConfig, expectedConfig, tokenReaderParams) {
|
|
1440
|
+
if (!expectedConfig.tokenFee) {
|
|
1441
|
+
if (actualConfig.tokenFee) {
|
|
1442
|
+
return [
|
|
1443
|
+
{
|
|
1444
|
+
annotation: 'Removing fee recipient...',
|
|
1445
|
+
chainId: this.chainId,
|
|
1446
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1447
|
+
data: TokenRouter__factory.createInterface().encodeFunctionData('setFeeRecipient(address)', [constants.AddressZero]),
|
|
1448
|
+
},
|
|
1449
|
+
];
|
|
1450
|
+
}
|
|
1451
|
+
return [];
|
|
1452
|
+
}
|
|
1453
|
+
const routerAddress = this.args.addresses.deployedTokenRoute;
|
|
1454
|
+
const resolvedTokenFee = await resolveTokenFeeAddress(expectedConfig.tokenFee, routerAddress, expectedConfig, this.multiProvider.getProvider(this.chainId));
|
|
1455
|
+
const currentTokenFee = actualConfig.tokenFee;
|
|
1456
|
+
if (!currentTokenFee) {
|
|
1457
|
+
this.logger.info('No existing token fee found, creating new one');
|
|
1458
|
+
const expandedExpectedConfig = await EvmTokenFeeModule.expandConfig({
|
|
1459
|
+
config: resolvedTokenFee,
|
|
1460
|
+
multiProvider: this.multiProvider,
|
|
1461
|
+
chainName: this.chainName,
|
|
1462
|
+
});
|
|
1463
|
+
const tokenFeeModule = await EvmTokenFeeModule.create({
|
|
1464
|
+
multiProvider: this.multiProvider,
|
|
1465
|
+
chain: this.chainName,
|
|
1466
|
+
config: expandedExpectedConfig,
|
|
1467
|
+
contractVerifier: this.contractVerifier,
|
|
1468
|
+
});
|
|
1469
|
+
const { deployedFee } = tokenFeeModule.serialize();
|
|
1470
|
+
// Check if fee recipient is already set correctly on-chain
|
|
1471
|
+
const tokenRouter = TokenRouter__factory.connect(routerAddress, this.multiProvider.getProvider(this.chainId));
|
|
1472
|
+
const currentFeeRecipient = await tokenRouter
|
|
1473
|
+
.feeRecipient()
|
|
1474
|
+
.catch((error) => {
|
|
1475
|
+
this.logger.warn(`Failed to read feeRecipient, defaulting to generate setFeeRecipient tx`, error);
|
|
1476
|
+
return constants.AddressZero;
|
|
1477
|
+
});
|
|
1478
|
+
if (eqAddress(currentFeeRecipient, deployedFee)) {
|
|
1479
|
+
return [];
|
|
1480
|
+
}
|
|
1481
|
+
return [
|
|
1482
|
+
{
|
|
1483
|
+
annotation: 'Setting new routing fee...',
|
|
1484
|
+
chainId: this.chainId,
|
|
1485
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1486
|
+
data: TokenRouter__factory.createInterface().encodeFunctionData('setFeeRecipient(address)', [deployedFee]),
|
|
1487
|
+
},
|
|
1488
|
+
];
|
|
1489
|
+
}
|
|
1490
|
+
this.logger.info('Updating existing token fee configuration');
|
|
1491
|
+
const tokenFeeModule = new EvmTokenFeeModule(this.multiProvider, {
|
|
1492
|
+
chain: this.chainName,
|
|
1493
|
+
config: currentTokenFee,
|
|
1494
|
+
addresses: {
|
|
1495
|
+
deployedFee: currentTokenFee.address,
|
|
1496
|
+
},
|
|
1497
|
+
}, this.contractVerifier);
|
|
1498
|
+
// For CCR fee updates, forward the on-chain enrolled router keys as hints so the
|
|
1499
|
+
// reader can observe orphan feeContracts entries not present in the target config.
|
|
1500
|
+
// Without these hints, the removal loop in EvmTokenFeeModule.update() never sees
|
|
1501
|
+
// stale (dest, router) entries and the on-chain pointer stays wired.
|
|
1502
|
+
let effectiveTokenReaderParams = tokenReaderParams;
|
|
1503
|
+
if (isCrossCollateralTokenConfig(actualConfig) &&
|
|
1504
|
+
actualConfig.crossCollateralRouters &&
|
|
1505
|
+
resolvedTokenFee.type === TokenFeeType.CrossCollateralRoutingFee) {
|
|
1506
|
+
const onchainRoutersByDomain = resolveRouterMapConfig(this.multiProvider, actualConfig.crossCollateralRouters);
|
|
1507
|
+
effectiveTokenReaderParams = {
|
|
1508
|
+
...tokenReaderParams,
|
|
1509
|
+
crossCollateralRouters: mergeCrossCollateralRouters(tokenReaderParams?.crossCollateralRouters, onchainRoutersByDomain),
|
|
1510
|
+
};
|
|
1511
|
+
}
|
|
1512
|
+
const updateTransactions = await tokenFeeModule.update(resolvedTokenFee, effectiveTokenReaderParams);
|
|
1513
|
+
const { deployedFee } = tokenFeeModule.serialize();
|
|
1514
|
+
// Only call setFeeRecipient if the fee recipient address has changed
|
|
1515
|
+
if (!eqAddress(currentTokenFee.address, deployedFee)) {
|
|
1516
|
+
updateTransactions.push({
|
|
1517
|
+
annotation: 'Updating routing fee...',
|
|
1518
|
+
chainId: this.chainId,
|
|
1519
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1520
|
+
data: TokenRouter__factory.createInterface().encodeFunctionData('setFeeRecipient(address)', [deployedFee]),
|
|
1521
|
+
});
|
|
1522
|
+
}
|
|
1523
|
+
return updateTransactions;
|
|
1524
|
+
}
|
|
1525
|
+
/**
|
|
1526
|
+
* Transfer ownership of an existing Warp route with a given config.
|
|
1527
|
+
*
|
|
1528
|
+
* @param actualConfig - The on-chain router configuration.
|
|
1529
|
+
* @param expectedConfig - The expected token router configuration.
|
|
1530
|
+
* @returns Ethereum transaction that need to be executed to update the owner.
|
|
1531
|
+
*/
|
|
1532
|
+
createOwnershipUpdateTxs(actualConfig, expectedConfig) {
|
|
1533
|
+
return transferOwnershipTransactions(this.multiProvider.getEvmChainId(this.args.chain), this.args.addresses.deployedTokenRoute, actualConfig, expectedConfig, `${expectedConfig.type} Warp Route`);
|
|
1534
|
+
}
|
|
1535
|
+
/**
|
|
1536
|
+
* Updates or deploys the ISM using the provided configuration.
|
|
1537
|
+
*
|
|
1538
|
+
* @returns Object with deployedIsm address, and update Transactions
|
|
1539
|
+
*/
|
|
1540
|
+
async deployOrUpdateIsm(actualConfig, expectedConfig, opaqueHybridAddress) {
|
|
1541
|
+
assert(expectedConfig.interchainSecurityModule, 'Ism derived incorrectly');
|
|
1542
|
+
if (typeof expectedConfig.interchainSecurityModule === 'string' &&
|
|
1543
|
+
isZeroishAddress(expectedConfig.interchainSecurityModule)) {
|
|
1544
|
+
return {
|
|
1545
|
+
deployedIsm: expectedConfig.interchainSecurityModule,
|
|
1546
|
+
updateTransactions: [],
|
|
1547
|
+
};
|
|
1548
|
+
}
|
|
1549
|
+
// Always override recipient for any RateLimitedIsm node — it must be the
|
|
1550
|
+
// token address. Any user-supplied value is silently wrong (it would wire
|
|
1551
|
+
// the ISM to the wrong chain), so we always set it from the deployed token
|
|
1552
|
+
// route. Handles both top-level and nested (e.g. inside aggregation) nodes.
|
|
1553
|
+
// Thread the owner through so that an omitted ism.owner in expectedConfig
|
|
1554
|
+
// doesn't look like an owner diff to EvmIsmModule.update (which would redeploy
|
|
1555
|
+
// the ISM and reset the rate-limit bucket).
|
|
1556
|
+
// Primary default: the warp-route owner (matches deploy path in token/deploy.ts).
|
|
1557
|
+
// Fallback: the current on-chain ISM owner (same-type, same-owner in-place update).
|
|
1558
|
+
let expectedIsm = expectedConfig.interchainSecurityModule;
|
|
1559
|
+
if (typeof expectedIsm === 'object') {
|
|
1560
|
+
const actualIsm = actualConfig.interchainSecurityModule;
|
|
1561
|
+
const onChainOwner = typeof actualIsm === 'object' && 'owner' in actualIsm
|
|
1562
|
+
? actualIsm.owner
|
|
1563
|
+
: undefined;
|
|
1564
|
+
const defaultOwner = expectedConfig.owner ??
|
|
1565
|
+
(typeof onChainOwner === 'string' ? onChainOwner : undefined);
|
|
1566
|
+
if (ismTreeContainsRateLimited(expectedIsm)) {
|
|
1567
|
+
expectedIsm = setRateLimitedIsmRecipient(expectedIsm, this.args.addresses.deployedTokenRoute, defaultOwner);
|
|
1568
|
+
}
|
|
1569
|
+
// Hybrid hook/ISMs need the paired warp router, which in warp-route
|
|
1570
|
+
// context is always this token — configs routinely omit it (it is only
|
|
1571
|
+
// required for standalone ISM deploys). Injected independently of the
|
|
1572
|
+
// owner: an unresolvable owner would otherwise leave `warpRouter`
|
|
1573
|
+
// missing and the update would plan against an incomplete config.
|
|
1574
|
+
// `remoteIsms` is deferred: cross-chain enrollment needs every chain's
|
|
1575
|
+
// instance address, so it is reconciled by a separate pass that must
|
|
1576
|
+
// stay its only writer.
|
|
1577
|
+
if (ismTreeContainsHybridHookIsm(expectedIsm)) {
|
|
1578
|
+
expectedIsm = completeHybridIsmNodes(expectedIsm, this.args.addresses.deployedTokenRoute, { type: DelayedFlowRemoteIsmsSourceType.Deferred }, defaultOwner, this.multiProvider);
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
const ismModule = new EvmIsmModule(this.multiProvider, {
|
|
1582
|
+
chain: this.args.chain,
|
|
1583
|
+
config: actualConfig.interchainSecurityModule,
|
|
1584
|
+
addresses: {
|
|
1585
|
+
...this.args.addresses,
|
|
1586
|
+
mailbox: actualConfig.mailbox,
|
|
1587
|
+
deployedIsm: derivedIsmAddress(actualConfig),
|
|
1588
|
+
},
|
|
1589
|
+
}, this.ccipContractCache, this.contractVerifier);
|
|
1590
|
+
this.logger.info(`Comparing target ISM config with ${this.args.chain} chain`);
|
|
1591
|
+
const updateTransactions = await ismModule.update(expectedIsm, opaqueHybridAddress ? [opaqueHybridAddress] : []);
|
|
1592
|
+
const { deployedIsm } = ismModule.serialize();
|
|
1593
|
+
return { deployedIsm, updateTransactions };
|
|
1594
|
+
}
|
|
1595
|
+
/**
|
|
1596
|
+
* Creates a transaction to upgrade the Warp Route implementation if the package version is below specified version.
|
|
1597
|
+
*
|
|
1598
|
+
* @param actualConfig - The current on-chain configuration
|
|
1599
|
+
* @param expectedConfig - The expected configuration
|
|
1600
|
+
* @returns An array of transactions to upgrade the implementation if needed
|
|
1601
|
+
*/
|
|
1602
|
+
async upgradeWarpRouteImplementationTx(actualConfig, expectedConfig) {
|
|
1603
|
+
const updateTransactions = [];
|
|
1604
|
+
assert(expectedConfig.type !== TokenType.unknown, 'Cannot upgrade warp route with unknown token type');
|
|
1605
|
+
// Older contracts without PACKAGE_VERSION fall back to a legacy version in
|
|
1606
|
+
// EvmWarpRouteReader.fetchPackageVersion.
|
|
1607
|
+
assert(actualConfig.contractVersion, 'Actual contract version is undefined');
|
|
1608
|
+
// Only upgrade if the user specifies a version
|
|
1609
|
+
if (!expectedConfig.contractVersion) {
|
|
1610
|
+
return [];
|
|
1611
|
+
}
|
|
1612
|
+
const comparisonValue = compareVersions(expectedConfig.contractVersion, actualConfig.contractVersion);
|
|
1613
|
+
// Expected version is lower than actual version, no upgrade is possible
|
|
1614
|
+
if (comparisonValue === -1) {
|
|
1615
|
+
throw new Error(`Expected contract version ${expectedConfig.contractVersion} is lower than actual contract version ${actualConfig.contractVersion}`);
|
|
1616
|
+
}
|
|
1617
|
+
// Versions are the same, no upgrade needed
|
|
1618
|
+
if (comparisonValue === 0) {
|
|
1619
|
+
return [];
|
|
1620
|
+
}
|
|
1621
|
+
// You can only upgrade to the contract version (see `PackageVersioned`)
|
|
1622
|
+
// defined by the @recoillink/core package
|
|
1623
|
+
assert(contractVersionMatchesDependency(expectedConfig.contractVersion), VERSION_ERROR_MESSAGE);
|
|
1624
|
+
// Scale values are immutables baked into the implementation bytecode.
|
|
1625
|
+
// Changing the effective scale during an upgrade would cause in-flight
|
|
1626
|
+
// messages to be decoded with incorrect scaling.
|
|
1627
|
+
assert(scalesEqual(actualConfig.scale, expectedConfig.scale), `Scale change detected during upgrade. ` +
|
|
1628
|
+
`Changing scale on an existing deployment may cause in-flight messages to be decoded incorrectly.`);
|
|
1629
|
+
this.logger.info(`Upgrading Warp Route implementation on ${this.args.chain} from ${actualConfig.contractVersion} to ${expectedConfig.contractVersion}`);
|
|
1630
|
+
const deployer = new HypERC20Deployer(this.multiProvider);
|
|
1631
|
+
const constructorArgs = await deployer.constructorArgs(this.chainName, expectedConfig);
|
|
1632
|
+
const tokenType = expectedConfig.type;
|
|
1633
|
+
const implementation = await deployer.deployContractWithName(this.chainName, tokenType, hypERC20contracts[tokenType], constructorArgs, undefined, false);
|
|
1634
|
+
const provider = this.multiProvider.getProvider(this.domainId);
|
|
1635
|
+
const proxyAddress = this.args.addresses.deployedTokenRoute;
|
|
1636
|
+
const proxyAdminAddress = await proxyAdmin(provider, proxyAddress);
|
|
1637
|
+
assert(await isInitialized(provider, proxyAddress), 'Proxy is not initialized');
|
|
1638
|
+
updateTransactions.push({
|
|
1639
|
+
chainId: this.chainId,
|
|
1640
|
+
annotation: `Upgrading Warp Route implementation on ${this.args.chain}`,
|
|
1641
|
+
to: proxyAdminAddress,
|
|
1642
|
+
data: ProxyAdmin__factory.createInterface().encodeFunctionData('upgrade', [proxyAddress, implementation.address]),
|
|
1643
|
+
});
|
|
1644
|
+
return updateTransactions;
|
|
1645
|
+
}
|
|
1646
|
+
async createAddCctpDomainsTxs(expectedConfig, domains) {
|
|
1647
|
+
if (!isCctpTokenConfig(expectedConfig) ||
|
|
1648
|
+
expectedConfig.cctpVersion !== 'V2') {
|
|
1649
|
+
return [];
|
|
1650
|
+
}
|
|
1651
|
+
const remoteDomains = domains.filter(({ hyperlane }) => hyperlane !== this.domainId);
|
|
1652
|
+
if (remoteDomains.length === 0)
|
|
1653
|
+
return [];
|
|
1654
|
+
const tokenBridge = TokenBridgeCctpBase__factory.connect(this.args.addresses.deployedTokenRoute, this.multiProvider.getProvider(this.chainName));
|
|
1655
|
+
const missingDomainSelector = tokenBridge.interface.getSighash('CircleDomainNotConfigured()');
|
|
1656
|
+
const missingHyperlaneDomainSelector = tokenBridge.interface.getSighash('HyperlaneDomainNotConfigured()');
|
|
1657
|
+
const encodeErrorString = (reason) => `0x08c379a0${utils.defaultAbiCoder
|
|
1658
|
+
.encode(['string'], [reason])
|
|
1659
|
+
.slice(2)}`;
|
|
1660
|
+
const missingDomainErrors = [
|
|
1661
|
+
missingDomainSelector,
|
|
1662
|
+
missingHyperlaneDomainSelector,
|
|
1663
|
+
encodeErrorString('Circle domain not configured'),
|
|
1664
|
+
encodeErrorString('Hyperlane domain not configured'),
|
|
1665
|
+
];
|
|
1666
|
+
const isMissingDomainError = (error) => missingDomainErrors.some((data) => isRevertData(error, data));
|
|
1667
|
+
const concurrency = this.multiProvider.tryGetRpcConcurrency(this.chainName) ??
|
|
1668
|
+
DEFAULT_CONTRACT_READ_CONCURRENCY;
|
|
1669
|
+
const needsUpdate = await concurrentMap(concurrency, remoteDomains, async (domain) => {
|
|
1670
|
+
const [circleResult] = await Promise.allSettled([
|
|
1671
|
+
tokenBridge.hyperlaneDomainToCircleDomain(domain.hyperlane),
|
|
1672
|
+
]);
|
|
1673
|
+
const [hyperlaneResult] = await Promise.allSettled([
|
|
1674
|
+
tokenBridge.circleDomainToHyperlaneDomain(domain.circle),
|
|
1675
|
+
]);
|
|
1676
|
+
for (const result of [circleResult, hyperlaneResult]) {
|
|
1677
|
+
if (result.status === 'rejected' &&
|
|
1678
|
+
!isMissingDomainError(result.reason)) {
|
|
1679
|
+
throw result.reason;
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
if (circleResult.status === 'rejected' ||
|
|
1683
|
+
hyperlaneResult.status === 'rejected') {
|
|
1684
|
+
return true;
|
|
1685
|
+
}
|
|
1686
|
+
return (circleResult.value !== domain.circle ||
|
|
1687
|
+
hyperlaneResult.value !== domain.hyperlane);
|
|
1688
|
+
});
|
|
1689
|
+
const missingDomains = remoteDomains.filter((_, index) => needsUpdate[index]);
|
|
1690
|
+
if (missingDomains.length === 0)
|
|
1691
|
+
return [];
|
|
1692
|
+
return [
|
|
1693
|
+
{
|
|
1694
|
+
chainId: this.chainId,
|
|
1695
|
+
annotation: `Adding ${missingDomains.length} CCTP domain mapping(s) on ${this.args.chain}`,
|
|
1696
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1697
|
+
data: tokenBridge.interface.encodeFunctionData('addDomains', [
|
|
1698
|
+
missingDomains,
|
|
1699
|
+
]),
|
|
1700
|
+
},
|
|
1701
|
+
];
|
|
1702
|
+
}
|
|
1703
|
+
createSetMaxFeePpmTxs(actualConfig, expectedConfig) {
|
|
1704
|
+
if (!isCctpTokenConfig(expectedConfig) ||
|
|
1705
|
+
expectedConfig.cctpVersion !== 'V2' ||
|
|
1706
|
+
expectedConfig.maxFeeBps === undefined) {
|
|
1707
|
+
return [];
|
|
1708
|
+
}
|
|
1709
|
+
const actualMaxFeeBps = isCctpTokenConfig(actualConfig)
|
|
1710
|
+
? actualConfig.maxFeeBps
|
|
1711
|
+
: undefined;
|
|
1712
|
+
// When upgrading across the CCTP_PPM_STORAGE_VERSION boundary, the
|
|
1713
|
+
// pre-upgrade contract stores the fee in integer bps while the
|
|
1714
|
+
// post-upgrade contract expects ppm. The reader normalises to bps so the
|
|
1715
|
+
// values look equal, but the raw on-chain slot will be wrong after the
|
|
1716
|
+
// proxy upgrade. Always emit setMaxFeePpm in this case.
|
|
1717
|
+
const crossingPpmBoundary = actualConfig.contractVersion &&
|
|
1718
|
+
expectedConfig.contractVersion &&
|
|
1719
|
+
compareVersions(actualConfig.contractVersion, CCTP_PPM_STORAGE_VERSION) <
|
|
1720
|
+
0 &&
|
|
1721
|
+
compareVersions(expectedConfig.contractVersion, CCTP_PPM_STORAGE_VERSION) >= 0;
|
|
1722
|
+
if (!crossingPpmBoundary && actualMaxFeeBps === expectedConfig.maxFeeBps) {
|
|
1723
|
+
return [];
|
|
1724
|
+
}
|
|
1725
|
+
const maxFeePpm = Math.round(expectedConfig.maxFeeBps * 100);
|
|
1726
|
+
return [
|
|
1727
|
+
{
|
|
1728
|
+
chainId: this.chainId,
|
|
1729
|
+
annotation: `Setting maxFeePpm to ${maxFeePpm} on ${this.args.chain}`,
|
|
1730
|
+
to: this.args.addresses.deployedTokenRoute,
|
|
1731
|
+
data: TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [maxFeePpm]),
|
|
1732
|
+
},
|
|
1733
|
+
];
|
|
1734
|
+
}
|
|
1735
|
+
/**
|
|
1736
|
+
* Deploys the Warp Route.
|
|
1737
|
+
*
|
|
1738
|
+
* @param chain - The chain to deploy the module on.
|
|
1739
|
+
* @param config - The configuration for the token router.
|
|
1740
|
+
* @param multiProvider - The multi-provider instance to use.
|
|
1741
|
+
* @returns A new instance of the EvmERC20WarpHyperlaneModule.
|
|
1742
|
+
*/
|
|
1743
|
+
static async create(params) {
|
|
1744
|
+
const { chain, config, multiProvider, ccipContractCache, contractVerifier, proxyFactoryFactories, } = params;
|
|
1745
|
+
const chainName = multiProvider.getChainName(chain);
|
|
1746
|
+
const deployer = new HypERC20Deployer(multiProvider);
|
|
1747
|
+
const deployedContracts = await deployer.deployContracts(chainName, config);
|
|
1748
|
+
const warpModule = new EvmWarpModule(multiProvider, {
|
|
1749
|
+
addresses: {
|
|
1750
|
+
...proxyFactoryFactories,
|
|
1751
|
+
deployedTokenRoute: deployedContracts[config.type].address,
|
|
1752
|
+
},
|
|
1753
|
+
chain,
|
|
1754
|
+
config,
|
|
1755
|
+
}, ccipContractCache, contractVerifier);
|
|
1756
|
+
const actualConfig = await warpModule.read();
|
|
1757
|
+
if (config.remoteRouters && !isObjEmpty(config.remoteRouters)) {
|
|
1758
|
+
const enrollRemoteTxs = await warpModule.createEnrollRemoteRoutersUpdateTxs(actualConfig, config); // @TODO Remove when EvmWarpModule.create can be used
|
|
1759
|
+
const onlyTxIndex = 0;
|
|
1760
|
+
await multiProvider.sendTransaction(chain, enrollRemoteTxs[onlyTxIndex]);
|
|
1761
|
+
}
|
|
1762
|
+
if (isMovableCollateralTokenConfig(config) &&
|
|
1763
|
+
config.allowedRebalancers &&
|
|
1764
|
+
config.allowedRebalancers.length !== 0) {
|
|
1765
|
+
const addRebalancerTxs = await warpModule.createAddRebalancersUpdateTxs(actualConfig, config); // @TODO Remove when EvmWarpModule.create can be used
|
|
1766
|
+
for (const tx of addRebalancerTxs) {
|
|
1767
|
+
await multiProvider.sendTransaction(chain, tx);
|
|
1768
|
+
}
|
|
1769
|
+
}
|
|
1770
|
+
if (isMovableCollateralTokenConfig(config) &&
|
|
1771
|
+
config.allowedRebalancingBridges &&
|
|
1772
|
+
!isObjEmpty(config.allowedRebalancingBridges)) {
|
|
1773
|
+
const addBridgesTxs = await warpModule.createAddAllowedBridgesUpdateTxs(actualConfig, config); // @TODO Remove when EvmWarpModule.create can be used
|
|
1774
|
+
for (const tx of addBridgesTxs) {
|
|
1775
|
+
await multiProvider.sendTransaction(chain, tx);
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
if (isEverclearTokenBridgeConfig(config)) {
|
|
1779
|
+
const addRemoteOutputTokens = warpModule.createAddRemoteOutputAssetsTxs(actualConfig, config);
|
|
1780
|
+
const updateEverclearFeeParamsTxs = warpModule.createUpdateEverclearFeeParamsTxs(actualConfig, config);
|
|
1781
|
+
const everclearTxs = [
|
|
1782
|
+
...addRemoteOutputTokens,
|
|
1783
|
+
...updateEverclearFeeParamsTxs,
|
|
1784
|
+
];
|
|
1785
|
+
for (const tx of everclearTxs) {
|
|
1786
|
+
await multiProvider.sendTransaction(chain, tx);
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
if (isCrossCollateralTokenConfig(config) &&
|
|
1790
|
+
config.crossCollateralRouters &&
|
|
1791
|
+
Object.keys(config.crossCollateralRouters).length > 0) {
|
|
1792
|
+
const enrollTxs = warpModule.createEnrollCrossCollateralRoutersTxs(actualConfig, config);
|
|
1793
|
+
for (const tx of enrollTxs) {
|
|
1794
|
+
await multiProvider.sendTransaction(chain, tx);
|
|
1795
|
+
}
|
|
1796
|
+
}
|
|
1797
|
+
return warpModule;
|
|
1798
|
+
}
|
|
1799
|
+
}
|
|
1800
|
+
//# sourceMappingURL=EvmWarpModule.js.map
|