DomainRouting and FallbackDomainRouting hooks deployer (#2825)

### Description

Add deployer for routing and fallback routing hooks

### Drive-by changes

None

### Related issues



### Backward compatibility

Yes

### Testing

Manual
pull/2884/head
Kunal Arora 1 year ago committed by GitHub
parent f05c50c92e
commit 81569b2dc2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 433
      rust/config/testnet4_config.json
  2. 8
      solidity/contracts/interfaces/optimism/ICrossDomainMessenger.sol
  3. 13
      typescript/infra/config/aggregationIsm.ts
  4. 4
      typescript/infra/config/environments/test/aggregationIsm.ts
  5. 18
      typescript/infra/config/environments/test/core.ts
  6. 6
      typescript/infra/config/environments/test/multisigIsm.ts
  7. 4
      typescript/infra/config/environments/test/routingIsm.ts
  8. 72
      typescript/infra/config/environments/testnet4/core.ts
  9. 252
      typescript/infra/config/environments/testnet4/core/verification.json
  10. 13
      typescript/infra/config/environments/testnet4/hooks.ts
  11. 14
      typescript/infra/config/routingIsm.ts
  12. 1
      typescript/infra/hardhat.config.ts
  13. 4
      typescript/infra/scripts/print-multisig-ism-config.ts
  14. 5
      typescript/sdk/src/consts/chainMetadata.ts
  15. 406
      typescript/sdk/src/consts/environments/testnet.json
  16. 4
      typescript/sdk/src/core/CoreDeployer.hardhat-test.ts
  17. 1
      typescript/sdk/src/core/HyperlaneCore.ts
  18. 2
      typescript/sdk/src/core/HyperlaneCoreDeployer.ts
  19. 1
      typescript/sdk/src/gas/HyperlaneIgp.ts
  20. 174
      typescript/sdk/src/hook/HyperlaneHookDeployer.ts
  21. 6
      typescript/sdk/src/hook/contracts.ts
  22. 31
      typescript/sdk/src/hook/types.ts
  23. 5
      typescript/sdk/src/index.ts
  24. 7
      typescript/sdk/src/ism/HyperlaneIsmFactory.hardhat-test.ts
  25. 117
      typescript/sdk/src/ism/HyperlaneIsmFactory.ts
  26. 48
      typescript/sdk/src/ism/types.ts
  27. 1
      typescript/sdk/src/middleware/query/InterchainQuery.ts
  28. 4
      typescript/sdk/src/test/testUtils.ts

@ -50,8 +50,55 @@
"aggregationHook": "0xdBabD76358897E68E4964647C1fb8Bf524f5EFdB",
"protocolFee": "0xC9D50584F08Bf6cCD1004d14c7062044b45E3b48",
"defaultIsm": "0xFBb1D475d2275D4643B6ba9Dae16f2F5465F9436",
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0x79c7799a9E686Ed93EEa208B67a2D7E93852F182",
"LEGACY_MULTISIG": "0x2c940Cfe1Fa2bdf2F2746ba52acDf2f0106c3cf1"
},
"fuji": {
"MERKLE_ROOT_MULTISIG": "0x3c9eD95aD9a3613a7c036F44fB6745052861f74C",
"LEGACY_MULTISIG": "0x8d3cf154259E3aF61BA8F62410d9D0E644c6A19f"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0x3e844a5dA9247756F0182D652680065502BCB078",
"LEGACY_MULTISIG": "0x5aABB6B06112FC5Bb9f7e1BC8Ec17c06B01fb6Ed"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0x6b6bEF043905810994a60Cd08F7CdF5BB798f19c",
"LEGACY_MULTISIG": "0xf75B0F727f1dea2FA491caD2Faf8f3B04B705294"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0x2aEEc24F5997D7C19833Bf9f520b1e6c0Ef1Eda5",
"LEGACY_MULTISIG": "0x62f6EfC5a7A978821a5111261902b0A218ABF99F"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0x0caB24DBBDcA1E1bc27dd33481c09d9b306AE4a1",
"LEGACY_MULTISIG": "0xf8afa14F1cd8600d802C5a82A4406ca83629FC23"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0x2183183bdc371c67302097DC60952e6E99484720",
"LEGACY_MULTISIG": "0x631749C86E90Cea9cF3Fb7686eBb6E80EfC9064c"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x4A0eFE3CCE8DEDAD4faC8A8521F920F5C2f553fC",
"LEGACY_MULTISIG": "0x19eeB6f283aBAb2A9A70a11C2a8972D416aA2af9"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0x5E81d0bc59A632f319C75E339874209a29A0D9D2",
"LEGACY_MULTISIG": "0x533fb8cAb191B7094C545A191Ac770deBb1B8EEc"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0xf32f54Ec925AFf962ad164f94E7437E288901015",
"LEGACY_MULTISIG": "0x6BbF423f3742cB6594f9B9D844e780381aa4Ad91"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0xe48BDf85C269603AcB79444D874bb80DFDd93FC5",
"LEGACY_MULTISIG": "0x17B141F3278624B9882e275B8D1aC6a310afCCbe"
},
"ROUTING": "0x2b5D84351aA22d860CE206EB79089F9bE8050890",
"AGGREGATION": "0x6f36a2dCC2eE58eB6b4B43330788Baa350F952EC",
"fallbackRoutingHook": "0xE1386148385275A27D29fC39Bd58a969CD5dCAF0",
"index": {
"from": 20232734
"from": 20647937
}
},
"arbitrumgoerli": {
@ -99,8 +146,9 @@
"interchainGasPaymaster": "0x76189acFA212298d7022624a4633411eE0d2f26F",
"aggregationHook": "0xf852EB6b98d84A4296754043a56759a0Ae0E06df",
"protocolFee": "0x0358ba0D90ED2d90fB8cBb610F27C274D8077a0B",
"fallbackRoutingHook": "0x3Ce607F6FcE5Dfb9821f33504d86E04A4CD0C75f",
"index": {
"from": 45685526
"from": 51782328
}
},
"basegoerli": {
@ -150,8 +198,63 @@
"interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564",
"aggregationHook": "0x168e606fE4A9c8d7F83a3aAA132E831f153e4bAa",
"protocolFee": "0xEe421285728284000ec6c6C55C6F9161faeFfa99",
"fallbackRoutingHook": "0x4Ece7b15ba5dCA2708dCE2812016683193102b9F",
"alfajores": {
"messageIdMultisigIsm": "0xCc44a0dB101E08CB0C13f928aa8d4686042dA576",
"merkleRootMultisigIsm": "0xf113Ea1a825505840451A09113A9bb53908ED8f1",
"staticAggregationIsm": "0x3F5Bd4c5B3c0D91F11Aa7b57099fc3d71e5d26A4"
},
"fuji": {
"messageIdMultisigIsm": "0x27F351ae5f5C0A58ea18aEAD9c1Dc07a53401721",
"merkleRootMultisigIsm": "0xefde4A00A72ef1eb08FFAd3475bCbCd6D336cA4f",
"staticAggregationIsm": "0x7A86e695a0A051Bcf1CB83128613E7561090c677"
},
"mumbai": {
"messageIdMultisigIsm": "0x8Ce0Eda893a1727D171A55515D11420f1841549c",
"merkleRootMultisigIsm": "0x8FEc8D3efEe43Fd096F53b851c60E465A04384C7",
"staticAggregationIsm": "0xE9094c6172b905972D77FF4F5E3f28a73A6c5Dc1"
},
"bsctestnet": {
"messageIdMultisigIsm": "0x4E7EAcA5D2d3B01005cFb0528d3c52cfF09BCA36",
"merkleRootMultisigIsm": "0x3eE9CA0355ae566A8776B41b8D5f96A996d6144e",
"staticAggregationIsm": "0xe111Ac8b252c41D787b4b68F7987B8aAAC3bc1Ce"
},
"goerli": {
"opStackIsm": "0x14EE2f01907707Ce8d13C4F5DBC40778b5b664e0"
},
"scrollsepolia": {
"messageIdMultisigIsm": "0xD5161cD144Ca3C88F87A1db8228D33708c5938Cc",
"merkleRootMultisigIsm": "0xEc5b9b4dc7088B450aa74994EBf65d569d027716",
"staticAggregationIsm": "0x343513A06727FE3268Ef78c3E53591fC67599Ec1"
},
"sepolia": {
"messageIdMultisigIsm": "0x4d7C3c7592A874b8e1d6396646fC45005874beC9",
"merkleRootMultisigIsm": "0x173C1626542165A5F1B5cE20c0026e5E23ef19Ad",
"staticAggregationIsm": "0x0CAC5c5e7Ce997C39B51877E15ce18C5a9a4d00D"
},
"moonbasealpha": {
"messageIdMultisigIsm": "0xC2A3802E2f6150a4d633b5328c6C01797177D2C0",
"merkleRootMultisigIsm": "0x31C77b1C9AD838ed75AAb535fe4fDca1b5dEfFfD",
"staticAggregationIsm": "0xEAfC371E012CC89D5a335AfF326F38b474Bc5E27"
},
"optimismgoerli": {
"messageIdMultisigIsm": "0x75e1ad301B0E96f82d5a87D0Eb95cF1A250bf071",
"merkleRootMultisigIsm": "0xB98cE9298891Be9371F9b7fE021beaDBaD1189DD",
"staticAggregationIsm": "0x1629F7cf0561b7863C2E31F126Ab726Fe2bc307b"
},
"arbitrumgoerli": {
"messageIdMultisigIsm": "0x19b34FDb98F4A6F41e803225bf4E258b7eC55876",
"merkleRootMultisigIsm": "0x93db3fA75bA99a040e6D5d3474350A0564E6E722",
"staticAggregationIsm": "0x830e7814c7C02a174208786CA65917405B845f20"
},
"polygonzkevmtestnet": {
"messageIdMultisigIsm": "0x2c1bF9f9FE80D41Db769050Fb096be9aB41327Bc",
"merkleRootMultisigIsm": "0x8B2069eaa894995141F1879dDB612E05874F0116",
"staticAggregationIsm": "0x74bf2D0B09D371D54BD087df006786384E5525F8"
},
"domainRoutingIsm": "0x4c8b1B480988f24b0F3602A4de641776586DbF90",
"index": {
"from": 10676791
"from": 11714799
}
},
"bsctestnet": {
@ -167,7 +270,13 @@
},
"rpcUrls": [
{
"http": "https://data-seed-prebsc-1-s3.binance.org:8545"
"http": "https://bsc-testnet.publicnode.com"
},
{
"http": "https://bsc-testnet.public.blastapi.io"
},
{
"http": "https://bsc-testnet.blockpi.network/v1/rpc/public"
}
],
"blockExplorers": [
@ -198,8 +307,55 @@
"mailbox": "0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D",
"merkleTreeHook": "0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f",
"validatorAnnounce": "0xf09701B0a93210113D175461b6135a96773B5465",
"alfajores": {
"MERKLE_ROOT_MULTISIG": "0x352b56D019C85B1e7Db163c08876f0E4060e0EC0",
"LEGACY_MULTISIG": "0xc9764347811A0DDB36180273ADB6226E25e8134f"
},
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0x32e4C6C49e9a568Da17f87ee80A9542B5c3cE0bf",
"LEGACY_MULTISIG": "0x55eC2978E6c63DbF4AD2670d36539737d0341c76"
},
"fuji": {
"MERKLE_ROOT_MULTISIG": "0x4E368F65Ef1F765acf149052A5ad656AB4ecFeaf",
"LEGACY_MULTISIG": "0xB751c8366708A8cAa8E55580A6aE2CCAeD97Ca76"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0x13999996CbA4E3BB793726e6Ed66B6DD0b8c19A6",
"LEGACY_MULTISIG": "0x6Bc6514ace1edf23cea6477d3fEDA7954571940C"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0xD953CC38fb2FF4CDE97739A024cd7D87e398Dcaf",
"LEGACY_MULTISIG": "0x16D1B0F3B3279c2793337FE8AfCC804c639C6627"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0xcc7e00D24249D7BCF0aD2c79f6D90951C80CB47B",
"LEGACY_MULTISIG": "0x0521e8571a72445B8a5F758ffF2707d055C0b53F"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0x16A3e41135b1339B925c6e49E64CEEadA5bAdBb7",
"LEGACY_MULTISIG": "0x5AE613e0D9aEF132f7034d6eF36b418ac9dE1f2E"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x6e37E41e7E4682d0dF68E34606f3254D89B7cDD0",
"LEGACY_MULTISIG": "0x8FEA7B15d7BCA0E09cb5B3BEB1dE71738A4a92B5"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0xE61fF63Ff2000Da24B72f1C29209554E8Ba79171",
"LEGACY_MULTISIG": "0x363Fa03085A7D089245d0b637D7FfCF5A1aacb7F"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x91aB65A54DaE3B71f8cE31A20B42e4f337126ffF",
"LEGACY_MULTISIG": "0x32241E9d721E0D61c82BFF037C8A6e33D6cB8F18"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0xdFf1FE7F04c03A8788a728E3fcAe8A50eEAd6e11",
"LEGACY_MULTISIG": "0x6528cB0B4f9065bB4562096963a6C98BC619da7e"
},
"ROUTING": "0x5a052832973d0A988cb553C46F5CfAcA4E078c92",
"AGGREGATION": "0x16c328B3976e5624D8AC38E362574e694676Ac6b",
"fallbackRoutingHook": "0xc278DDe83018F0e8c624b208e6D9E6251d263B1d",
"index": {
"from": 33950052
"from": 34641957
}
},
"fuji": {
@ -249,8 +405,55 @@
"interchainGasPaymaster": "0x6895d3916B94b386fAA6ec9276756e16dAe7480E",
"aggregationHook": "0x8E9b4006171c6B75111823e7545Ee5400CEce0B3",
"protocolFee": "0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b",
"alfajores": {
"MERKLE_ROOT_MULTISIG": "0xd8325468566964245FAdf15Ef0BD3587B598b3bc",
"LEGACY_MULTISIG": "0x04cB6d0616b0059751F2CFc0Ea7dde62d959CEEC"
},
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0x0f56E6D62ddc37cbe2e4a8FA31dCA994c67c2A3d",
"LEGACY_MULTISIG": "0x8F2e9a004d3F0e8E1CEbE52375b44D79fB6Ff6ea"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0x5C38d0d8686aAb40F81Ff5D9929bFD01f9C38899",
"LEGACY_MULTISIG": "0x4509Ee247C37738DC067b22fc84be9b8d7c18e83"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0xA62d029c16354F5845AC3c2728C8027645f16517",
"LEGACY_MULTISIG": "0xb7FFc29CF7be4a969282AE3E171c953D43212C30"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0x1b50E9729155D3F7e3eE886003818D1Fa80920Fd",
"LEGACY_MULTISIG": "0x4D57430F0cb764A9835521acad3653199b039327"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0xA90541C64f3eDc22a47Bc28D7cfdfE17F573A434",
"LEGACY_MULTISIG": "0xc1440Dbb7FeE4179D85d9dAD598A4E78cc5E222B"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0xE5dd4fDE4c99DCeB5F753B6F536E99523dA6EE06",
"LEGACY_MULTISIG": "0x4Bd1319ABc8Bf7633198A1f0e529158D91cfDa9F"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x40D79400513cf7fccaE4d110d3B74c23B08337B6",
"LEGACY_MULTISIG": "0x0a2cD3A4D324A322821A829A1211a8483214ef2a"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0x33b1A7480EC6dB39bE5919d695d06776E3bD7fA9",
"LEGACY_MULTISIG": "0x807AEb2b851Cc843Ae3d4D6f931cAEA893698823"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x247Dd2058D239ADC1348674BFA929F952Af331a0",
"LEGACY_MULTISIG": "0xD6e42987D0533cED33fcC9003B708bC56896C7Fe"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0xD02753F38198DEB05924e503867f0e7bEC04d500",
"LEGACY_MULTISIG": "0x1A28Bc9F1D65661C4338bc374D4f133cB5763c50"
},
"ROUTING": "0xd914570ea19385334e8DAcf5F1794f75895010dF",
"AGGREGATION": "0x39202263246c48eb80879870e9c547Bc787cdfC6",
"fallbackRoutingHook": "0x50897eDCb3f1bB2A90f20DA5a8dF0e5c57A146e3",
"index": {
"from": 26504985
"from": 27245961
}
},
"goerli": {
@ -303,8 +506,84 @@
"merkleTreeHook": "0x28c294C61D3dE053462d2Cfa5d5f8c8D70605A59",
"mailbox": "0x49cfd6Ef774AcAb14814D699e3F7eE36Fdfba932",
"validatorAnnounce": "0x3c182AD9cA8A71bc107Ef440C2667E8360e1158E",
"alfajores": {
"messageIdMultisigIsm": "0x4683D18bD896acf67bC022f2dc0Cf9913E83a8C2",
"merkleRootMultisigIsm": "0xA09db9436C89376FbDCC731c61f3e96194d77549",
"staticAggregationIsm": "0xc80989C697d2dB54827293E9399461F5E17b50AE"
},
"basegoerli": {
"messageIdMultisigIsm": "0x6EF750Fef341239fa0Fd7c9081508590A9527C69",
"merkleRootMultisigIsm": "0x8BB1F2bc7dd305440Dfe4E91c003510ef14044Ba",
"staticAggregationIsm": "0x110C79D5104f3d6a0291397d2f2896f10157C0f6"
},
"fuji": {
"messageIdMultisigIsm": "0x44B0757b1C9512cff0C51089c7D5094C47D9316E",
"merkleRootMultisigIsm": "0xf3C288C5a4E17DCE46d06257B36ec7f4A82C1aF9",
"staticAggregationIsm": "0x0DB339E394665A7bDCb621B8f05A6dE746E4d28D"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0x374A6953e95ADdC76c2d87cC7B89C3227DAf1Fd9",
"LEGACY_MULTISIG": "0x5d05c8152667f73e219CBb37531425C09e894de2",
"messageIdMultisigIsm": "0x374A6953e95ADdC76c2d87cC7B89C3227DAf1Fd9",
"merkleRootMultisigIsm": "0x5d05c8152667f73e219CBb37531425C09e894de2",
"staticAggregationIsm": "0x582643Ca4235195167b2195A4a8F71BDe56b8A1F"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0x72a6Fcd41b68e6FAE71A5d0F21e574F3e6Ec5B9D",
"LEGACY_MULTISIG": "0x0F7C158d6afea27987f655A2d464E16fAe2aD8c7",
"messageIdMultisigIsm": "0x72a6Fcd41b68e6FAE71A5d0F21e574F3e6Ec5B9D",
"merkleRootMultisigIsm": "0x0F7C158d6afea27987f655A2d464E16fAe2aD8c7",
"staticAggregationIsm": "0x444a6FAc09220024f9D65943598829Fd4BD38bD7"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0x89c32A1Ca1Ae39886b18B0466dA5C97a6e031ca2",
"LEGACY_MULTISIG": "0x050798aFB2EF5A847f6A77764F19D207086bdDD3",
"messageIdMultisigIsm": "0x89c32A1Ca1Ae39886b18B0466dA5C97a6e031ca2",
"merkleRootMultisigIsm": "0x050798aFB2EF5A847f6A77764F19D207086bdDD3",
"staticAggregationIsm": "0x4A58088ff4B77dCcf8678A04C945CC552D6e65D6"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0xf45819C46A54cdD816DC8c9EE580712e76eaAc0C",
"LEGACY_MULTISIG": "0xD22fddaB4595a7C0f78Fa3d20cc9485b19Ee861d",
"messageIdMultisigIsm": "0xf45819C46A54cdD816DC8c9EE580712e76eaAc0C",
"merkleRootMultisigIsm": "0xD22fddaB4595a7C0f78Fa3d20cc9485b19Ee861d",
"staticAggregationIsm": "0xE0593C964e8BA2481d0f23BAF27e36DC7CCd9F13"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x9B04e5971738c427c1b0660e89859BD4164B0d67",
"LEGACY_MULTISIG": "0xD3Ad23079611e2cc306E8a60ddFdAD250512d43F",
"messageIdMultisigIsm": "0x9B04e5971738c427c1b0660e89859BD4164B0d67",
"merkleRootMultisigIsm": "0xD3Ad23079611e2cc306E8a60ddFdAD250512d43F",
"staticAggregationIsm": "0xc3AF7BC41D75909cFA34e424Fd505b7121C0CF90"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0x432B0ad68cbA0DFf644F30CC8b3275663Cb692E8",
"LEGACY_MULTISIG": "0xA50e98B2d52d4c9B242bD86f1B5C54D7E33190a6",
"messageIdMultisigIsm": "0x432B0ad68cbA0DFf644F30CC8b3275663Cb692E8",
"merkleRootMultisigIsm": "0xA50e98B2d52d4c9B242bD86f1B5C54D7E33190a6",
"staticAggregationIsm": "0x5d77806Fde4BbA8a665720d528CEACBb694B43b2"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x07733788489efD7F10533ab889144A7C67F6d9EF",
"LEGACY_MULTISIG": "0x44D117A356AfFE5C67D4A53b3eC1Ded1260Bd20d",
"messageIdMultisigIsm": "0x07733788489efD7F10533ab889144A7C67F6d9EF",
"merkleRootMultisigIsm": "0x44D117A356AfFE5C67D4A53b3eC1Ded1260Bd20d",
"staticAggregationIsm": "0x7F28dFed655a4C1a7AeC911B983Bc68EF9195D90"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0x070eDaC389b85aEe38507339Cd80aeBd95b1cb22",
"LEGACY_MULTISIG": "0x5c7e4Eb938DB4f1dE746aBb01eC1228EC38Ed3bd",
"messageIdMultisigIsm": "0x070eDaC389b85aEe38507339Cd80aeBd95b1cb22",
"merkleRootMultisigIsm": "0x5c7e4Eb938DB4f1dE746aBb01eC1228EC38Ed3bd",
"staticAggregationIsm": "0xE2fc443F458B6DbdD8987CDb6830d4F9a1AfDFeb"
},
"ROUTING": "0x656cC76A0D05bC3F40c11DEBe0fF6EEEDabB856e",
"AGGREGATION": "0x595e45990F67A9795cE4FEB0b6ba4684c6258cD0",
"domainRoutingIsm": "0xE2401EB414B41DC2A97100f2Dab75bBcD7377119",
"opStackHook": "0xce59701919507F2d379270657A4e410F570aBe0D",
"fallbackRoutingHook": "0xDd66CB60D4Ffb7f0d8FB91CB1D20aBcaBC82900a",
"index": {
"from": 9816044
"from": 9954053
}
},
"moonbasealpha": {
@ -352,8 +631,9 @@
"aggregationHook": "0xaA9d918C49Cea0D2a877252aFb7976B6e3A48623",
"protocolFee": "0xe2A73F106902983452713F24Bd019F6eb8712986",
"validatorAnnounce": "0x07543860AE9E72aBcF2Bae9827b23621A64Fa416",
"fallbackRoutingHook": "0x6c9EB73793F9Cd535DB1bF86dC307f6d899b2fE3",
"index": {
"from": 5241351
"from": 5382573
}
},
"mumbai": {
@ -394,7 +674,7 @@
},
"isTestnet": true,
"transactionOverrides": {
"maxFeePerGas": 70000000000,
"maxFeePerGas": 150000000000,
"maxPriorityFeePerGas": 40000000000
},
"merkleRootMultisigIsmFactory": "0xda0780ed3eE577EfE0B856E00f983bF231603307",
@ -411,8 +691,55 @@
"protocolFee": "0x244d1F7e30Be144A87602905baBF86630e8f39DC",
"mailbox": "0x2d1889fe5B092CD988972261434F7E5f26041115",
"validatorAnnounce": "0x99303EFF09332cDd93E8BC8b2F07b2416e4501e5",
"alfajores": {
"MERKLE_ROOT_MULTISIG": "0x2ab7f5DeC6f8Ef411315487c23a0FD1955824274",
"LEGACY_MULTISIG": "0x46c3f1a2734568Ab4582E5e990Be37e9A90c8d5C"
},
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0xcA58F63034D79d00742153636f40975616996569",
"LEGACY_MULTISIG": "0x256578935Ea39D5B6eD49722C20D6c7734c17442"
},
"fuji": {
"MERKLE_ROOT_MULTISIG": "0xbd3Cd908B44b1AB4A5c9A2E2Abc567dbd3265BaF",
"LEGACY_MULTISIG": "0xB24FadDB99664D85755a4ee5402Cce2f936e2A85"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0x20fC9FF58AA29FB015195735Cb87999D1169acA7",
"LEGACY_MULTISIG": "0x1A445E9f7f5E6230A11a960E1d77af94ec1Dc70B"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0x94AfA49591B42C681CaFcBA9C1deb6d394dd358c",
"LEGACY_MULTISIG": "0x0025156297d59772cc3836EB15BcEb7b65bF2Ac0"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0xf90Ad611612d3D7f45C1EB525e2f487373286717",
"LEGACY_MULTISIG": "0x00a20F2637437151cBDB5DD8e80672458bcCAE68"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0x4234b78713bB6623b123CdBC4E163F497643D2b1",
"LEGACY_MULTISIG": "0x22A56d69B838897dacA4f87d6cC9c602de6bFaDC"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0xDbb5fc87d9CA83dE79E111acFb96882A70AE490c",
"LEGACY_MULTISIG": "0xe32F2c4129FeA483c55241Ab11413e0E9F38c716"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0xeD282a84F9cd27A827fF07D6894FE9dc63a64D63",
"LEGACY_MULTISIG": "0x45B1784587aCE88E534588e8d43E1A3282ecBA8b"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x75204D086D263d475A6390b476126B2BeB6c37A7",
"LEGACY_MULTISIG": "0x1004f5636f3348bbAae626cAf5b6578f2f7e0425"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0xBae6ED82c61C1aa9a0df9741193aE5a8eE84fB28",
"LEGACY_MULTISIG": "0x2487E9d66E62B3de58C246b3e1d588f41b39d433"
},
"ROUTING": "0xBAad51c021e4bb94b9a10b1fC82b773Ca9e35D30",
"AGGREGATION": "0xE794ff773fcd25ad43749CbCAE8e69f7f64810EF",
"fallbackRoutingHook": "0xFA005A892EbDACFcc3f1EF0111A7406c779c3647",
"index": {
"from": 40880088
"from": 41804759
}
},
"optimismgoerli": {
@ -460,8 +787,9 @@
"interchainGasPaymaster": "0x02A7661273528EfF3d78CBE7CbD1a717b28B89fC",
"aggregationHook": "0x1C8A2588b8038BF9B7b1b60dD0EdF5b995A45599",
"protocolFee": "0x962e30F6A3ECDA85c7fa1FcF38cD04efA991Ee20",
"fallbackRoutingHook": "0xba962f31B8DE02238fDdf8CE6a21260Af8C5Dd2F",
"index": {
"from": 15559566
"from": 16597573
}
},
"polygonzkevmtestnet": {
@ -508,8 +836,9 @@
"interchainGasPaymaster": "0xAD34A66Bf6dB18E858F6B686557075568c6E031C",
"aggregationHook": "0x0Fd2C6F0Ad45e766660b9fDebCF36a2AD69536D1",
"protocolFee": "0xddf4C3e791caCaFd26D7fb275549739B38ae6e75",
"fallbackRoutingHook": "0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5",
"index": {
"from": 2847250
"from": 3049869
}
},
"scrollsepolia": {
@ -526,17 +855,14 @@
"rpcUrls": [
{
"http": "https://sepolia-rpc.scroll.io"
},
{
"http": "https://scroll-public.scroll-testnet.quiknode.pro"
}
],
"blockExplorers": [
{
"name": "Scroll Explorer",
"url": "https://sepolia-blockscout.scroll.io",
"apiUrl": "https://sepolia-blockscout.scroll.io/api",
"family": "blockscout"
"url": "https://sepolia.scrollscan.dev/",
"apiUrl": "https://api-sepolia.scrollscan.com/api",
"family": "etherscan"
}
],
"blocks": {
@ -559,8 +885,66 @@
"interchainGasPaymaster": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD",
"aggregationHook": "0x7b63Aa270335F8896717c2A809205F4b650E4268",
"protocolFee": "0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8",
"alfajores": {
"MERKLE_ROOT_MULTISIG": "0xd9cbF08CaC905F78d961A72716Ef8EeD3aB7e5Eb",
"LEGACY_MULTISIG": "0xdC87a06493FaDE515c623464BE3F1580E5d8EC9A",
"MESSAGE_ID_MULTISIG": "0xd9cbF08CaC905F78d961A72716Ef8EeD3aB7e5Eb"
},
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0xCC7DfEB63bbE762D46C9bb1B27D680b226A94b23",
"LEGACY_MULTISIG": "0xE38a0156e2968d336D43efEC716De54cF243974A",
"MESSAGE_ID_MULTISIG": "0xCC7DfEB63bbE762D46C9bb1B27D680b226A94b23"
},
"fuji": {
"MERKLE_ROOT_MULTISIG": "0x6479E7a0f62db3E4cfC16dfa4960953572cE4d91",
"LEGACY_MULTISIG": "0x8671d101e6A5430D856234811e493CbB3e08f00b",
"MESSAGE_ID_MULTISIG": "0x6479E7a0f62db3E4cfC16dfa4960953572cE4d91"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0xf449003Fdb780bEFac5F946CfC12172dc1e732DF",
"LEGACY_MULTISIG": "0x8838412195Eec3B10Ad78aE3e05d7b3f29d93A4B",
"MESSAGE_ID_MULTISIG": "0xf449003Fdb780bEFac5F946CfC12172dc1e732DF"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0x3074E40aA0C52d83FbB9Be642946f5fadA2212bf",
"LEGACY_MULTISIG": "0xB766e93CFf3B16cBfA698955E71f27a0bE0BD42e",
"MESSAGE_ID_MULTISIG": "0x3074E40aA0C52d83FbB9Be642946f5fadA2212bf"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0xf98a3dfCC6384b6f19F3cdfD992552CA876261f3",
"LEGACY_MULTISIG": "0xde5013E6Ace9c9Da898f98Fafd1a85547f5B893b",
"MESSAGE_ID_MULTISIG": "0xf98a3dfCC6384b6f19F3cdfD992552CA876261f3"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0xD3a84669f2F1896a1E9f77c7Dfe93F32EFf0Ea4E",
"LEGACY_MULTISIG": "0x4a072E0EB5AE0087A080F7b24E56d140E2aDd3f1",
"MESSAGE_ID_MULTISIG": "0xD3a84669f2F1896a1E9f77c7Dfe93F32EFf0Ea4E"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x47D285b171B5E2FDDf387EBdDcBeC58b188445De",
"LEGACY_MULTISIG": "0x3C1FA7196AAEAd718e741014B5Af7D46068335e3",
"MESSAGE_ID_MULTISIG": "0x47D285b171B5E2FDDf387EBdDcBeC58b188445De"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0xef317A77273BE269a2d9861F3e10808126608f4A",
"LEGACY_MULTISIG": "0x21c9A0085c58E08693bC9Bf106066B8b23c51A19",
"MESSAGE_ID_MULTISIG": "0xef317A77273BE269a2d9861F3e10808126608f4A"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x6a3D436940697D2e1b351b366816121E9d291dDd",
"LEGACY_MULTISIG": "0xc144381ccfEc30F40f32FC18C45dD5CC20510aCd",
"MESSAGE_ID_MULTISIG": "0x6a3D436940697D2e1b351b366816121E9d291dDd"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0x6B4374a792DbC69c0EfAdb076190D137df7145F9",
"LEGACY_MULTISIG": "0xD9b48cD1F0B98FaEBafa5BEB1A78bdaCd5731d08",
"MESSAGE_ID_MULTISIG": "0x6B4374a792DbC69c0EfAdb076190D137df7145F9"
},
"ROUTING": "0x30861DDAEFa5F85DAB234F4f67a0bFF0a5E02C48",
"AGGREGATION": "0x5861Baf9aa7eC91e88585aB3bd8e3183B0768437",
"fallbackRoutingHook": "0x7c115c16E34c74afdb88bd268EaB19bC705891FE",
"index": {
"from": 1345368
"from": 1941608
}
},
"sepolia": {
@ -576,7 +960,13 @@
},
"rpcUrls": [
{
"http": "https://endpoints.omniatech.io/v1/eth/sepolia/public"
"http": "https://ethereum-sepolia.blockpi.network/v1/rpc/public"
},
{
"http": "https://eth-sepolia.g.alchemy.com/v2/demo"
},
{
"http": "https://rpc.sepolia.org"
}
],
"blockExplorers": [
@ -607,8 +997,9 @@
"mailbox": "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766",
"merkleTreeHook": "0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d",
"validatorAnnounce": "0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9",
"fallbackRoutingHook": "0x977837C7bf2863403d08a57Ee952d63fA1ae279E",
"index": {
"from": 4432735
"from": 4590471
}
}
},

@ -27,13 +27,13 @@ interface ICrossDomainMessenger {
bytes calldata _message
) external payable;
/*************
* Variables *
*************/
function xDomainMessageSender() external view returns (address);
function OTHER_MESSENGER() external view returns (address);
}
interface IL1CrossDomainMessenger is ICrossDomainMessenger {}
interface IL2CrossDomainMessenger is ICrossDomainMessenger {
function messageNonce() external view returns (uint256);
}

@ -1,8 +1,5 @@
import {
AggregationIsmConfig,
ChainName,
ModuleType,
} from '@hyperlane-xyz/sdk';
import { AggregationIsmConfig, ChainName } from '@hyperlane-xyz/sdk';
import { IsmType } from '@hyperlane-xyz/sdk/dist/ism/types';
import { Contexts } from './contexts';
import { multisigIsm } from './multisigIsm';
@ -13,11 +10,11 @@ export const aggregationIsm = (
context: Contexts,
): AggregationIsmConfig => {
return {
type: ModuleType.AGGREGATION,
type: IsmType.AGGREGATION,
modules: [
// Ordering matters to preserve determinism
multisigIsm(remote, ModuleType.MERKLE_ROOT_MULTISIG, context),
multisigIsm(remote, ModuleType.MESSAGE_ID_MULTISIG, context),
multisigIsm(remote, IsmType.MERKLE_ROOT_MULTISIG, context),
multisigIsm(remote, IsmType.MESSAGE_ID_MULTISIG, context),
],
threshold: 1,
};

@ -1,10 +1,10 @@
import { AggregationIsmConfig, ModuleType } from '@hyperlane-xyz/sdk';
import { AggregationIsmConfig, IsmType } from '@hyperlane-xyz/sdk';
import { merkleRootMultisig, messageIdMultisig } from './multisigIsm';
export const aggregationIsm = (validatorKey: string): AggregationIsmConfig => {
return {
type: ModuleType.AGGREGATION,
type: IsmType.AGGREGATION,
modules: [
merkleRootMultisig(validatorKey),
messageIdMultisig(validatorKey),

@ -4,10 +4,11 @@ import {
AggregationHookConfig,
ChainMap,
CoreConfig,
FallbackRoutingHookConfig,
HookType,
IgpHookConfig,
IsmType,
MerkleTreeHookConfig,
ModuleType,
RoutingIsmConfig,
} from '@hyperlane-xyz/sdk';
import { ProtocolFeeHookConfig } from '@hyperlane-xyz/sdk/src/hook/types';
@ -20,7 +21,7 @@ import { owners } from './owners';
export const core: ChainMap<CoreConfig> = objMap(owners, (local, owner) => {
const defaultIsm: RoutingIsmConfig = {
type: ModuleType.ROUTING,
type: IsmType.ROUTING,
owner,
domains: Object.fromEntries(
Object.entries(chainToValidator)
@ -38,11 +39,22 @@ export const core: ChainMap<CoreConfig> = objMap(owners, (local, owner) => {
...igp[local],
};
const defaultHook: AggregationHookConfig = {
const aggregationHook: AggregationHookConfig = {
type: HookType.AGGREGATION,
hooks: [merkleHook, igpHook],
};
const defaultHook: FallbackRoutingHookConfig = {
type: HookType.FALLBACK_ROUTING,
owner,
fallback: merkleHook,
domains: Object.fromEntries(
Object.entries(chainToValidator)
.filter(([chain, _]) => chain !== local)
.map(([chain, _]) => [chain, aggregationHook]),
),
};
const requiredHook: ProtocolFeeHookConfig = {
type: HookType.PROTOCOL_FEE,
maxProtocolFee: ethers.utils.parseUnits('1', 'gwei'), // 1 gwei of native token

@ -1,4 +1,4 @@
import { ChainMap, ModuleType, MultisigIsmConfig } from '@hyperlane-xyz/sdk';
import { ChainMap, IsmType, MultisigIsmConfig } from '@hyperlane-xyz/sdk';
// the addresses here must line up with the e2e test's validator addresses
// Validators are anvil accounts 4-6
@ -10,7 +10,7 @@ export const chainToValidator: Record<string, string> = {
export const merkleRootMultisig = (validatorKey: string): MultisigIsmConfig => {
return {
type: ModuleType.MERKLE_ROOT_MULTISIG,
type: IsmType.MERKLE_ROOT_MULTISIG,
validators: [validatorKey],
threshold: 1,
};
@ -18,7 +18,7 @@ export const merkleRootMultisig = (validatorKey: string): MultisigIsmConfig => {
export const messageIdMultisig = (validatorKey: string): MultisigIsmConfig => {
return {
type: ModuleType.MESSAGE_ID_MULTISIG,
type: IsmType.MESSAGE_ID_MULTISIG,
validators: [validatorKey],
threshold: 1,
};

@ -1,4 +1,4 @@
import { ModuleType, RoutingIsmConfig } from '@hyperlane-xyz/sdk';
import { IsmType, RoutingIsmConfig } from '@hyperlane-xyz/sdk';
import { multisigIsm } from './multisigIsm';
@ -7,7 +7,7 @@ export const routingIsm = (
owner: string,
): RoutingIsmConfig => {
return {
type: ModuleType.ROUTING,
type: IsmType.ROUTING,
owner,
domains: Object.fromEntries(
Object.entries(multisigIsm).filter(([chain]) => chain !== local_chain),

@ -4,17 +4,21 @@ import {
AggregationHookConfig,
AggregationIsmConfig,
ChainMap,
Chains,
CoreConfig,
FallbackRoutingHookConfig,
HookConfig,
HookType,
IgpHookConfig,
IsmType,
MerkleTreeHookConfig,
ModuleType,
MultisigConfig,
MultisigIsmConfig,
ProtocolFeeHookConfig,
RoutingIsmConfig,
defaultMultisigIsmConfigs,
} from '@hyperlane-xyz/sdk';
import { OpStackIsmConfig } from '@hyperlane-xyz/sdk/dist/ism/types';
import { objMap } from '@hyperlane-xyz/utils';
import { supportedChainNames } from './chains';
@ -28,35 +32,35 @@ export const core: ChainMap<CoreConfig> = objMap(owners, (local, owner) => {
.map((origin) => [origin, defaultMultisigIsmConfigs[origin]]),
);
const messageIdRouting: RoutingIsmConfig = {
type: ModuleType.ROUTING,
domains: objMap(
originMultisigs,
(_, multisig): MultisigIsmConfig => ({
type: ModuleType.MESSAGE_ID_MULTISIG,
...multisig,
}),
),
owner,
};
const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => ({
type: IsmType.MERKLE_ROOT_MULTISIG,
...multisig,
});
const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => ({
type: IsmType.MESSAGE_ID_MULTISIG,
...multisig,
});
const merkleRootRouting: RoutingIsmConfig = {
type: ModuleType.ROUTING,
const defaultIsm: RoutingIsmConfig = {
type: IsmType.ROUTING,
domains: objMap(
originMultisigs,
(_, multisig): MultisigIsmConfig => ({
type: ModuleType.MERKLE_ROOT_MULTISIG,
...multisig,
(_, multisig): AggregationIsmConfig => ({
type: IsmType.AGGREGATION,
modules: [messageIdIsm(multisig), merkleRoot(multisig)],
threshold: 1,
}),
),
owner,
};
const defaultIsm: AggregationIsmConfig = {
type: ModuleType.AGGREGATION,
modules: [messageIdRouting, merkleRootRouting],
threshold: 1,
};
if (local === Chains.basegoerli || local === Chains.optimismgoerli) {
defaultIsm.domains[Chains.goerli] = {
origin: Chains.goerli,
type: IsmType.OP_STACK,
nativeBridge: '0x4200000000000000000000000000000000000007',
} as OpStackIsmConfig;
}
const merkleHook: MerkleTreeHookConfig = {
type: HookType.MERKLE_TREE,
@ -67,9 +71,27 @@ export const core: ChainMap<CoreConfig> = objMap(owners, (local, owner) => {
...igp[local],
};
const defaultHook: AggregationHookConfig = {
const aggregationHook = (opStackHook: HookConfig): AggregationHookConfig => ({
type: HookType.AGGREGATION,
hooks: [merkleHook, igpHook],
hooks: [opStackHook, igpHook],
});
const domains = Object.fromEntries(
Object.entries(owners)
.filter(([chain, _]) => chain !== local)
.map(([chain, _]) => [chain, aggregationHook(merkleHook) as HookConfig]),
);
// if (local === Chains.goerli) {
// domains[Chains.optimismgoerli] = aggregationHook(opHookConfig);
// domains[Chains.basegoerli] = aggregationHook(baseHookConfig);
// }
const defaultHook: FallbackRoutingHookConfig = {
type: HookType.FALLBACK_ROUTING,
owner,
fallback: merkleHook,
domains: domains,
};
const requiredHook: ProtocolFeeHookConfig = {

@ -1349,6 +1349,18 @@
"address": "0x3726EE36a2A9e11a40d1ffD7D9A1A16e0154cDA0",
"constructorArguments": "0x000000000000000000000000ef9f292fcebc3848bf4bb92a96a04f9ecbb78e59",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xE1386148385275A27D29fC39Bd58a969CD5dCAF0",
"constructorArguments": "000000000000000000000000ef9f292fcebc3848bf4bb92a96a04f9ecbb78e59000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000221fa9cbafcd6c1c3d206571cf4427703e023ffa",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xE1386148385275A27D29fC39Bd58a969CD5dCAF0",
"constructorArguments": "000000000000000000000000ef9f292fcebc3848bf4bb92a96a04f9ecbb78e59000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000221fa9cbafcd6c1c3d206571cf4427703e023ffa",
"isProxy": false
}
],
"basegoerli": [
@ -2701,6 +2713,18 @@
"address": "0x679Dc08cC3A4acFeea2f7CAFAa37561aE0b41Ce7",
"constructorArguments": "0x00000000000000000000000058483b754abb1e8947be63d6b95df75b8249543a",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x4Ece7b15ba5dCA2708dCE2812016683193102b9F",
"constructorArguments": "00000000000000000000000058483b754abb1e8947be63d6b95df75b8249543a000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000005821f3b6ee05f3dc62b43b74ab1c8f8e6904b1c8",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x4Ece7b15ba5dCA2708dCE2812016683193102b9F",
"constructorArguments": "00000000000000000000000058483b754abb1e8947be63d6b95df75b8249543a000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000005821f3b6ee05f3dc62b43b74ab1c8f8e6904b1c8",
"isProxy": false
}
],
"fuji": [
@ -3045,6 +3069,18 @@
"address": "0x4f7179A691F8a684f56cF7Fed65171877d30739a",
"constructorArguments": "0x0000000000000000000000005b6cff85442b851a8e6eabd2a4e4507b5135b3b0",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x50897eDCb3f1bB2A90f20DA5a8dF0e5c57A146e3",
"constructorArguments": "0000000000000000000000005b6cff85442b851a8e6eabd2a4e4507b5135b3b0000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000009ff6ac3daf63103620bbf76136ea1aff43c2f612",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x50897eDCb3f1bB2A90f20DA5a8dF0e5c57A146e3",
"constructorArguments": "0000000000000000000000005b6cff85442b851a8e6eabd2a4e4507b5135b3b0000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000009ff6ac3daf63103620bbf76136ea1aff43c2f612",
"isProxy": false
}
],
"mumbai": [
@ -3137,6 +3173,18 @@
"address": "0x99303EFF09332cDd93E8BC8b2F07b2416e4501e5",
"constructorArguments": "0x0000000000000000000000002d1889fe5b092cd988972261434f7e5f26041115",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xFA005A892EbDACFcc3f1EF0111A7406c779c3647",
"constructorArguments": "0000000000000000000000002d1889fe5b092cd988972261434f7e5f26041115000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000009af85731edd41e2e50f81ef8a0a69d2fb836edf9",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xFA005A892EbDACFcc3f1EF0111A7406c779c3647",
"constructorArguments": "0000000000000000000000002d1889fe5b092cd988972261434f7e5f26041115000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000009af85731edd41e2e50f81ef8a0a69d2fb836edf9",
"isProxy": false
}
],
"bsctestnet": [
@ -3229,6 +3277,18 @@
"address": "0xf09701B0a93210113D175461b6135a96773B5465",
"constructorArguments": "0x000000000000000000000000f9f6f5646f478d5ab4e20b0f910c92f1ccc9cc6d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xc278DDe83018F0e8c624b208e6D9E6251d263B1d",
"constructorArguments": "000000000000000000000000f9f6f5646f478d5ab4e20b0f910c92f1ccc9cc6d000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000c6cbf39a747f5e28d1bdc8d9dfdab2960abd5a8f",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xc278DDe83018F0e8c624b208e6D9E6251d263B1d",
"constructorArguments": "000000000000000000000000f9f6f5646f478d5ab4e20b0f910c92f1ccc9cc6d000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000c6cbf39a747f5e28d1bdc8d9dfdab2960abd5a8f",
"isProxy": false
}
],
"goerli": [
@ -3321,6 +3381,78 @@
"address": "0x3c182AD9cA8A71bc107Ef440C2667E8360e1158E",
"constructorArguments": "0x00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba932",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x66F356393a9d66C7757dE475d02969783796d54c",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba932000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000028c294c61d3de053462d2cfa5d5f8c8d70605a59",
"isProxy": false
},
{
"name": "OpStackHook",
"address": "0x7523AE9fAebf49749a0E7148403c8d26C23a53da",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba9320000000000000000000000000000000000000000000000000000000000014a330000000000000000000000001681cc382e08a72d4b64a123080896e30f96b7400000000000000000000000008e5693140ea606bceb98761d9beb1bc87383706d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x66F356393a9d66C7757dE475d02969783796d54c",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba932000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000028c294c61d3de053462d2cfa5d5f8c8d70605a59",
"isProxy": false
},
{
"name": "OpStackHook",
"address": "0x7523AE9fAebf49749a0E7148403c8d26C23a53da",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba9320000000000000000000000000000000000000000000000000000000000014a330000000000000000000000001681cc382e08a72d4b64a123080896e30f96b7400000000000000000000000008e5693140ea606bceb98761d9beb1bc87383706d",
"isProxy": false
},
{
"name": "OpStackHook",
"address": "0x108FD05a2c0Ba834506167ef8f9FD715B3319d8F",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba9320000000000000000000000000000000000000000000000000000000000014a330000000000000000000000003212977fbe6464c2bb60fdb85ab0a5e06e25cdfb0000000000000000000000008e5693140ea606bceb98761d9beb1bc87383706d",
"isProxy": false
},
{
"name": "OpStackHook",
"address": "0x108FD05a2c0Ba834506167ef8f9FD715B3319d8F",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba9320000000000000000000000000000000000000000000000000000000000014a330000000000000000000000003212977fbe6464c2bb60fdb85ab0a5e06e25cdfb0000000000000000000000008e5693140ea606bceb98761d9beb1bc87383706d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x8BAB125B823ee5E55797394c03B15874bF176A53",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba932000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000028c294c61d3de053462d2cfa5d5f8c8d70605a59",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x8BAB125B823ee5E55797394c03B15874bF176A53",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba932000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000028c294c61d3de053462d2cfa5d5f8c8d70605a59",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xDd66CB60D4Ffb7f0d8FB91CB1D20aBcaBC82900a",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba932000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000028c294c61d3de053462d2cfa5d5f8c8d70605a59",
"isProxy": false
},
{
"name": "OpStackHook",
"address": "0xce59701919507F2d379270657A4e410F570aBe0D",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba9320000000000000000000000000000000000000000000000000000000000014a33000000000000000000000000e0c5bdafee7f7065402337040e426a42b5c336500000000000000000000000008e5693140ea606bceb98761d9beb1bc87383706d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xDd66CB60D4Ffb7f0d8FB91CB1D20aBcaBC82900a",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba932000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000028c294c61d3de053462d2cfa5d5f8c8d70605a59",
"isProxy": false
},
{
"name": "OpStackHook",
"address": "0xce59701919507F2d379270657A4e410F570aBe0D",
"constructorArguments": "00000000000000000000000049cfd6ef774acab14814d699e3f7ee36fdfba9320000000000000000000000000000000000000000000000000000000000014a33000000000000000000000000e0c5bdafee7f7065402337040e426a42b5c336500000000000000000000000008e5693140ea606bceb98761d9beb1bc87383706d",
"isProxy": false
}
],
"scrollsepolia": [
@ -3413,6 +3545,30 @@
"address": "0x527768930D889662Fe7ACF64294871e86e4C2381",
"constructorArguments": "0x0000000000000000000000003c5154a193d6e2955650f9305c8d80c18c814a68",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb",
"constructorArguments": "0000000000000000000000003c5154a193d6e2955650f9305c8d80c18c814a68000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000863e8c26621c52aca1849c53500606e73ba272f0",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb",
"constructorArguments": "0000000000000000000000003c5154a193d6e2955650f9305c8d80c18c814a68000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000863e8c26621c52aca1849c53500606e73ba272f0",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x7c115c16E34c74afdb88bd268EaB19bC705891FE",
"constructorArguments": "0000000000000000000000003c5154a193d6e2955650f9305c8d80c18c814a68000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000863e8c26621c52aca1849c53500606e73ba272f0",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x7c115c16E34c74afdb88bd268EaB19bC705891FE",
"constructorArguments": "0000000000000000000000003c5154a193d6e2955650f9305c8d80c18c814a68000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000863e8c26621c52aca1849c53500606e73ba272f0",
"isProxy": false
}
],
"sepolia": [
@ -3505,6 +3661,54 @@
"address": "0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9",
"constructorArguments": "0x000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x7CE74319699165430fC651F6b99406eEbee95493",
"constructorArguments": "000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000004917a9746a7b6e0a57159ccb7f5a6744247f2d0d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x7CE74319699165430fC651F6b99406eEbee95493",
"constructorArguments": "000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000004917a9746a7b6e0a57159ccb7f5a6744247f2d0d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x977837C7bf2863403d08a57Ee952d63fA1ae279E",
"constructorArguments": "000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000004917a9746a7b6e0a57159ccb7f5a6744247f2d0d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x977837C7bf2863403d08a57Ee952d63fA1ae279E",
"constructorArguments": "000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000004917a9746a7b6e0a57159ccb7f5a6744247f2d0d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x977837C7bf2863403d08a57Ee952d63fA1ae279E",
"constructorArguments": "000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000004917a9746a7b6e0a57159ccb7f5a6744247f2d0d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x977837C7bf2863403d08a57Ee952d63fA1ae279E",
"constructorArguments": "000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000004917a9746a7b6e0a57159ccb7f5a6744247f2d0d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x977837C7bf2863403d08a57Ee952d63fA1ae279E",
"constructorArguments": "000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000004917a9746a7b6e0a57159ccb7f5a6744247f2d0d",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x977837C7bf2863403d08a57Ee952d63fA1ae279E",
"constructorArguments": "000000000000000000000000ffaef09b3cd11d9b20d1a19becca54eec2884766000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000004917a9746a7b6e0a57159ccb7f5a6744247f2d0d",
"isProxy": false
}
],
"moonbasealpha": [
@ -3597,6 +3801,18 @@
"address": "0x07543860AE9E72aBcF2Bae9827b23621A64Fa416",
"constructorArguments": "0x00000000000000000000000076189acfa212298d7022624a4633411ee0d2f26f",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x6c9EB73793F9Cd535DB1bF86dC307f6d899b2fE3",
"constructorArguments": "00000000000000000000000076189acfa212298d7022624a4633411ee0d2f26f000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000155b1cd2f7cbc58d403b9be341fab6cd77425175",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x6c9EB73793F9Cd535DB1bF86dC307f6d899b2fE3",
"constructorArguments": "00000000000000000000000076189acfa212298d7022624a4633411ee0d2f26f000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000155b1cd2f7cbc58d403b9be341fab6cd77425175",
"isProxy": false
}
],
"optimismgoerli": [
@ -3689,6 +3905,18 @@
"address": "0x24D31e12E4d3bc2C46C994FcE0c828b218A1aeAb",
"constructorArguments": "0x000000000000000000000000b5f021728ea6223e3948db2da61d612307945ea2",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xba962f31B8DE02238fDdf8CE6a21260Af8C5Dd2F",
"constructorArguments": "000000000000000000000000b5f021728ea6223e3948db2da61d612307945ea2000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fee074b31b5b259eb3109737be13d39b853b47b9",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xba962f31B8DE02238fDdf8CE6a21260Af8C5Dd2F",
"constructorArguments": "000000000000000000000000b5f021728ea6223e3948db2da61d612307945ea2000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fee074b31b5b259eb3109737be13d39b853b47b9",
"isProxy": false
}
],
"arbitrumgoerli": [
@ -3781,6 +4009,18 @@
"address": "0x4a01EEBa1CC20F47A2e60aE4ec932051601FcB9e",
"constructorArguments": "0x00000000000000000000000013dabc0351407d5aaa0a50003a166a73b4febfdc",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x3Ce607F6FcE5Dfb9821f33504d86E04A4CD0C75f",
"constructorArguments": "00000000000000000000000013dabc0351407d5aaa0a50003a166a73b4febfdc000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000f0a38e1eea49dac7968f470c3aa0bde2565a5d80",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0x3Ce607F6FcE5Dfb9821f33504d86E04A4CD0C75f",
"constructorArguments": "00000000000000000000000013dabc0351407d5aaa0a50003a166a73b4febfdc000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000f0a38e1eea49dac7968f470c3aa0bde2565a5d80",
"isProxy": false
}
],
"polygonzkevmtestnet": [
@ -3873,6 +4113,18 @@
"address": "0x7914A3349107A7295Bbf2374db5A973d73D1b324",
"constructorArguments": "0x000000000000000000000000598face78a4302f11e3de0bee1894da0b2cb71f8",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5",
"constructorArguments": "000000000000000000000000598face78a4302f11e3de0bee1894da0b2cb71f8000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000068311418d79fe8d96599384ed767d225635d88a8",
"isProxy": false
},
{
"name": "FallbackRoutingHook",
"address": "0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5",
"constructorArguments": "000000000000000000000000598face78a4302f11e3de0bee1894da0b2cb71f8000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000068311418d79fe8d96599384ed767d225635d88a8",
"isProxy": false
}
]
}

@ -0,0 +1,13 @@
import { Chains, HookType, OpStackHookConfig } from '@hyperlane-xyz/sdk';
export const opHookConfig: OpStackHookConfig = {
type: HookType.OP_STACK,
nativeBridge: '0xDa2332D0a7608919Cd331B1304Cd179129a90495',
destinationChain: Chains.optimismgoerli,
};
export const baseHookConfig: OpStackHookConfig = {
type: HookType.OP_STACK,
nativeBridge: '0x8e5693140eA606bcEB98761d9beB1BC87383706D',
destinationChain: Chains.basegoerli,
};

@ -3,7 +3,7 @@ import {
ChainMap,
ChainName,
IsmConfig,
ModuleType,
IsmType,
RoutingIsmConfig,
} from '@hyperlane-xyz/sdk';
import { Address } from '@hyperlane-xyz/utils';
@ -70,7 +70,7 @@ export const routingIsm = (
);
return {
type: ModuleType.ROUTING,
type: IsmType.ROUTING,
domains: aggregationIsms,
owner: owners[environment][local],
};
@ -79,15 +79,13 @@ export const routingIsm = (
const replacerEnum = (key: string, value: any) => {
if (key === 'type') {
switch (value) {
case ModuleType.AGGREGATION:
case IsmType.AGGREGATION:
return 'AGGREGATION';
case ModuleType.ROUTING:
case IsmType.ROUTING:
return 'ROUTING';
case ModuleType.MERKLE_ROOT_MULTISIG:
case IsmType.MERKLE_ROOT_MULTISIG:
return 'MERKLE_ROOT_MULTISIG';
case ModuleType.LEGACY_MULTISIG:
return 'LEGACY_MULTISIG';
case ModuleType.MESSAGE_ID_MULTISIG:
case IsmType.MESSAGE_ID_MULTISIG:
return 'MESSAGE_ID_MULTISIG';
default:
return value;

@ -8,7 +8,6 @@ import {
ChainName,
HookType,
HyperlaneCore,
ModuleType,
MultiProvider,
} from '@hyperlane-xyz/sdk';
import { addressToBytes32 } from '@hyperlane-xyz/utils';

@ -1,4 +1,4 @@
import { AllChains, ModuleType } from '@hyperlane-xyz/sdk';
import { AllChains, IsmType } from '@hyperlane-xyz/sdk';
import { multisigIsms } from '../config/multisigIsm';
@ -16,7 +16,7 @@ async function main() {
const config = multisigIsms(
args.environment,
args.local,
ModuleType.MESSAGE_ID_MULTISIG,
IsmType.MESSAGE_ID_MULTISIG,
args.context,
);

@ -426,10 +426,7 @@ export const scrollsepolia: ChainMetadata = {
protocol: ProtocolType.Ethereum,
displayName: 'Scroll Sepolia',
nativeToken: etherToken,
rpcUrls: [
{ http: 'https://sepolia-rpc.scroll.io' },
{ http: 'https://scroll-public.scroll-testnet.quiknode.pro' },
],
rpcUrls: [{ http: 'https://sepolia-rpc.scroll.io' }],
blockExplorers: [
{
name: 'Scroll Explorer',

@ -13,7 +13,62 @@
"storageGasOracle": "0x267B6B6eAf6790faE5D5E9070F28a9cE64CbF279",
"interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564",
"aggregationHook": "0x168e606fE4A9c8d7F83a3aAA132E831f153e4bAa",
"protocolFee": "0xEe421285728284000ec6c6C55C6F9161faeFfa99"
"protocolFee": "0xEe421285728284000ec6c6C55C6F9161faeFfa99",
"fallbackRoutingHook": "0x4Ece7b15ba5dCA2708dCE2812016683193102b9F",
"alfajores": {
"messageIdMultisigIsm": "0xCc44a0dB101E08CB0C13f928aa8d4686042dA576",
"merkleRootMultisigIsm": "0xf113Ea1a825505840451A09113A9bb53908ED8f1",
"staticAggregationIsm": "0x3F5Bd4c5B3c0D91F11Aa7b57099fc3d71e5d26A4"
},
"fuji": {
"messageIdMultisigIsm": "0x27F351ae5f5C0A58ea18aEAD9c1Dc07a53401721",
"merkleRootMultisigIsm": "0xefde4A00A72ef1eb08FFAd3475bCbCd6D336cA4f",
"staticAggregationIsm": "0x7A86e695a0A051Bcf1CB83128613E7561090c677"
},
"mumbai": {
"messageIdMultisigIsm": "0x8Ce0Eda893a1727D171A55515D11420f1841549c",
"merkleRootMultisigIsm": "0x8FEc8D3efEe43Fd096F53b851c60E465A04384C7",
"staticAggregationIsm": "0xE9094c6172b905972D77FF4F5E3f28a73A6c5Dc1"
},
"bsctestnet": {
"messageIdMultisigIsm": "0x4E7EAcA5D2d3B01005cFb0528d3c52cfF09BCA36",
"merkleRootMultisigIsm": "0x3eE9CA0355ae566A8776B41b8D5f96A996d6144e",
"staticAggregationIsm": "0xe111Ac8b252c41D787b4b68F7987B8aAAC3bc1Ce"
},
"goerli": {
"opStackIsm": "0xc60c145f1e1904f9d6483a611bf1416697ccc1fe"
},
"scrollsepolia": {
"messageIdMultisigIsm": "0xD5161cD144Ca3C88F87A1db8228D33708c5938Cc",
"merkleRootMultisigIsm": "0xEc5b9b4dc7088B450aa74994EBf65d569d027716",
"staticAggregationIsm": "0x343513A06727FE3268Ef78c3E53591fC67599Ec1"
},
"sepolia": {
"messageIdMultisigIsm": "0x4d7C3c7592A874b8e1d6396646fC45005874beC9",
"merkleRootMultisigIsm": "0x173C1626542165A5F1B5cE20c0026e5E23ef19Ad",
"staticAggregationIsm": "0x0CAC5c5e7Ce997C39B51877E15ce18C5a9a4d00D"
},
"moonbasealpha": {
"messageIdMultisigIsm": "0xC2A3802E2f6150a4d633b5328c6C01797177D2C0",
"merkleRootMultisigIsm": "0x31C77b1C9AD838ed75AAb535fe4fDca1b5dEfFfD",
"staticAggregationIsm": "0xEAfC371E012CC89D5a335AfF326F38b474Bc5E27"
},
"optimismgoerli": {
"messageIdMultisigIsm": "0x75e1ad301B0E96f82d5a87D0Eb95cF1A250bf071",
"merkleRootMultisigIsm": "0xB98cE9298891Be9371F9b7fE021beaDBaD1189DD",
"staticAggregationIsm": "0x1629F7cf0561b7863C2E31F126Ab726Fe2bc307b"
},
"arbitrumgoerli": {
"messageIdMultisigIsm": "0x19b34FDb98F4A6F41e803225bf4E258b7eC55876",
"merkleRootMultisigIsm": "0x93db3fA75bA99a040e6D5d3474350A0564E6E722",
"staticAggregationIsm": "0x830e7814c7C02a174208786CA65917405B845f20"
},
"polygonzkevmtestnet": {
"messageIdMultisigIsm": "0x2c1bF9f9FE80D41Db769050Fb096be9aB41327Bc",
"merkleRootMultisigIsm": "0x8B2069eaa894995141F1879dDB612E05874F0116",
"staticAggregationIsm": "0x74bf2D0B09D371D54BD087df006786384E5525F8"
},
"domainRoutingIsm": "0x4c8b1B480988f24b0F3602A4de641776586DbF90"
},
"arbitrumgoerli": {
"merkleRootMultisigIsmFactory": "0x17D58eBb5Ea0E2d360c877E119FAef4C4052e6B9",
@ -29,7 +84,8 @@
"storageGasOracle": "0xFc8229ADB46D96056A6e451Fb3c55d60FFeD056f",
"interchainGasPaymaster": "0x76189acFA212298d7022624a4633411eE0d2f26F",
"aggregationHook": "0xf852EB6b98d84A4296754043a56759a0Ae0E06df",
"protocolFee": "0x0358ba0D90ED2d90fB8cBb610F27C274D8077a0B"
"protocolFee": "0x0358ba0D90ED2d90fB8cBb610F27C274D8077a0B",
"fallbackRoutingHook": "0x3Ce607F6FcE5Dfb9821f33504d86E04A4CD0C75f"
},
"optimismgoerli": {
"merkleRootMultisigIsmFactory": "0xAbC25d7daDD748948F5cC912A807b0f8FcBb56a9",
@ -45,7 +101,8 @@
"storageGasOracle": "0x4927C33299091033D935C15DE6b6073164e99BE0",
"interchainGasPaymaster": "0x02A7661273528EfF3d78CBE7CbD1a717b28B89fC",
"aggregationHook": "0x1C8A2588b8038BF9B7b1b60dD0EdF5b995A45599",
"protocolFee": "0x962e30F6A3ECDA85c7fa1FcF38cD04efA991Ee20"
"protocolFee": "0x962e30F6A3ECDA85c7fa1FcF38cD04efA991Ee20",
"fallbackRoutingHook": "0xba962f31B8DE02238fDdf8CE6a21260Af8C5Dd2F"
},
"scrollsepolia": {
"merkleRootMultisigIsmFactory": "0x275aCcCa81cAD931dC6fB6E49ED233Bc99Bed4A7",
@ -61,7 +118,65 @@
"storageGasOracle": "0x6b1bb4ce664Bb4164AEB4d3D2E7DE7450DD8084C",
"interchainGasPaymaster": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD",
"aggregationHook": "0x7b63Aa270335F8896717c2A809205F4b650E4268",
"protocolFee": "0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8"
"protocolFee": "0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8",
"alfajores": {
"MERKLE_ROOT_MULTISIG": "0xd9cbF08CaC905F78d961A72716Ef8EeD3aB7e5Eb",
"LEGACY_MULTISIG": "0xdC87a06493FaDE515c623464BE3F1580E5d8EC9A",
"MESSAGE_ID_MULTISIG": "0xd9cbF08CaC905F78d961A72716Ef8EeD3aB7e5Eb"
},
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0xCC7DfEB63bbE762D46C9bb1B27D680b226A94b23",
"LEGACY_MULTISIG": "0xE38a0156e2968d336D43efEC716De54cF243974A",
"MESSAGE_ID_MULTISIG": "0xCC7DfEB63bbE762D46C9bb1B27D680b226A94b23"
},
"fuji": {
"MERKLE_ROOT_MULTISIG": "0x6479E7a0f62db3E4cfC16dfa4960953572cE4d91",
"LEGACY_MULTISIG": "0x8671d101e6A5430D856234811e493CbB3e08f00b",
"MESSAGE_ID_MULTISIG": "0x6479E7a0f62db3E4cfC16dfa4960953572cE4d91"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0xf449003Fdb780bEFac5F946CfC12172dc1e732DF",
"LEGACY_MULTISIG": "0x8838412195Eec3B10Ad78aE3e05d7b3f29d93A4B",
"MESSAGE_ID_MULTISIG": "0xf449003Fdb780bEFac5F946CfC12172dc1e732DF"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0x3074E40aA0C52d83FbB9Be642946f5fadA2212bf",
"LEGACY_MULTISIG": "0xB766e93CFf3B16cBfA698955E71f27a0bE0BD42e",
"MESSAGE_ID_MULTISIG": "0x3074E40aA0C52d83FbB9Be642946f5fadA2212bf"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0xf98a3dfCC6384b6f19F3cdfD992552CA876261f3",
"LEGACY_MULTISIG": "0xde5013E6Ace9c9Da898f98Fafd1a85547f5B893b",
"MESSAGE_ID_MULTISIG": "0xf98a3dfCC6384b6f19F3cdfD992552CA876261f3"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0xD3a84669f2F1896a1E9f77c7Dfe93F32EFf0Ea4E",
"LEGACY_MULTISIG": "0x4a072E0EB5AE0087A080F7b24E56d140E2aDd3f1",
"MESSAGE_ID_MULTISIG": "0xD3a84669f2F1896a1E9f77c7Dfe93F32EFf0Ea4E"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x47D285b171B5E2FDDf387EBdDcBeC58b188445De",
"LEGACY_MULTISIG": "0x3C1FA7196AAEAd718e741014B5Af7D46068335e3",
"MESSAGE_ID_MULTISIG": "0x47D285b171B5E2FDDf387EBdDcBeC58b188445De"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0xef317A77273BE269a2d9861F3e10808126608f4A",
"LEGACY_MULTISIG": "0x21c9A0085c58E08693bC9Bf106066B8b23c51A19",
"MESSAGE_ID_MULTISIG": "0xef317A77273BE269a2d9861F3e10808126608f4A"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x6a3D436940697D2e1b351b366816121E9d291dDd",
"LEGACY_MULTISIG": "0xc144381ccfEc30F40f32FC18C45dD5CC20510aCd",
"MESSAGE_ID_MULTISIG": "0x6a3D436940697D2e1b351b366816121E9d291dDd"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0x6B4374a792DbC69c0EfAdb076190D137df7145F9",
"LEGACY_MULTISIG": "0xD9b48cD1F0B98FaEBafa5BEB1A78bdaCd5731d08",
"MESSAGE_ID_MULTISIG": "0x6B4374a792DbC69c0EfAdb076190D137df7145F9"
},
"ROUTING": "0x30861DDAEFa5F85DAB234F4f67a0bFF0a5E02C48",
"AGGREGATION": "0x5861Baf9aa7eC91e88585aB3bd8e3183B0768437",
"fallbackRoutingHook": "0x7c115c16E34c74afdb88bd268EaB19bC705891FE"
},
"alfajores": {
"merkleRootMultisigIsmFactory": "0xa9C7e306C0941896CA1fd528aA59089571D8D67E",
@ -77,7 +192,54 @@
"interchainGasPaymaster": "0x44769b0f4a6f01339e131a691cc2eebbb519d297",
"aggregationHook": "0xdBabD76358897E68E4964647C1fb8Bf524f5EFdB",
"protocolFee": "0xC9D50584F08Bf6cCD1004d14c7062044b45E3b48",
"defaultIsm": "0xFBb1D475d2275D4643B6ba9Dae16f2F5465F9436"
"defaultIsm": "0xFBb1D475d2275D4643B6ba9Dae16f2F5465F9436",
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0x79c7799a9E686Ed93EEa208B67a2D7E93852F182",
"LEGACY_MULTISIG": "0x2c940Cfe1Fa2bdf2F2746ba52acDf2f0106c3cf1"
},
"fuji": {
"MERKLE_ROOT_MULTISIG": "0x3c9eD95aD9a3613a7c036F44fB6745052861f74C",
"LEGACY_MULTISIG": "0x8d3cf154259E3aF61BA8F62410d9D0E644c6A19f"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0x3e844a5dA9247756F0182D652680065502BCB078",
"LEGACY_MULTISIG": "0x5aABB6B06112FC5Bb9f7e1BC8Ec17c06B01fb6Ed"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0x6b6bEF043905810994a60Cd08F7CdF5BB798f19c",
"LEGACY_MULTISIG": "0xf75B0F727f1dea2FA491caD2Faf8f3B04B705294"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0x2aEEc24F5997D7C19833Bf9f520b1e6c0Ef1Eda5",
"LEGACY_MULTISIG": "0x62f6EfC5a7A978821a5111261902b0A218ABF99F"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0x0caB24DBBDcA1E1bc27dd33481c09d9b306AE4a1",
"LEGACY_MULTISIG": "0xf8afa14F1cd8600d802C5a82A4406ca83629FC23"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0x2183183bdc371c67302097DC60952e6E99484720",
"LEGACY_MULTISIG": "0x631749C86E90Cea9cF3Fb7686eBb6E80EfC9064c"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x4A0eFE3CCE8DEDAD4faC8A8521F920F5C2f553fC",
"LEGACY_MULTISIG": "0x19eeB6f283aBAb2A9A70a11C2a8972D416aA2af9"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0x5E81d0bc59A632f319C75E339874209a29A0D9D2",
"LEGACY_MULTISIG": "0x533fb8cAb191B7094C545A191Ac770deBb1B8EEc"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0xf32f54Ec925AFf962ad164f94E7437E288901015",
"LEGACY_MULTISIG": "0x6BbF423f3742cB6594f9B9D844e780381aa4Ad91"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0xe48BDf85C269603AcB79444D874bb80DFDd93FC5",
"LEGACY_MULTISIG": "0x17B141F3278624B9882e275B8D1aC6a310afCCbe"
},
"ROUTING": "0x2b5D84351aA22d860CE206EB79089F9bE8050890",
"AGGREGATION": "0x6f36a2dCC2eE58eB6b4B43330788Baa350F952EC",
"fallbackRoutingHook": "0xE1386148385275A27D29fC39Bd58a969CD5dCAF0"
},
"polygonzkevmtestnet": {
"merkleRootMultisigIsmFactory": "0xfc6e546510dC9d76057F1f76633FCFfC188CB213",
@ -93,7 +255,8 @@
"storageGasOracle": "0x3707bc8C7342aA6f693bCe1Bd7671Fca146F7F0A",
"interchainGasPaymaster": "0xAD34A66Bf6dB18E858F6B686557075568c6E031C",
"aggregationHook": "0x0Fd2C6F0Ad45e766660b9fDebCF36a2AD69536D1",
"protocolFee": "0xddf4C3e791caCaFd26D7fb275549739B38ae6e75"
"protocolFee": "0xddf4C3e791caCaFd26D7fb275549739B38ae6e75",
"fallbackRoutingHook": "0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5"
},
"sepolia": {
"merkleRootMultisigIsmFactory": "0x0a71AcC99967829eE305a285750017C4916Ca269",
@ -109,7 +272,8 @@
"protocolFee": "0x13AC3349Cb159fE86A22cf42DdA803D9f7309DB5",
"mailbox": "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766",
"merkleTreeHook": "0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d",
"validatorAnnounce": "0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9"
"validatorAnnounce": "0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9",
"fallbackRoutingHook": "0x977837C7bf2863403d08a57Ee952d63fA1ae279E"
},
"fuji": {
"merkleRootMultisigIsmFactory": "0x93F50Ac4E5663DAAb03508008d592f6260964f62",
@ -125,7 +289,54 @@
"storageGasOracle": "0x9305dE34306886d615B096Bdf23b94a978f6a6c0",
"interchainGasPaymaster": "0x6895d3916B94b386fAA6ec9276756e16dAe7480E",
"aggregationHook": "0x8E9b4006171c6B75111823e7545Ee5400CEce0B3",
"protocolFee": "0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b"
"protocolFee": "0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b",
"alfajores": {
"MERKLE_ROOT_MULTISIG": "0xd8325468566964245FAdf15Ef0BD3587B598b3bc",
"LEGACY_MULTISIG": "0x04cB6d0616b0059751F2CFc0Ea7dde62d959CEEC"
},
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0x0f56E6D62ddc37cbe2e4a8FA31dCA994c67c2A3d",
"LEGACY_MULTISIG": "0x8F2e9a004d3F0e8E1CEbE52375b44D79fB6Ff6ea"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0x5C38d0d8686aAb40F81Ff5D9929bFD01f9C38899",
"LEGACY_MULTISIG": "0x4509Ee247C37738DC067b22fc84be9b8d7c18e83"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0xA62d029c16354F5845AC3c2728C8027645f16517",
"LEGACY_MULTISIG": "0xb7FFc29CF7be4a969282AE3E171c953D43212C30"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0x1b50E9729155D3F7e3eE886003818D1Fa80920Fd",
"LEGACY_MULTISIG": "0x4D57430F0cb764A9835521acad3653199b039327"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0xA90541C64f3eDc22a47Bc28D7cfdfE17F573A434",
"LEGACY_MULTISIG": "0xc1440Dbb7FeE4179D85d9dAD598A4E78cc5E222B"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0xE5dd4fDE4c99DCeB5F753B6F536E99523dA6EE06",
"LEGACY_MULTISIG": "0x4Bd1319ABc8Bf7633198A1f0e529158D91cfDa9F"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x40D79400513cf7fccaE4d110d3B74c23B08337B6",
"LEGACY_MULTISIG": "0x0a2cD3A4D324A322821A829A1211a8483214ef2a"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0x33b1A7480EC6dB39bE5919d695d06776E3bD7fA9",
"LEGACY_MULTISIG": "0x807AEb2b851Cc843Ae3d4D6f931cAEA893698823"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x247Dd2058D239ADC1348674BFA929F952Af331a0",
"LEGACY_MULTISIG": "0xD6e42987D0533cED33fcC9003B708bC56896C7Fe"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0xD02753F38198DEB05924e503867f0e7bEC04d500",
"LEGACY_MULTISIG": "0x1A28Bc9F1D65661C4338bc374D4f133cB5763c50"
},
"ROUTING": "0xd914570ea19385334e8DAcf5F1794f75895010dF",
"AGGREGATION": "0x39202263246c48eb80879870e9c547Bc787cdfC6",
"fallbackRoutingHook": "0x50897eDCb3f1bB2A90f20DA5a8dF0e5c57A146e3"
},
"bsctestnet": {
"merkleRootMultisigIsmFactory": "0x3E235B90197E1D6b5DB5ad5aD49f2c1ED6406382",
@ -141,7 +352,54 @@
"protocolFee": "0x3eF0a63B8976b838704Bcc93C78C56b6653E5a39",
"mailbox": "0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D",
"merkleTreeHook": "0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f",
"validatorAnnounce": "0xf09701B0a93210113D175461b6135a96773B5465"
"validatorAnnounce": "0xf09701B0a93210113D175461b6135a96773B5465",
"alfajores": {
"MERKLE_ROOT_MULTISIG": "0x352b56D019C85B1e7Db163c08876f0E4060e0EC0",
"LEGACY_MULTISIG": "0xc9764347811A0DDB36180273ADB6226E25e8134f"
},
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0x32e4C6C49e9a568Da17f87ee80A9542B5c3cE0bf",
"LEGACY_MULTISIG": "0x55eC2978E6c63DbF4AD2670d36539737d0341c76"
},
"fuji": {
"MERKLE_ROOT_MULTISIG": "0x4E368F65Ef1F765acf149052A5ad656AB4ecFeaf",
"LEGACY_MULTISIG": "0xB751c8366708A8cAa8E55580A6aE2CCAeD97Ca76"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0x13999996CbA4E3BB793726e6Ed66B6DD0b8c19A6",
"LEGACY_MULTISIG": "0x6Bc6514ace1edf23cea6477d3fEDA7954571940C"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0xD953CC38fb2FF4CDE97739A024cd7D87e398Dcaf",
"LEGACY_MULTISIG": "0x16D1B0F3B3279c2793337FE8AfCC804c639C6627"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0xcc7e00D24249D7BCF0aD2c79f6D90951C80CB47B",
"LEGACY_MULTISIG": "0x0521e8571a72445B8a5F758ffF2707d055C0b53F"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0x16A3e41135b1339B925c6e49E64CEEadA5bAdBb7",
"LEGACY_MULTISIG": "0x5AE613e0D9aEF132f7034d6eF36b418ac9dE1f2E"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x6e37E41e7E4682d0dF68E34606f3254D89B7cDD0",
"LEGACY_MULTISIG": "0x8FEA7B15d7BCA0E09cb5B3BEB1dE71738A4a92B5"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0xE61fF63Ff2000Da24B72f1C29209554E8Ba79171",
"LEGACY_MULTISIG": "0x363Fa03085A7D089245d0b637D7FfCF5A1aacb7F"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x91aB65A54DaE3B71f8cE31A20B42e4f337126ffF",
"LEGACY_MULTISIG": "0x32241E9d721E0D61c82BFF037C8A6e33D6cB8F18"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0xdFf1FE7F04c03A8788a728E3fcAe8A50eEAd6e11",
"LEGACY_MULTISIG": "0x6528cB0B4f9065bB4562096963a6C98BC619da7e"
},
"ROUTING": "0x5a052832973d0A988cb553C46F5CfAcA4E078c92",
"AGGREGATION": "0x16c328B3976e5624D8AC38E362574e694676Ac6b",
"fallbackRoutingHook": "0xc278DDe83018F0e8c624b208e6D9E6251d263B1d"
},
"goerli": {
"merkleRootMultisigIsmFactory": "0x8e43aCfb338B137A3befd9b92BfD84E128adE0B8",
@ -157,7 +415,83 @@
"protocolFee": "0x9293B8dAcA7933765de499C992B0Fa86Bb104b0f",
"merkleTreeHook": "0x28c294C61D3dE053462d2Cfa5d5f8c8D70605A59",
"mailbox": "0x49cfd6Ef774AcAb14814D699e3F7eE36Fdfba932",
"validatorAnnounce": "0x3c182AD9cA8A71bc107Ef440C2667E8360e1158E"
"validatorAnnounce": "0x3c182AD9cA8A71bc107Ef440C2667E8360e1158E",
"alfajores": {
"messageIdMultisigIsm": "0x4683D18bD896acf67bC022f2dc0Cf9913E83a8C2",
"merkleRootMultisigIsm": "0xA09db9436C89376FbDCC731c61f3e96194d77549",
"staticAggregationIsm": "0xc80989C697d2dB54827293E9399461F5E17b50AE"
},
"basegoerli": {
"messageIdMultisigIsm": "0x6EF750Fef341239fa0Fd7c9081508590A9527C69",
"merkleRootMultisigIsm": "0x8BB1F2bc7dd305440Dfe4E91c003510ef14044Ba",
"staticAggregationIsm": "0x110C79D5104f3d6a0291397d2f2896f10157C0f6"
},
"fuji": {
"messageIdMultisigIsm": "0x44B0757b1C9512cff0C51089c7D5094C47D9316E",
"merkleRootMultisigIsm": "0xf3C288C5a4E17DCE46d06257B36ec7f4A82C1aF9",
"staticAggregationIsm": "0x0DB339E394665A7bDCb621B8f05A6dE746E4d28D"
},
"mumbai": {
"MERKLE_ROOT_MULTISIG": "0x374A6953e95ADdC76c2d87cC7B89C3227DAf1Fd9",
"LEGACY_MULTISIG": "0x5d05c8152667f73e219CBb37531425C09e894de2",
"messageIdMultisigIsm": "0x374A6953e95ADdC76c2d87cC7B89C3227DAf1Fd9",
"merkleRootMultisigIsm": "0x5d05c8152667f73e219CBb37531425C09e894de2",
"staticAggregationIsm": "0x582643Ca4235195167b2195A4a8F71BDe56b8A1F"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0x72a6Fcd41b68e6FAE71A5d0F21e574F3e6Ec5B9D",
"LEGACY_MULTISIG": "0x0F7C158d6afea27987f655A2d464E16fAe2aD8c7",
"messageIdMultisigIsm": "0x72a6Fcd41b68e6FAE71A5d0F21e574F3e6Ec5B9D",
"merkleRootMultisigIsm": "0x0F7C158d6afea27987f655A2d464E16fAe2aD8c7",
"staticAggregationIsm": "0x444a6FAc09220024f9D65943598829Fd4BD38bD7"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0x89c32A1Ca1Ae39886b18B0466dA5C97a6e031ca2",
"LEGACY_MULTISIG": "0x050798aFB2EF5A847f6A77764F19D207086bdDD3",
"messageIdMultisigIsm": "0x89c32A1Ca1Ae39886b18B0466dA5C97a6e031ca2",
"merkleRootMultisigIsm": "0x050798aFB2EF5A847f6A77764F19D207086bdDD3",
"staticAggregationIsm": "0x4A58088ff4B77dCcf8678A04C945CC552D6e65D6"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0xf45819C46A54cdD816DC8c9EE580712e76eaAc0C",
"LEGACY_MULTISIG": "0xD22fddaB4595a7C0f78Fa3d20cc9485b19Ee861d",
"messageIdMultisigIsm": "0xf45819C46A54cdD816DC8c9EE580712e76eaAc0C",
"merkleRootMultisigIsm": "0xD22fddaB4595a7C0f78Fa3d20cc9485b19Ee861d",
"staticAggregationIsm": "0xE0593C964e8BA2481d0f23BAF27e36DC7CCd9F13"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0x9B04e5971738c427c1b0660e89859BD4164B0d67",
"LEGACY_MULTISIG": "0xD3Ad23079611e2cc306E8a60ddFdAD250512d43F",
"messageIdMultisigIsm": "0x9B04e5971738c427c1b0660e89859BD4164B0d67",
"merkleRootMultisigIsm": "0xD3Ad23079611e2cc306E8a60ddFdAD250512d43F",
"staticAggregationIsm": "0xc3AF7BC41D75909cFA34e424Fd505b7121C0CF90"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0x432B0ad68cbA0DFf644F30CC8b3275663Cb692E8",
"LEGACY_MULTISIG": "0xA50e98B2d52d4c9B242bD86f1B5C54D7E33190a6",
"messageIdMultisigIsm": "0x432B0ad68cbA0DFf644F30CC8b3275663Cb692E8",
"merkleRootMultisigIsm": "0xA50e98B2d52d4c9B242bD86f1B5C54D7E33190a6",
"staticAggregationIsm": "0x5d77806Fde4BbA8a665720d528CEACBb694B43b2"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x07733788489efD7F10533ab889144A7C67F6d9EF",
"LEGACY_MULTISIG": "0x44D117A356AfFE5C67D4A53b3eC1Ded1260Bd20d",
"messageIdMultisigIsm": "0x07733788489efD7F10533ab889144A7C67F6d9EF",
"merkleRootMultisigIsm": "0x44D117A356AfFE5C67D4A53b3eC1Ded1260Bd20d",
"staticAggregationIsm": "0x7F28dFed655a4C1a7AeC911B983Bc68EF9195D90"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0x070eDaC389b85aEe38507339Cd80aeBd95b1cb22",
"LEGACY_MULTISIG": "0x5c7e4Eb938DB4f1dE746aBb01eC1228EC38Ed3bd",
"messageIdMultisigIsm": "0x070eDaC389b85aEe38507339Cd80aeBd95b1cb22",
"merkleRootMultisigIsm": "0x5c7e4Eb938DB4f1dE746aBb01eC1228EC38Ed3bd",
"staticAggregationIsm": "0xE2fc443F458B6DbdD8987CDb6830d4F9a1AfDFeb"
},
"ROUTING": "0x656cC76A0D05bC3F40c11DEBe0fF6EEEDabB856e",
"AGGREGATION": "0x595e45990F67A9795cE4FEB0b6ba4684c6258cD0",
"domainRoutingIsm": "0xE2401EB414B41DC2A97100f2Dab75bBcD7377119",
"opStackHook": "0xce59701919507F2d379270657A4e410F570aBe0D",
"fallbackRoutingHook": "0xDd66CB60D4Ffb7f0d8FB91CB1D20aBcaBC82900a"
},
"moonbasealpha": {
"merkleRootMultisigIsmFactory": "0xA59Ba0A8D4ea5A5DC9c8B0101ba7E6eE6C3399A4",
@ -173,7 +507,8 @@
"interchainGasPaymaster": "0x92F05669A354a032A84FcfABfD13beE1aBc5bFd0",
"aggregationHook": "0xaA9d918C49Cea0D2a877252aFb7976B6e3A48623",
"protocolFee": "0xe2A73F106902983452713F24Bd019F6eb8712986",
"validatorAnnounce": "0x07543860AE9E72aBcF2Bae9827b23621A64Fa416"
"validatorAnnounce": "0x07543860AE9E72aBcF2Bae9827b23621A64Fa416",
"fallbackRoutingHook": "0x6c9EB73793F9Cd535DB1bF86dC307f6d899b2fE3"
},
"mumbai": {
"merkleRootMultisigIsmFactory": "0xda0780ed3eE577EfE0B856E00f983bF231603307",
@ -189,6 +524,53 @@
"aggregationHook": "0xD546273418733AcEC8c7A67EfB881c9Ea83851bf",
"protocolFee": "0x244d1F7e30Be144A87602905baBF86630e8f39DC",
"mailbox": "0x2d1889fe5B092CD988972261434F7E5f26041115",
"validatorAnnounce": "0x99303EFF09332cDd93E8BC8b2F07b2416e4501e5"
"validatorAnnounce": "0x99303EFF09332cDd93E8BC8b2F07b2416e4501e5",
"alfajores": {
"MERKLE_ROOT_MULTISIG": "0x2ab7f5DeC6f8Ef411315487c23a0FD1955824274",
"LEGACY_MULTISIG": "0x46c3f1a2734568Ab4582E5e990Be37e9A90c8d5C"
},
"basegoerli": {
"MERKLE_ROOT_MULTISIG": "0xcA58F63034D79d00742153636f40975616996569",
"LEGACY_MULTISIG": "0x256578935Ea39D5B6eD49722C20D6c7734c17442"
},
"fuji": {
"MERKLE_ROOT_MULTISIG": "0xbd3Cd908B44b1AB4A5c9A2E2Abc567dbd3265BaF",
"LEGACY_MULTISIG": "0xB24FadDB99664D85755a4ee5402Cce2f936e2A85"
},
"bsctestnet": {
"MERKLE_ROOT_MULTISIG": "0x20fC9FF58AA29FB015195735Cb87999D1169acA7",
"LEGACY_MULTISIG": "0x1A445E9f7f5E6230A11a960E1d77af94ec1Dc70B"
},
"goerli": {
"MERKLE_ROOT_MULTISIG": "0x94AfA49591B42C681CaFcBA9C1deb6d394dd358c",
"LEGACY_MULTISIG": "0x0025156297d59772cc3836EB15BcEb7b65bF2Ac0"
},
"scrollsepolia": {
"MERKLE_ROOT_MULTISIG": "0xf90Ad611612d3D7f45C1EB525e2f487373286717",
"LEGACY_MULTISIG": "0x00a20F2637437151cBDB5DD8e80672458bcCAE68"
},
"sepolia": {
"MERKLE_ROOT_MULTISIG": "0x4234b78713bB6623b123CdBC4E163F497643D2b1",
"LEGACY_MULTISIG": "0x22A56d69B838897dacA4f87d6cC9c602de6bFaDC"
},
"moonbasealpha": {
"MERKLE_ROOT_MULTISIG": "0xDbb5fc87d9CA83dE79E111acFb96882A70AE490c",
"LEGACY_MULTISIG": "0xe32F2c4129FeA483c55241Ab11413e0E9F38c716"
},
"optimismgoerli": {
"MERKLE_ROOT_MULTISIG": "0xeD282a84F9cd27A827fF07D6894FE9dc63a64D63",
"LEGACY_MULTISIG": "0x45B1784587aCE88E534588e8d43E1A3282ecBA8b"
},
"arbitrumgoerli": {
"MERKLE_ROOT_MULTISIG": "0x75204D086D263d475A6390b476126B2BeB6c37A7",
"LEGACY_MULTISIG": "0x1004f5636f3348bbAae626cAf5b6578f2f7e0425"
},
"polygonzkevmtestnet": {
"MERKLE_ROOT_MULTISIG": "0xBae6ED82c61C1aa9a0df9741193aE5a8eE84fB28",
"LEGACY_MULTISIG": "0x2487E9d66E62B3de58C246b3e1d588f41b39d433"
},
"ROUTING": "0xBAad51c021e4bb94b9a10b1fC82b773Ca9e35D30",
"AGGREGATION": "0xE794ff773fcd25ad43749CbCAE8e69f7f64810EF",
"fallbackRoutingHook": "0xFA005A892EbDACFcc3f1EF0111A7406c779c3647"
}
}

@ -9,7 +9,7 @@ import { TestChains } from '../consts/chains';
import { HyperlaneContractsMap } from '../contracts/types';
import { HyperlaneProxyFactoryDeployer } from '../deploy/HyperlaneProxyFactoryDeployer';
import { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory';
import { AggregationIsmConfig, ModuleType } from '../ism/types';
import { AggregationIsmConfig, IsmType } from '../ism/types';
import { MultiProvider } from '../providers/MultiProvider';
import { testCoreConfig } from '../test/testUtils';
import { ChainMap } from '../types';
@ -95,7 +95,7 @@ describe('core', async () => {
coreConfig,
(_, config) => {
const ismConfig: AggregationIsmConfig = {
type: ModuleType.AGGREGATION,
type: IsmType.AGGREGATION,
modules: [testIsm, testIsm],
threshold: 2,
};

@ -33,6 +33,7 @@ export class HyperlaneCore extends HyperlaneApp<CoreFactories> {
if (!envAddresses) {
throw new Error(`No addresses found for ${env}`);
}
// @ts-ignore
return HyperlaneCore.fromAddressesMap(envAddresses, multiProvider);
}

@ -155,7 +155,7 @@ export class HyperlaneCoreDeployer extends HyperlaneDeployer<
);
this.addDeployedContracts(
chain,
hooks,
this.hookDeployer.deployedContracts[chain],
this.hookDeployer.verificationInputs[chain],
);
return hooks[config.type].address;

@ -24,6 +24,7 @@ export class HyperlaneIgp extends HyperlaneApp<IgpFactories> {
if (!envAddresses) {
throw new Error(`No addresses found for ${env}`);
}
/// @ts-ignore
return HyperlaneIgp.fromAddressesMap(envAddresses, multiProvider);
}

@ -1,9 +1,16 @@
import debug from 'debug';
import { ethers } from 'ethers';
import {
DomainRoutingHook,
FallbackDomainRoutingHook,
IL1CrossDomainMessenger__factory,
OPStackHook,
OPStackIsm,
StaticAggregationHook__factory,
StaticProtocolFee,
} from '@hyperlane-xyz/core';
import { Address, addressToBytes32 } from '@hyperlane-xyz/utils';
import { HyperlaneContracts } from '../contracts/types';
import { CoreAddresses } from '../core/contracts';
@ -11,6 +18,7 @@ import { HyperlaneDeployer } from '../deploy/HyperlaneDeployer';
import { HyperlaneIgpDeployer } from '../gas/HyperlaneIgpDeployer';
import { IgpFactories } from '../gas/contracts';
import { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory';
import { IsmType, OpStackIsmConfig } from '../ism/types';
import { MultiProvider } from '../providers/MultiProvider';
import { ChainMap, ChainName } from '../types';
@ -20,7 +28,9 @@ import {
HookConfig,
HookType,
IgpHookConfig,
OpStackHookConfig,
ProtocolFeeHookConfig,
RoutingHookConfig,
} from './types';
export class HyperlaneHookDeployer extends HyperlaneDeployer<
@ -49,29 +59,38 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer<
coreAddresses = this.core[chain],
): Promise<HyperlaneContracts<HookFactories>> {
// other simple hooks can go here
let hook;
if (config.type === HookType.MERKLE_TREE) {
const mailbox = coreAddresses.mailbox;
if (!mailbox) {
throw new Error(`Mailbox address is required for ${config.type}`);
}
const hook = await this.deployContract(chain, config.type, [mailbox]);
hook = await this.deployContract(chain, config.type, [mailbox]);
return { [config.type]: hook } as any;
} else if (config.type === HookType.INTERCHAIN_GAS_PAYMASTER) {
return this.deployIgp(chain, config, coreAddresses) as any;
} else if (config.type === HookType.AGGREGATION) {
return this.deployAggregation(chain, config, coreAddresses);
return this.deployAggregation(chain, config, coreAddresses); // deploy from factory
} else if (config.type === HookType.PROTOCOL_FEE) {
const hook = await this.deployProtocolFee(chain, config);
return { [config.type]: hook } as any;
hook = await this.deployProtocolFee(chain, config);
} else if (config.type === HookType.OP_STACK) {
hook = await this.deployOpStack(chain, config, coreAddresses);
} else if (
config.type === HookType.ROUTING ||
config.type === HookType.FALLBACK_ROUTING
) {
hook = await this.deployRouting(chain, config, coreAddresses);
}
throw new Error(`Unexpected hook type: ${JSON.stringify(config)}`);
const deployedContracts = { [config.type]: hook } as any;
this.addDeployedContracts(chain, deployedContracts);
return deployedContracts;
}
async deployProtocolFee(
chain: ChainName,
config: ProtocolFeeHookConfig,
): Promise<StaticProtocolFee> {
this.logger('Deploying StaticProtocolFeeHook for %s', chain);
return this.deployContract(chain, HookType.PROTOCOL_FEE, [
config.maxProtocolFee,
config.protocolFee,
@ -85,6 +104,7 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer<
config: IgpHookConfig,
coreAddresses = this.core[chain],
): Promise<HyperlaneContracts<IgpFactories>> {
this.logger('Deploying IGP as hook for %s', chain);
if (coreAddresses.proxyAdmin) {
this.igpDeployer.writeCache(
chain,
@ -107,6 +127,7 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer<
config: AggregationHookConfig,
coreAddresses = this.core[chain],
): Promise<HyperlaneContracts<HookFactories>> {
this.logger('Deploying AggregationHook for %s', chain);
const aggregatedHooks: string[] = [];
let hooks: any = {};
for (const hookConfig of config.hooks) {
@ -127,6 +148,147 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer<
address,
this.multiProvider.getSignerOrProvider(chain),
);
this.addDeployedContracts(chain, hooks);
return hooks;
}
async deployOpStack(
chain: ChainName,
config: OpStackHookConfig,
coreAddresses = this.core[chain],
): Promise<OPStackHook> {
this.logger(
'Deploying OPStackHook for %s to %s',
chain,
config.destinationChain,
);
const mailbox = coreAddresses.mailbox;
if (!mailbox) {
throw new Error(`Mailbox address is required for ${config.type}`);
}
// fetch l2 messenger address from l1 messenger
const l1Messenger = IL1CrossDomainMessenger__factory.connect(
config.nativeBridge,
this.multiProvider.getSignerOrProvider(chain),
);
const l2Messenger: Address = await l1Messenger.OTHER_MESSENGER();
// deploy opstack ism
const ismConfig: OpStackIsmConfig = {
type: IsmType.OP_STACK,
origin: chain,
nativeBridge: l2Messenger,
};
const opstackIsm = await this.ismFactory.deploy(
config.destinationChain,
ismConfig,
chain,
);
// deploy opstack hook
const hook = await this.deployContract(chain, HookType.OP_STACK, [
mailbox,
this.multiProvider.getDomainId(config.destinationChain),
addressToBytes32(opstackIsm.address),
config.nativeBridge,
]);
const overrides = this.multiProvider.getTransactionOverrides(chain);
// set authorized hook on opstack ism
const authorizedHook = await (opstackIsm as OPStackIsm).authorizedHook();
if (authorizedHook === addressToBytes32(hook.address)) {
this.logger('Authorized hook already set on ism %s', opstackIsm.address);
return hook;
} else if (
authorizedHook !== addressToBytes32(ethers.constants.AddressZero)
) {
this.logger(
'Authorized hook mismatch on ism %s, expected %s, got %s',
opstackIsm.address,
addressToBytes32(hook.address),
authorizedHook,
);
throw new Error('Authorized hook mismatch');
}
// check if mismatch and redeploy hook
this.logger(
'Setting authorized hook %s on ism % on destination %s',
hook.address,
opstackIsm.address,
config.destinationChain,
);
await this.multiProvider.handleTx(
config.destinationChain,
(opstackIsm as OPStackIsm).setAuthorizedHook(
addressToBytes32(hook.address),
overrides,
),
);
return hook;
}
async deployRouting(
chain: ChainName,
config: RoutingHookConfig,
coreAddresses = this.core[chain],
): Promise<DomainRoutingHook> {
const mailbox = coreAddresses?.mailbox;
if (!mailbox) {
throw new Error(`Mailbox address is required for ${config.type}`);
}
let routingHook: DomainRoutingHook | FallbackDomainRoutingHook;
switch (config.type) {
case HookType.ROUTING: {
this.logger('Deploying DomainRoutingHook for %s', chain);
routingHook = await this.deployContract(chain, HookType.ROUTING, [
mailbox,
config.owner,
]);
break;
}
case HookType.FALLBACK_ROUTING: {
this.logger('Deploying FallbackDomainRoutingHook for %s', chain);
const fallbackHook = await this.deployContracts(
chain,
config.fallback,
coreAddresses,
);
routingHook = await this.deployContract(
chain,
HookType.FALLBACK_ROUTING,
[mailbox, config.owner, fallbackHook[config.fallback.type].address],
);
break;
}
default:
throw new Error(`Unexpected hook type: ${config}`);
}
const routingConfigs: DomainRoutingHook.HookConfigStruct[] = [];
for (const [dest, hookConfig] of Object.entries(config.domains)) {
const destDomain = this.multiProvider.getDomainId(dest);
if (typeof hookConfig === 'string') {
routingConfigs.push({
destination: destDomain,
hook: hookConfig,
});
} else {
const hook = await this.deployContracts(
chain,
hookConfig,
coreAddresses,
);
routingConfigs.push({
destination: destDomain,
hook: hook[hookConfig.type].address,
});
}
}
await this.multiProvider.handleTx(
chain,
routingHook.setHooks(routingConfigs),
);
return routingHook;
}
}

@ -1,6 +1,9 @@
import {
DomainRoutingHook__factory,
FallbackDomainRoutingHook__factory,
InterchainGasPaymaster__factory,
MerkleTreeHook__factory,
OPStackHook__factory,
StaticAggregationHook__factory,
StaticProtocolFee__factory,
} from '@hyperlane-xyz/core';
@ -12,6 +15,9 @@ export const hookFactories = {
[HookType.PROTOCOL_FEE]: new StaticProtocolFee__factory(),
[HookType.INTERCHAIN_GAS_PAYMASTER]: new InterchainGasPaymaster__factory(), // unused
[HookType.AGGREGATION]: new StaticAggregationHook__factory(), // unused
[HookType.OP_STACK]: new OPStackHook__factory(),
[HookType.ROUTING]: new DomainRoutingHook__factory(),
[HookType.FALLBACK_ROUTING]: new FallbackDomainRoutingHook__factory(),
};
export type HookFactories = typeof hookFactories;

@ -3,12 +3,16 @@ import { BigNumber } from 'ethers';
import { Address } from '@hyperlane-xyz/utils';
import { IgpConfig } from '../gas/types';
import { ChainMap, ChainName } from '../types';
export enum HookType {
MERKLE_TREE = 'merkleTreeHook',
INTERCHAIN_GAS_PAYMASTER = 'interchainGasPaymaster',
AGGREGATION = 'aggregationHook',
PROTOCOL_FEE = 'protocolFee',
OP_STACK = 'opStackHook',
ROUTING = 'domainRoutingHook',
FALLBACK_ROUTING = 'fallbackRoutingHook',
}
export type MerkleTreeHookConfig = {
@ -32,8 +36,33 @@ export type ProtocolFeeHookConfig = {
owner: Address;
};
export type OpStackHookConfig = {
type: HookType.OP_STACK;
nativeBridge: Address;
destinationChain: ChainName;
};
export type DomainRoutingHookConfig = {
type: HookType.ROUTING;
owner: Address;
domains: ChainMap<HookConfig>;
};
export type FallbackRoutingHookConfig = {
type: HookType.FALLBACK_ROUTING;
owner: Address;
fallback: HookConfig;
domains: ChainMap<HookConfig>;
};
export type RoutingHookConfig =
| DomainRoutingHookConfig
| FallbackRoutingHookConfig;
export type HookConfig =
| MerkleTreeHookConfig
| AggregationHookConfig
| IgpHookConfig
| ProtocolFeeHookConfig;
| ProtocolFeeHookConfig
| OpStackHookConfig
| RoutingHookConfig;

@ -112,11 +112,15 @@ export {
export { HyperlaneHookDeployer } from './hook/HyperlaneHookDeployer';
export {
AggregationHookConfig,
DomainRoutingHookConfig,
FallbackRoutingHookConfig,
HookConfig,
HookType,
IgpHookConfig,
MerkleTreeHookConfig,
OpStackHookConfig,
ProtocolFeeHookConfig,
RoutingHookConfig,
} from './hook/types';
export {
HyperlaneIsmFactory,
@ -127,6 +131,7 @@ export {
AggregationIsmConfig,
DeployedIsm,
IsmConfig,
IsmType,
ModuleType,
MultisigConfig,
MultisigIsmConfig,

@ -15,6 +15,7 @@ import {
import {
AggregationIsmConfig,
IsmConfig,
IsmType,
ModuleType,
MultisigIsmConfig,
RoutingIsmConfig,
@ -33,7 +34,7 @@ const randomMultisigIsmConfig = (m: number, n: number): MultisigIsmConfig => {
const emptyArray = new Array<number>(n).fill(0);
const validators = emptyArray.map(() => randomAddress());
return {
type: ModuleType.MERKLE_ROOT_MULTISIG,
type: IsmType.MERKLE_ROOT_MULTISIG,
validators,
threshold: m,
};
@ -47,7 +48,7 @@ const randomIsmConfig = (depth = 0, maxDepth = 2): IsmConfig => {
return randomMultisigIsmConfig(randomInt(n, 1), n);
} else if (moduleType === ModuleType.ROUTING) {
const config: RoutingIsmConfig = {
type: ModuleType.ROUTING,
type: IsmType.ROUTING,
owner: randomAddress(),
domains: Object.fromEntries(
TestChains.map((c) => [c, randomIsmConfig(depth + 1)]),
@ -60,7 +61,7 @@ const randomIsmConfig = (depth = 0, maxDepth = 2): IsmConfig => {
.fill(0)
.map(() => randomIsmConfig(depth + 1));
const config: AggregationIsmConfig = {
type: ModuleType.AGGREGATION,
type: IsmType.AGGREGATION,
threshold: randomInt(n, 1),
modules,
};

@ -1,5 +1,7 @@
import { debug } from 'debug';
import { ethers } from 'ethers';
import fs from 'fs';
import path from 'path';
import {
DomainRoutingIsm__factory,
@ -7,6 +9,7 @@ import {
IInterchainSecurityModule__factory,
IMultisigIsm__factory,
IRoutingIsm__factory,
OPStackIsm__factory,
StaticAddressSetFactory,
StaticAggregationIsm__factory,
StaticThresholdAddressSetFactory,
@ -15,6 +18,7 @@ import {
import { Address, eqAddress, formatMessage, warn } from '@hyperlane-xyz/utils';
import { HyperlaneApp } from '../app/HyperlaneApp';
import { chainMetadata } from '../consts/chainMetadata';
import {
HyperlaneEnvironment,
hyperlaneEnvironments,
@ -29,9 +33,12 @@ import {
AggregationIsmConfig,
DeployedIsm,
IsmConfig,
IsmType,
ModuleType,
MultisigIsmConfig,
OpStackIsmConfig,
RoutingIsmConfig,
ismTypeToModuleType,
} from './types';
export class HyperlaneIsmFactory extends HyperlaneApp<FactoryFactories> {
@ -48,6 +55,7 @@ export class HyperlaneIsmFactory extends HyperlaneApp<FactoryFactories> {
if (!envAddresses) {
throw new Error(`No addresses found for ${env}`);
}
/// @ts-ignore
return HyperlaneIsmFactory.fromAddressesMap(envAddresses, multiProvider);
}
@ -82,33 +90,36 @@ export class HyperlaneIsmFactory extends HyperlaneApp<FactoryFactories> {
}
if (
config.type === ModuleType.MERKLE_ROOT_MULTISIG ||
config.type === ModuleType.MESSAGE_ID_MULTISIG
config.type === IsmType.MERKLE_ROOT_MULTISIG ||
config.type === IsmType.MESSAGE_ID_MULTISIG
) {
switch (config.type) {
case ModuleType.MERKLE_ROOT_MULTISIG:
case IsmType.MERKLE_ROOT_MULTISIG:
this.logger(
`Deploying Merkle Root Multisig ISM to ${chain} for verifying ${origin}`,
);
break;
case ModuleType.MESSAGE_ID_MULTISIG:
case IsmType.MESSAGE_ID_MULTISIG:
this.logger(
`Deploying Message ID Multisig ISM to ${chain} for verifying ${origin}`,
);
break;
}
contract = await this.deployMultisigIsm(chain, config);
} else if (config.type === ModuleType.ROUTING) {
} else if (config.type === IsmType.ROUTING) {
this.logger(
`Deploying Routing ISM to ${chain} for verifying ${Object.keys(
config.domains,
)}`,
);
contract = await this.deployRoutingIsm(chain, config);
} else if (config.type === ModuleType.AGGREGATION) {
} else if (config.type === IsmType.AGGREGATION) {
this.logger(`Deploying Aggregation ISM to ${chain}`);
contract = await this.deployAggregationIsm(chain, config, origin);
} else if (config.type === ModuleType.NULL) {
} else if (config.type === IsmType.OP_STACK) {
this.logger(`Deploying Op Stack ISM to ${chain} for verifying ${origin}`);
contract = await this.deployOpStackIsm(chain, config);
} else if (config.type === IsmType.TEST_ISM) {
this.logger(`Deploying Test ISM to ${chain}`);
contract = await this.multiProvider.handleDeploy(
chain,
@ -119,7 +130,7 @@ export class HyperlaneIsmFactory extends HyperlaneApp<FactoryFactories> {
throw new Error(`Unsupported ISM type`);
}
const moduleType = ModuleType[config.type];
const ismType = config.type;
if (!this.deployedIsms[chain]) {
this.deployedIsms[chain] = {};
}
@ -129,10 +140,10 @@ export class HyperlaneIsmFactory extends HyperlaneApp<FactoryFactories> {
if (!this.deployedIsms[chain][origin]) {
this.deployedIsms[chain][origin] = {};
}
this.deployedIsms[chain][origin][moduleType] = contract;
this.deployedIsms[chain][origin][ismType] = contract;
} else {
// otherwise store the entry directly
this.deployedIsms[chain][moduleType] = contract;
this.deployedIsms[chain][ismType] = contract;
}
return contract;
@ -141,7 +152,7 @@ export class HyperlaneIsmFactory extends HyperlaneApp<FactoryFactories> {
private async deployMultisigIsm(chain: ChainName, config: MultisigIsmConfig) {
const signer = this.multiProvider.getSigner(chain);
const multisigIsmFactory =
config.type === ModuleType.MERKLE_ROOT_MULTISIG
config.type === IsmType.MERKLE_ROOT_MULTISIG
? this.getContracts(chain).merkleRootMultisigIsmFactory
: this.getContracts(chain).messageIdMultisigIsmFactory;
@ -222,6 +233,23 @@ export class HyperlaneIsmFactory extends HyperlaneApp<FactoryFactories> {
return IAggregationIsm__factory.connect(address, signer);
}
private async deployOpStackIsm(chain: ChainName, config: OpStackIsmConfig) {
const recoveredIsm = getDeployedIsms(config.origin, chain, config.type);
if (recoveredIsm) {
this.logger('Recovered OpStackIsm from deployedIsms');
return OPStackIsm__factory.connect(
recoveredIsm,
this.multiProvider.getSignerOrProvider(chain),
);
} else {
return await this.multiProvider.handleDeploy(
chain,
new OPStackIsm__factory(),
[config.nativeBridge],
);
}
}
async deployStaticAddressSet(
chain: ChainName,
factory: StaticThresholdAddressSetFactory | StaticAddressSetFactory,
@ -338,17 +366,19 @@ export async function moduleCanCertainlyVerify(
} else {
// destModule is an IsmConfig
switch (destModule.type) {
case ModuleType.MERKLE_ROOT_MULTISIG:
case ModuleType.MESSAGE_ID_MULTISIG:
case IsmType.MERKLE_ROOT_MULTISIG:
case IsmType.MESSAGE_ID_MULTISIG:
return destModule.threshold > 0;
case ModuleType.ROUTING:
return moduleCanCertainlyVerify(
case IsmType.ROUTING: {
const checking = moduleCanCertainlyVerify(
destModule.domains[destination],
multiProvider,
origin,
destination,
);
case ModuleType.AGGREGATION: {
return checking;
}
case IsmType.AGGREGATION: {
let verified = 0;
for (const subModule of destModule.modules) {
const canVerify = await moduleCanCertainlyVerify(
@ -363,9 +393,13 @@ export async function moduleCanCertainlyVerify(
}
return verified >= destModule.threshold;
}
case ModuleType.NULL: {
case IsmType.OP_STACK:
return destModule.nativeBridge !== ethers.constants.AddressZero;
case IsmType.TEST_ISM: {
return true;
}
default:
throw new Error(`Unsupported module type: ${(destModule as any).type}`);
}
}
}
@ -394,10 +428,10 @@ export async function moduleMatchesConfig(
provider,
);
const actualType = await module.moduleType();
if (actualType !== config.type) return false;
if (actualType !== ismTypeToModuleType(config.type)) return false;
let matches = true;
switch (config.type) {
case ModuleType.MERKLE_ROOT_MULTISIG: {
case IsmType.MERKLE_ROOT_MULTISIG: {
// A MerkleRootMultisigIsm matches if validators and threshold match the config
const expectedAddress =
await contracts.merkleRootMultisigIsmFactory.getAddress(
@ -407,7 +441,7 @@ export async function moduleMatchesConfig(
matches = eqAddress(expectedAddress, module.address);
break;
}
case ModuleType.MESSAGE_ID_MULTISIG: {
case IsmType.MESSAGE_ID_MULTISIG: {
// A MessageIdMultisigIsm matches if validators and threshold match the config
const expectedAddress =
await contracts.messageIdMultisigIsmFactory.getAddress(
@ -417,7 +451,7 @@ export async function moduleMatchesConfig(
matches = eqAddress(expectedAddress, module.address);
break;
}
case ModuleType.ROUTING: {
case IsmType.ROUTING: {
// A RoutingIsm matches if:
// 1. The set of domains in the config equals those on-chain
// 2. The modules for each domain match the config
@ -447,7 +481,7 @@ export async function moduleMatchesConfig(
}
break;
}
case ModuleType.AGGREGATION: {
case IsmType.AGGREGATION: {
// An AggregationIsm matches if:
// 1. The threshold matches the config
// 2. There is a bijection between on and off-chain configured modules
@ -483,7 +517,14 @@ export async function moduleMatchesConfig(
}
break;
}
case ModuleType.NULL: {
case IsmType.OP_STACK: {
const opStackIsm = OPStackIsm__factory.connect(moduleAddress, provider);
const type = await opStackIsm.moduleType();
matches = matches && type === ModuleType.NULL;
matches = false;
break;
}
case IsmType.TEST_ISM: {
// This is just a TestISM
matches = true;
break;
@ -510,11 +551,11 @@ export function collectValidators(
let validators: string[] = [];
if (
config.type === ModuleType.MERKLE_ROOT_MULTISIG ||
config.type === ModuleType.MESSAGE_ID_MULTISIG
config.type === IsmType.MERKLE_ROOT_MULTISIG ||
config.type === IsmType.MESSAGE_ID_MULTISIG
) {
validators = config.validators;
} else if (config.type === ModuleType.ROUTING) {
} else if (config.type === IsmType.ROUTING) {
if (Object.keys(config.domains).includes(origin)) {
const domainValidators = collectValidators(
origin,
@ -522,14 +563,14 @@ export function collectValidators(
);
validators = [...domainValidators];
}
} else if (config.type === ModuleType.AGGREGATION) {
} else if (config.type === IsmType.AGGREGATION) {
const aggregatedValidators = config.modules.map((c) =>
collectValidators(origin, c),
);
aggregatedValidators.forEach((set) => {
validators = validators.concat([...set]);
});
} else if (config.type === ModuleType.NULL) {
} else if (config.type === IsmType.TEST_ISM) {
// This is just a TestISM
return new Set([]);
} else {
@ -538,3 +579,23 @@ export function collectValidators(
return new Set(validators);
}
// recover non-factory ISM deployments
export function getDeployedIsms(
origin: ChainName,
destination: ChainName,
ismType: string,
): Address | null {
// check if mainnet or testnet
const isTestnet =
chainMetadata[origin].isTestnet || chainMetadata[destination].isTestnet;
const file = isTestnet ? 'testnet.json' : 'mainnet.json';
const addresses = fs.readFileSync(
path.resolve(__dirname, `../consts/environments/${file}`),
);
const parsedAddresses = JSON.parse(addresses.toString());
if (ismType in parsedAddresses[destination][origin]) {
return parsedAddresses[destination][origin].opStackIsm;
}
return null;
}

@ -3,6 +3,7 @@ import {
IInterchainSecurityModule,
IMultisigIsm,
IRoutingIsm,
OPStackIsm,
StaticMerkleRootMultisigIsm,
StaticMessageIdMultisigIsm,
TestIsm,
@ -18,8 +19,11 @@ export type DeployedIsm =
| IRoutingIsm
| StaticMessageIdMultisigIsm
| StaticMerkleRootMultisigIsm
| OPStackIsm
| TestIsm;
// this enum should match the IInterchainSecurityModule.sol enum
// meant for the relayer
export enum ModuleType {
UNUSED,
ROUTING,
@ -30,34 +34,70 @@ export enum ModuleType {
NULL,
}
// this enum can be adjusted as per deployments necessary
// meant for the deployer and checker
export enum IsmType {
OP_STACK = 'opStackIsm',
ROUTING = 'domainRoutingIsm',
AGGREGATION = 'staticAggregationIsm',
MERKLE_ROOT_MULTISIG = 'merkleRootMultisigIsm',
MESSAGE_ID_MULTISIG = 'messageIdMultisigIsm',
TEST_ISM = 'testIsm',
}
// mapping betweent the two enums
export function ismTypeToModuleType(ismType: IsmType): ModuleType {
switch (ismType) {
case IsmType.OP_STACK:
return ModuleType.NULL;
case IsmType.ROUTING:
return ModuleType.ROUTING;
case IsmType.AGGREGATION:
return ModuleType.AGGREGATION;
case IsmType.MERKLE_ROOT_MULTISIG:
return ModuleType.MERKLE_ROOT_MULTISIG;
case IsmType.MESSAGE_ID_MULTISIG:
return ModuleType.MESSAGE_ID_MULTISIG;
case IsmType.TEST_ISM:
return ModuleType.NULL;
}
}
export type MultisigConfig = {
validators: Array<Address>;
threshold: number;
};
export type MultisigIsmConfig = MultisigConfig & {
type: ModuleType.MERKLE_ROOT_MULTISIG | ModuleType.MESSAGE_ID_MULTISIG;
type: IsmType.MERKLE_ROOT_MULTISIG | IsmType.MESSAGE_ID_MULTISIG;
};
export type TestIsmConfig = {
type: ModuleType.NULL;
type: IsmType.TEST_ISM;
};
export type RoutingIsmConfig = {
type: ModuleType.ROUTING;
type: IsmType.ROUTING;
owner: Address;
domains: ChainMap<IsmConfig>;
};
export type AggregationIsmConfig = {
type: ModuleType.AGGREGATION;
type: IsmType.AGGREGATION;
modules: Array<IsmConfig>;
threshold: number;
};
export type OpStackIsmConfig = {
type: IsmType.OP_STACK;
origin: Address;
nativeBridge: Address;
};
export type IsmConfig =
| Address
| RoutingIsmConfig
| MultisigIsmConfig
| AggregationIsmConfig
| OpStackIsmConfig
| TestIsmConfig;

@ -32,6 +32,7 @@ export class InterchainQuery extends RouterApp<InterchainQueryFactories> {
if (!envAddresses) {
throw new Error(`No addresses found for ${env}`);
}
/// @ts-ignore
return InterchainQuery.fromAddressesMap(envAddresses, multiProvider);
}

@ -14,7 +14,7 @@ import {
CoinGeckoSimplePriceParams,
} from '../gas/token-prices';
import { HookType } from '../hook/types';
import { ModuleType } from '../ism/types';
import { IsmType } from '../ism/types';
import { RouterConfig } from '../router/types';
import { ChainMap, ChainName } from '../types';
@ -51,7 +51,7 @@ export function testCoreConfig(
const chainConfig: CoreConfig = {
owner,
defaultIsm: {
type: ModuleType.NULL,
type: IsmType.TEST_ISM,
},
defaultHook: {
type: HookType.MERKLE_TREE,

Loading…
Cancel
Save