feat: deploy to zetachain and redstone (#3788)

### Description

- Deploys to zetachain and redstone
- Some learnings can be found in
https://discord.com/channels/935678348330434570/1240168332813144084

Chains not yet fully connected:
- inevm (Mailbox ownership situation makes this hard)
- mantapacific (waiting on an update to the multisig ownership set
there, then will create the tx)
- non-EVM chains

### Drive-by changes

- decreased ethereum cost from $2 to $1.5 following some feedback
- Added Superform to the blast set
- Allowed for concurrent deploys

I originally had some ugly caching to avoid checking storage gas oracles
so much (we check them for each route in a routing hook configuration),
but I've removed this. Calling it out for the future though
232695dd6c

### Related issues

<!--
- Fixes #[issue number here]
-->

### Backward compatibility

<!--
Are these changes backward compatible? Are there any infrastructure
implications, e.g. changes that would prohibit deploying older commits
using this infra tooling?

Yes/No
-->

### Testing

<!--
What kind of testing have these changes undergone?

None/Manual/Unit Tests
-->
pull/3840/head
Trevor Porter 6 months ago committed by GitHub
parent 27aabf238c
commit 37af3dc6ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 67
      .github/workflows/test.yml
  2. 183
      rust/config/mainnet_config.json
  3. 46
      typescript/infra/config/environments/mainnet3/agent.ts
  4. 6
      typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json
  5. 6
      typescript/infra/config/environments/mainnet3/aw-validators/rc.json
  6. 2
      typescript/infra/config/environments/mainnet3/chains.ts
  7. 2120
      typescript/infra/config/environments/mainnet3/core/verification.json
  8. 4
      typescript/infra/config/environments/mainnet3/funding.ts
  9. 10
      typescript/infra/config/environments/mainnet3/gasPrices.json
  10. 124
      typescript/infra/config/environments/mainnet3/ism/verification.json
  11. 1
      typescript/infra/config/environments/mainnet3/owners.ts
  12. 14
      typescript/infra/config/environments/mainnet3/supportedChainNames.ts
  13. 42
      typescript/infra/config/environments/mainnet3/tokenPrices.json
  14. 28
      typescript/infra/config/environments/mainnet3/validators.ts
  15. 7
      typescript/infra/scripts/agent-utils.ts
  16. 7
      typescript/infra/scripts/deploy.ts
  17. 4
      typescript/infra/src/config/gas-oracle.ts
  18. 7
      typescript/infra/src/deployment/deploy.ts
  19. 6
      typescript/infra/src/govern/HyperlaneAppGovernor.ts
  20. 17
      typescript/sdk/src/consts/multisigIsm.ts
  21. 6
      typescript/sdk/src/core/HyperlaneCoreDeployer.ts
  22. 29
      typescript/sdk/src/deploy/HyperlaneDeployer.ts
  23. 4
      typescript/sdk/src/deploy/verify/ContractVerifier.ts
  24. 16
      typescript/sdk/src/hook/HyperlaneHookDeployer.ts

@ -19,7 +19,8 @@ env:
LOG_FORMAT: PRETTY
CARGO_TERM_COLOR: always
RUST_BACKTRACE: full
REGISTRY_URI: ../../node_modules/@hyperlane-xyz/registry/dist
# Alongside the monorepo in the directory above the $GITHUB_WORKSPACE.
REGISTRY_URI: ${{ github.workspace }}/../hyperlane-registry
jobs:
yarn-install:
@ -81,6 +82,31 @@ jobs:
- name: build
run: yarn build
checkout-registry:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
repository: hyperlane-xyz/hyperlane-registry
ref: main
path: ./hyperlane-registry
# Put alongside the monorepo in the directory above the $GITHUB_WORKSPACE.
# actions/checkout doesn't allow you to checkout a repository outside of the workspace.
# See https://github.com/actions/checkout/issues/197.
- run: mv ./hyperlane-registry ../
# A workaround for relative paths not being supported by actions/cache.
# See https://github.com/actions/upload-artifact/issues/176#issuecomment-1367855630.
- run: echo "REGISTRY_URI_ABSOLUTE=$(realpath $REGISTRY_URI)" >> $GITHUB_ENV
- name: registry-cache
uses: actions/cache@v3
with:
path: |
${{ env.REGISTRY_URI_ABSOLUTE }}
key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }}
lint-prettier:
runs-on: ubuntu-latest
needs: [yarn-install]
@ -113,7 +139,7 @@ jobs:
yarn-test:
runs-on: ubuntu-latest
needs: [yarn-build]
needs: [yarn-build, checkout-registry]
steps:
- uses: actions/checkout@v3
with:
@ -132,12 +158,23 @@ jobs:
!./rust
key: ${{ github.event.pull_request.head.sha || github.sha }}
# A workaround for relative paths not being supported by actions/cache.
# See https://github.com/actions/upload-artifact/issues/176#issuecomment-1367855630.
- run: echo "REGISTRY_URI_ABSOLUTE=$(realpath $REGISTRY_URI)" >> $GITHUB_ENV
- name: registry-cache
uses: actions/cache@v3
with:
path: |
${{ env.REGISTRY_URI_ABSOLUTE }}
key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }}
- name: Unit Tests
run: yarn test:ci
agent-configs:
runs-on: ubuntu-latest
needs: [yarn-build]
needs: [yarn-build, checkout-registry]
strategy:
fail-fast: false
matrix:
@ -164,6 +201,17 @@ jobs:
!./rust
key: ${{ github.event.pull_request.head.sha || github.sha }}
# A workaround for relative paths not being supported by actions/cache.
# See https://github.com/actions/upload-artifact/issues/176#issuecomment-1367855630.
- run: echo "REGISTRY_URI_ABSOLUTE=$(realpath $REGISTRY_URI)" >> $GITHUB_ENV
- name: registry-cache
uses: actions/cache@v3
with:
path: |
${{ env.REGISTRY_URI_ABSOLUTE }}
key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }}
- name: Generate ${{ matrix.environment }} agent config
run: |
cd typescript/infra
@ -177,7 +225,7 @@ jobs:
e2e-matrix:
runs-on: larger-runner
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.base_ref == 'main')
needs: [yarn-build]
needs: [yarn-build, checkout-registry]
strategy:
matrix:
e2e-type: [cosmwasm, non-cosmwasm]
@ -230,6 +278,17 @@ jobs:
!./rust
key: ${{ github.event.pull_request.head.sha || github.sha }}
# A workaround for relative paths not being supported by actions/cache.
# See https://github.com/actions/upload-artifact/issues/176#issuecomment-1367855630.
- run: echo "REGISTRY_URI_ABSOLUTE=$(realpath $REGISTRY_URI)" >> $GITHUB_ENV
- name: registry-cache
uses: actions/cache@v3
with:
path: |
${{ env.REGISTRY_URI_ABSOLUTE }}
key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }}
- name: cargo-cache
uses: actions/cache@v3
with:

@ -1,6 +1,7 @@
{
"chains": {
"ancient8": {
"aggregationHook": "0x1EF4ED658d542524d1D547ba2F94d3B038a55b8f",
"batchContractAddress": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28",
"blockExplorers": [
{
@ -18,6 +19,7 @@
"chainId": 888888888,
"displayName": "Ancient8",
"domainId": 888888888,
"domainRoutingIsm": "0xB6F0f1267B01C27326F61a4B4fe2c73751802685",
"domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
"fallbackRoutingHook": "0x5E01d8F34b629E3f92d69546bbc4142A7Adee7e9",
"gasCurrencyCoinGeckoId": "ethereum",
@ -25,7 +27,7 @@
"from": 2507127
},
"interchainGasPaymaster": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA",
"interchainSecurityModule": "0x6E3387e12C6e181BF8e712eCa9c60ccEEaBD1c67",
"interchainSecurityModule": "0xBd3C7253F08c040eDB9c54e7CD4f8a5fd1eb935D",
"isTestnet": false,
"mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
"merkleTreeHook": "0x811808Dd29ba8B0FC6C0ec0b5537035E59745162",
@ -36,6 +38,7 @@
"symbol": "ETH"
},
"pausableHook": "0x66DC49405Ae2956f7E87FEAa9fE8f506C8987462",
"pausableIsm": "0xcf678903c003651DB0bb933820259A16ea9d95e4",
"protocol": "ethereum",
"protocolFee": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0",
"proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
@ -45,6 +48,7 @@
}
],
"staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
"staticAggregationIsm": "0xBd3C7253F08c040eDB9c54e7CD4f8a5fd1eb935D",
"staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
"staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC",
"staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
@ -71,6 +75,7 @@
"chainId": 42161,
"displayName": "Arbitrum",
"domainId": 42161,
"domainRoutingIsm": "0x5d759B5CeEb1C3b0181bEc0F80fb04f820cc35D1",
"domainRoutingIsmFactory": "0xa2931C37957f3079d3B21b877d56E1db930e02a5",
"fallbackRoutingHook": "0x9e8fFb1c26099e75Dd5D794030e2E9AA51471c25",
"gasCurrencyCoinGeckoId": "ethereum",
@ -81,7 +86,7 @@
"interchainAccountIsm": "0xfa8bfcE55B3A0631dF38257615cEF7FCD3523A48",
"interchainAccountRouter": "0xCD0CFFf6eFD943b4b81f2c15847730dbcD30e3aE",
"interchainGasPaymaster": "0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22",
"interchainSecurityModule": "0xD0DBBF922076352cC50B285A0023536561F00EEa",
"interchainSecurityModule": "0x96845a0469363f90779f6D5cd49D79bDDAc69429",
"mailbox": "0x979Ca5202784112f4738403dBec5D0F3B9daabB9",
"merkleTreeHook": "0x748040afB89B8FdBb992799808215419d36A0930",
"name": "arbitrum",
@ -91,15 +96,23 @@
"symbol": "ETH"
},
"pausableHook": "0xEf30f29Dcd3FCB1DCcDA9C7Cbf2A5957E8Ee9Cc3",
"pausableIsm": "0x1E38556b4fE553e6249448960875883990efcf34",
"protocol": "ethereum",
"protocolFee": "0xD0199067DACb8526e7dc524a9a7DCBb57Cd25421",
"proxyAdmin": "0x80Cebd56A65e46c474a1A101e89E76C4c51D179c",
"rpcUrls": [
{
"http": "https://arbitrum.llamarpc.com"
},
{
"http": "https://rpc.ankr.com/arbitrum"
},
{
"http": "https://arb1.arbitrum.io/rpc"
}
],
"staticAggregationHookFactory": "0x9B5f440bBb64Fee337F37e03362b628711Ea09C7",
"staticAggregationIsm": "0x96845a0469363f90779f6D5cd49D79bDDAc69429",
"staticAggregationIsmFactory": "0xD4883084389fC1Eeb4dAfB2ADcFc36B711c310EB",
"staticMerkleRootMultisigIsmFactory": "0x3C330D4A2e2b8443AFaB8E326E64ab4251B7Eae0",
"staticMessageIdMultisigIsmFactory": "0x12Df53079d399a47e9E730df095b712B0FDFA791",
@ -128,6 +141,7 @@
"chainId": 43114,
"displayName": "Avalanche",
"domainId": 43114,
"domainRoutingIsm": "0x9f68F961ba2dF53b1cB3EbCC0b08e89790C6E2f6",
"domainRoutingIsmFactory": "0x28F7907911C7E321c596686AE6D1F20516450037",
"fallbackRoutingHook": "0x61D15D571D5f7A9eF0D1938f072f430bBF024747",
"gasCurrencyCoinGeckoId": "avalanche-2",
@ -138,7 +152,7 @@
"interchainAccountIsm": "0x786c26C1857032617c215f265509d6E44e44Bfe3",
"interchainAccountRouter": "0xA967A6CE0e73fAf672843DECaA372511996E8852",
"interchainGasPaymaster": "0x95519ba800BBd0d34eeAE026fEc620AD978176C0",
"interchainSecurityModule": "0xA36B02a83564f52d9244310Ea439ee6F6AfeFb60",
"interchainSecurityModule": "0xe7a61510EA7197281b49e5bdf1798608d5132595",
"mailbox": "0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6",
"merkleTreeHook": "0x84eea61D679F42D92145fA052C89900CBAccE95A",
"name": "avalanche",
@ -148,10 +162,14 @@
"symbol": "AVAX"
},
"pausableHook": "0x239eB860770F1C48ABAC9bE9825d20e3E7c018df",
"pausableIsm": "0xd76080269C641e1adb786b72ae60Ddac3b6b8ed0",
"protocol": "ethereum",
"protocolFee": "0xEc4AdA26E51f2685279F37C8aE62BeAd8212D597",
"proxyAdmin": "0xd7CF8c05fd81b8cA7CfF8E6C49B08a9D63265c9B",
"rpcUrls": [
{
"http": "https://rpc.ankr.com/avalanche"
},
{
"http": "https://api.avax.network/ext/bc/C/rpc",
"pagination": {
@ -161,6 +179,7 @@
}
],
"staticAggregationHookFactory": "0x3bF6Ac986C7Af9A9Ac356C0e99C0041EFd8D96e7",
"staticAggregationIsm": "0xe7a61510EA7197281b49e5bdf1798608d5132595",
"staticAggregationIsmFactory": "0xa5E13796eB7d2EDCc88012c8cfF90D69B51FcF9f",
"staticMerkleRootMultisigIsmFactory": "0x896cF1D1B66cD211633eDd589fF158E8Cfaf9B54",
"staticMessageIdMultisigIsmFactory": "0x8819D653DF5b1FC0DdB32189a2704E471AF8483c",
@ -188,6 +207,7 @@
"chainId": 8453,
"displayName": "Base",
"domainId": 8453,
"domainRoutingIsm": "0x80C8F6394c0FcF7bAB16ac08b85484361eCe5888",
"domainRoutingIsmFactory": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503",
"fallbackRoutingHook": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2",
"gasCurrencyCoinGeckoId": "ethereum",
@ -198,7 +218,7 @@
"interchainAccountIsm": "0x861908E6c8F992537F557da5Fb5876836036b347",
"interchainAccountRouter": "0xa85F9e4fdA2FFF1c07f2726a630443af3faDF830",
"interchainGasPaymaster": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94",
"interchainSecurityModule": "0x5D1e7D7c5B9e6dDC8439F67F10c578f2A1084f6F",
"interchainSecurityModule": "0x77bE0b5aE400675063Ce2B2B0d692D9341f4b193",
"mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D",
"merkleTreeHook": "0x19dc38aeae620380430C200a6E990D5Af5480117",
"name": "base",
@ -208,6 +228,7 @@
"symbol": "ETH"
},
"pausableHook": "0x46fa3A5780e5B90Eaf34BDED554d5353B5ABE9E7",
"pausableIsm": "0x2AF32cF8e3Cf42d221eDa0c843818fA5ee129E27",
"protocol": "ethereum",
"protocolFee": "0x99ca8c74cE7Cfa9d72A51fbb05F9821f5f826b3a",
"proxyAdmin": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1",
@ -223,14 +244,17 @@
}
],
"staticAggregationHookFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
"staticAggregationIsm": "0x77bE0b5aE400675063Ce2B2B0d692D9341f4b193",
"staticAggregationIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
"staticMerkleRootMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
"staticMessageIdMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
"storageGasOracle": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2",
"testRecipient": "0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03",
"timelockController": "0x0000000000000000000000000000000000000000",
"validatorAnnounce": "0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B"
},
"blast": {
"aggregationHook": "0x012278333Ce0A845AE9bD7302867a59Bd5D3635d",
"blockExplorers": [
{
"apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/81457/etherscan/api",
@ -247,6 +271,7 @@
"chainId": 81457,
"displayName": "Blast",
"domainId": 81457,
"domainRoutingIsm": "0x0296D16d371a49F631143612020138896b3eA421",
"domainRoutingIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
"fallbackRoutingHook": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa",
"gasCurrencyCoinGeckoId": "ethereum",
@ -254,7 +279,7 @@
"from": 2496427
},
"interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9",
"interchainSecurityModule": "0x0986f6D82A47045788b0ce8EF68f6C0D77726854",
"interchainSecurityModule": "0x208263bB303B2a737642fB13C765F106a2591be8",
"mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7",
"merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
"name": "blast",
@ -264,6 +289,7 @@
"symbol": "ETH"
},
"pausableHook": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0",
"pausableIsm": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28",
"protocol": "ethereum",
"protocolFee": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0",
"proxyAdmin": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D",
@ -273,6 +299,7 @@
}
],
"staticAggregationHookFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1",
"staticAggregationIsm": "0x208263bB303B2a737642fB13C765F106a2591be8",
"staticAggregationIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
"staticMerkleRootMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
"staticMessageIdMultisigIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
@ -300,6 +327,7 @@
"displayName": "Binance Smart Chain",
"displayNameShort": "Binance",
"domainId": 56,
"domainRoutingIsm": "0xBc3Af0D4930502Ff0f6a8416a7a184c7BFFe19E7",
"domainRoutingIsmFactory": "0xe6Af5720d34213C805C08e2470aea979e3F72F75",
"fallbackRoutingHook": "0x237E81f87F57Badad9e09f13CC676D986cA852e7",
"gasCurrencyCoinGeckoId": "binancecoin",
@ -310,7 +338,7 @@
"interchainAccountIsm": "0xB274Bbbc1df5f1d1763216A93d473fde6f5de043",
"interchainAccountRouter": "0x4BBd67dC995572b40Dc6B3eB6CdE5185a5373868",
"interchainGasPaymaster": "0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451",
"interchainSecurityModule": "0xab3df354baBee6c2B88E2CeD3b2e030e31aA5e61",
"interchainSecurityModule": "0xfA360ff588623A026BF19A1801F2A8F1f045fa33",
"mailbox": "0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4",
"merkleTreeHook": "0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26",
"name": "bsc",
@ -320,6 +348,7 @@
"symbol": "BNB"
},
"pausableHook": "0x7DBdAd1b4A922B65d37d7258a4227b6658344b7f",
"pausableIsm": "0x25dB01caDf91CfD2f7e6dD829Ce81698217F9151",
"protocol": "ethereum",
"protocolFee": "0xA8Aa5f14a5463a78E45CC068F11c867949F3E367",
"proxyAdmin": "0x65993Af9D0D3a64ec77590db7ba362D6eB78eF70",
@ -335,6 +364,7 @@
}
],
"staticAggregationHookFactory": "0xe70E86a7D1e001D419D71F960Cb6CaD59b6A3dB6",
"staticAggregationIsm": "0xfA360ff588623A026BF19A1801F2A8F1f045fa33",
"staticAggregationIsmFactory": "0x38B3878c4fb44d201DA924c4a04bae3EE728c065",
"staticMerkleRootMultisigIsmFactory": "0xfADBc81Ca8A957F1Bf7c78bCc575b28DBDE042b6",
"staticMessageIdMultisigIsmFactory": "0x4B1d8352E35e3BDE36dF5ED2e73C24E35c4a96b7",
@ -374,14 +404,14 @@
"domainRoutingIsm": "0xf18E32428dad0802C5D6F723cB80A6Da889777c4",
"domainRoutingIsmFactory": "0x2A2c22B0a8615ad24839fA6Af302E896Af32d1a3",
"fallbackRoutingHook": "0xDC98a856fb9112894c2fE32267DA8bF35645FAF3",
"gnosisSafeTransactionServiceUrl": "https://mainnet-tx-svc.celo-safe-prod.celo-networks-dev.org/",
"gnosisSafeTransactionServiceUrl": "https://safe-transaction-celo.safe.global/",
"index": {
"from": 22102340
},
"interchainAccountIsm": "0x30a8DEc5318e2aAa9ad5b069fC606c4CfF6f5676",
"interchainAccountRouter": "0x4ED23E3885e1651E62564F78817D91865beba575",
"interchainGasPaymaster": "0x571f1435613381208477ac5d6974310d88AC7cB7",
"interchainSecurityModule": "0x99e8E56Dce3402D6E09A82718937fc1cA2A9491E",
"interchainSecurityModule": "0x0dcb01D4ABfa73fadB17C4B0e8cd52A38BD52c66",
"mailbox": "0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb",
"merkleTreeHook": "0x04dB778f05854f26E67e0a66b740BBbE9070D366",
"name": "celo",
@ -435,8 +465,10 @@
"chainId": 1,
"displayName": "Ethereum",
"domainId": 1,
"domainRoutingIsm": "0xBA328338044e0C0AFd0591FB6E5e2F83C4e8F742",
"domainRoutingIsmFactory": "0x28fA9552F19039b450498B0d8e5DEAe0d0aAc559",
"fallbackRoutingHook": "0x571f1435613381208477ac5d6974310d88AC7cB7",
"gasCurrencyCoinGeckoId": "ethereum",
"gnosisSafeTransactionServiceUrl": "https://safe-transaction-mainnet.safe.global/",
"index": {
"from": 18422581
@ -444,7 +476,7 @@
"interchainAccountIsm": "0x609707355a53d2aAb6366f48E2b607C599D26B29",
"interchainAccountRouter": "0x8dBae9B1616c46A20591fE0006Bf015E28ca5cC9",
"interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611",
"interchainSecurityModule": "0xB42b88243F749F47697F01Ae1cbBCA9d4763902a",
"interchainSecurityModule": "0x8CE0c6cAf18DbF5882b35F26E28412f3E9AbDeca",
"mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239",
"merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA",
"name": "ethereum",
@ -454,6 +486,7 @@
"symbol": "ETH"
},
"pausableHook": "0x3A66Dc852e56d3748838b3C27CF381105b83705b",
"pausableIsm": "0xDC98a856fb9112894c2fE32267DA8bF35645FAF3",
"protocol": "ethereum",
"protocolFee": "0x8B05BF30F6247a90006c5837eA63C7905D79e6d8",
"proxyAdmin": "0x75EE15Ee1B4A75Fa3e2fDF5DF3253c25599cc659",
@ -466,6 +499,7 @@
}
],
"staticAggregationHookFactory": "0x6D2555A8ba483CcF4409C39013F5e9a3285D3C9E",
"staticAggregationIsm": "0x5447cdC0f4B1Afd827BF9d2F6b6cE7668d5dc284",
"staticAggregationIsmFactory": "0x46FA191Ad972D9674Ed752B69f9659A0d7b22846",
"staticMerkleRootMultisigIsmFactory": "0x47e8aF9e30C32Ab91060ED587894288786761B45",
"staticMessageIdMultisigIsmFactory": "0xfA21D9628ADce86531854C2B7ef00F07394B0B69",
@ -497,6 +531,7 @@
"chainId": 100,
"displayName": "Gnosis",
"domainId": 100,
"domainRoutingIsm": "0x83873DB8B4982091D0781B4eDF108DCb98075C39",
"domainRoutingIsmFactory": "0xbB5Df000113e767dE11343A16f83De733e5bCC0F",
"fallbackRoutingHook": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c",
"gasCurrencyCoinGeckoId": "xdai",
@ -507,7 +542,7 @@
"interchainAccountIsm": "0x5a56dff3D92D635372718f86e6dF09C1129CFf53",
"interchainAccountRouter": "0x5E59EBAedeB691408EBAcF6C37218fa2cFcaC9f2",
"interchainGasPaymaster": "0xDd260B99d302f0A3fF885728c086f729c06f227f",
"interchainSecurityModule": "0x8e1aa0687B6d939D5a44304D13B7c922ebB012f1",
"interchainSecurityModule": "0x5DB7edF8C1CF91e34895dB2e4b28d8b9C68ddC7B",
"mailbox": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f",
"merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645",
"name": "gnosis",
@ -517,6 +552,7 @@
"symbol": "xDai"
},
"pausableHook": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6",
"pausableIsm": "0x223F7D3f27E6272266AE4B5B91Fd5C7A2d798cD8",
"protocol": "ethereum",
"protocolFee": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88",
"proxyAdmin": "0x81a92A1a272cb09d7b4970b07548463dC7aE0cB7",
@ -530,6 +566,7 @@
}
],
"staticAggregationHookFactory": "0xbC8AA096dabDf4A0200BB9f8D4Cbb644C3D86d7B",
"staticAggregationIsm": "0xe640167B9a283C8b4039fA33f3ac7be6e7E788c5",
"staticAggregationIsmFactory": "0x11EF91d17c5ad3330DbCa709a8841743d3Af6819",
"staticMerkleRootMultisigIsmFactory": "0x8E273260EAd8B72A085B19346A676d355740e875",
"staticMessageIdMultisigIsmFactory": "0x603f46cc520d2fc22957b81e206408590808F02F",
@ -567,7 +604,7 @@
"interchainAccountIsm": "0x31894E7a734540B343d67E491148EB4FC9f7A45B",
"interchainAccountRouter": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd",
"interchainGasPaymaster": "0x19dc38aeae620380430C200a6E990D5Af5480117",
"interchainSecurityModule": "0x3052aD50De54aAAc5D364d80bBE681d29e924597",
"interchainSecurityModule": "0x440f7AD246F3e75df88a6338E8A33e91DA4B2B05",
"mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
"merkleTreeHook": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65",
"name": "inevm",
@ -652,6 +689,7 @@
"domainRoutingIsmFactory": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147",
"fallbackRoutingHook": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807",
"gasCurrencyCoinGeckoId": "ethereum",
"gnosisSafeTransactionServiceUrl": "https://transaction.safe.manta.network",
"index": {
"from": 437300
},
@ -943,6 +981,7 @@
"chainId": 137,
"displayName": "Polygon",
"domainId": 137,
"domainRoutingIsm": "0xBcb9d74E1D2549fc1939023433aaAB11587bc338",
"domainRoutingIsmFactory": "0x0d0E816eE4557689d34fAd5885C53b9393C1D9fA",
"fallbackRoutingHook": "0xca4cCe24E7e06241846F5EA0cda9947F0507C40C",
"gasCurrencyCoinGeckoId": "matic-network",
@ -953,7 +992,7 @@
"interchainAccountIsm": "0x90384bC552e3C48af51Ef7D9473A9bF87431f5c7",
"interchainAccountRouter": "0x5e80f3474825B61183c0F0f0726796F589082420",
"interchainGasPaymaster": "0x0071740Bf129b05C4684abfbBeD248D80971cce2",
"interchainSecurityModule": "0x9a795fB62f86146ec06e2377e3C95Af65c7C20eB",
"interchainSecurityModule": "0xe289bD204Dbb4F3aaFA27Dbe5751C71e101CFD80",
"mailbox": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB",
"merkleTreeHook": "0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6",
"name": "polygon",
@ -963,6 +1002,7 @@
"symbol": "ETH"
},
"pausableHook": "0x748040afB89B8FdBb992799808215419d36A0930",
"pausableIsm": "0x6741e91fFDC31c7786E3684427c628dad06299B0",
"protocol": "ethereum",
"protocolFee": "0xF8F3629e308b4758F8396606405989F8D8C9c578",
"proxyAdmin": "0xC4F7590C5d30BE959225dC75640657954A86b980",
@ -978,6 +1018,7 @@
}
],
"staticAggregationHookFactory": "0xFeeB86e70e4a640cDd29636CCE19BD6fe8628135",
"staticAggregationIsm": "0xe289bD204Dbb4F3aaFA27Dbe5751C71e101CFD80",
"staticAggregationIsmFactory": "0x81AdDD9Ca89105063DaDEBd5B4408551Ce850E22",
"staticMerkleRootMultisigIsmFactory": "0xa9E0E18E78b098c2DE36c42E4DDEA13ce214c592",
"staticMessageIdMultisigIsmFactory": "0xEa5Be2AD66BB1BA321B7aCf0A079fBE304B09Ca0",
@ -986,7 +1027,7 @@
"testTokenRecipient": "0x85ac1164878e017b67660a74ff1f41f3D05C02Bb",
"timelockController": "0x0000000000000000000000000000000000000000",
"transactionOverrides": {
"maxFeePerGas": 800000000000,
"maxFeePerGas": 550000000000,
"maxPriorityFeePerGas": 50000000000
},
"validatorAnnounce": "0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5"
@ -1013,6 +1054,7 @@
"domainRoutingIsmFactory": "0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d",
"fallbackRoutingHook": "0x01aE937A7B05d187bBCBE80F44F41879D3D335a4",
"gasCurrencyCoinGeckoId": "ethereum",
"gnosisSafeTransactionServiceUrl": "https://safe-transaction-zkevm.safe.global/",
"index": {
"from": 6577743
},
@ -1048,6 +1090,56 @@
"timelockController": "0x0000000000000000000000000000000000000000",
"validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9"
},
"redstone": {
"blockExplorers": [
{
"apiUrl": "https://explorer.redstone.xyz/api",
"family": "blockscout",
"name": "Redstone Explorer",
"url": "https://explorer.redstone.xyz"
}
],
"blocks": {
"confirmations": 1,
"estimateBlockTime": 2,
"reorgPeriod": 0
},
"chainId": 690,
"displayName": "Redstone",
"domainId": 690,
"domainRoutingIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
"fallbackRoutingHook": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882",
"gasCurrencyCoinGeckoId": "ethereum",
"index": {
"from": 1797579
},
"interchainGasPaymaster": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634",
"interchainSecurityModule": "0xF4689C7fA4920C91a6EEEd59630C9C8da7a77D40",
"mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D",
"merkleTreeHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA",
"name": "redstone",
"nativeToken": {
"decimals": 18,
"name": "Ether",
"symbol": "ETH"
},
"pausableHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
"protocol": "ethereum",
"protocolFee": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4",
"proxyAdmin": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1",
"rpcUrls": [
{
"http": "https://rpc.redstonechain.com"
}
],
"staticAggregationHookFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
"staticAggregationIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
"staticMerkleRootMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
"staticMessageIdMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
"storageGasOracle": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa",
"testRecipient": "0x1Ab68dC4f7b6cfcd00218D4b761b7F3b5a724555",
"validatorAnnounce": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0"
},
"scroll": {
"aggregationHook": "0x9Bc0FAf446E128a618A88a2F28960Fb2Ca169faE",
"blockExplorers": [
@ -1069,6 +1161,7 @@
"domainRoutingIsmFactory": "0xe03dad16074BC5EEA9A9311257BF02Eb0B6AAA2b",
"fallbackRoutingHook": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762",
"gasCurrencyCoinGeckoId": "ethereum",
"gnosisSafeTransactionServiceUrl": "https://transaction.safe.scroll.xyz",
"index": {
"chunk": 999,
"from": 271840
@ -1106,6 +1199,7 @@
"validatorAnnounce": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638"
},
"viction": {
"aggregationHook": "0x5c7890FAf9c99dC55926F00d624D7Bc6D7ac6834",
"blockExplorers": [
{
"apiUrl": "https://www.vicscan.xyz/api",
@ -1122,7 +1216,9 @@
"chainId": 88,
"displayName": "Viction",
"domainId": 88,
"domainRoutingIsm": "0x477145b11E1a71fEb658d96A0E27F19495121504",
"domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
"fallbackRoutingHook": "0x5d69BC38eF3eDb491c0b7186BEc4eC45c4013f93",
"gasCurrencyCoinGeckoId": "tomochain",
"index": {
"chunk": 999,
@ -1131,7 +1227,7 @@
"interchainAccountIsm": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807",
"interchainAccountRouter": "0x1956848601549de5aa0c887892061fA5aB4f6fC4",
"interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4",
"interchainSecurityModule": "0xBD70Ea9D599a0FC8158B026797177773C3445730",
"interchainSecurityModule": "0xf8F3AF5F6B8f319364c339c0b8cA5975481901eD",
"mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
"merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112",
"name": "viction",
@ -1140,6 +1236,8 @@
"name": "Viction",
"symbol": "VIC"
},
"pausableHook": "0xDab56C5A1EffFdd23f6BD1243E457B1575984Bc6",
"pausableIsm": "0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8",
"protocol": "ethereum",
"protocolFee": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638",
"proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
@ -1152,6 +1250,7 @@
}
],
"staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
"staticAggregationIsm": "0x60586f0b79426f8F406C807a59c7b6478e8bBa0C",
"staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
"staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC",
"staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
@ -1160,6 +1259,62 @@
"testTokenRecipient": "0xe042D1fbDf59828dd16b9649Ede7abFc856F7a6c",
"timelockController": "0x0000000000000000000000000000000000000000",
"validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9"
},
"zetachain": {
"blockExplorers": [
{
"apiUrl": "https://explorer.zetachain.com",
"family": "other",
"name": "ZetaScan",
"url": "https://explorer.zetachain.com"
}
],
"blocks": {
"confirmations": 1,
"estimateBlockTime": 6,
"reorgPeriod": 0
},
"chainId": 7000,
"displayName": "ZetaChain",
"domainId": 7000,
"domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
"fallbackRoutingHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA",
"gasCurrencyCoinGeckoId": "zetachain",
"index": {
"from": 3068132
},
"interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d",
"interchainSecurityModule": "0x8dfE6790DbB2Ecc1bEdb0eECfc1Ff467Ae5d8C89",
"mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
"merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6",
"name": "zetachain",
"nativeToken": {
"decimals": 18,
"name": "ZetaChain",
"symbol": "ZETA"
},
"pausableHook": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882",
"protocol": "ethereum",
"protocolFee": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4",
"proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
"rpcUrls": [
{
"http": "https://zetachain-evm.blockpi.network/v1/rpc/public"
},
{
"http": "https://zetachain-athens-evm.blockpi.network/v1/rpc/public"
},
{
"http": "https://zetachain-mainnet-archive.allthatnode.com:8545"
}
],
"staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
"staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
"staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC",
"staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
"storageGasOracle": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
"testRecipient": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0",
"validatorAnnounce": "0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2"
}
},
"defaultRpcConsensusType": "fallback"

@ -53,18 +53,20 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = {
bsc: true,
celo: true,
ethereum: true,
neutron: true,
gnosis: true,
injective: true,
inevm: true,
mantapacific: true,
mode: true,
moonbeam: true,
neutron: true,
optimism: true,
polygon: true,
gnosis: true,
scroll: true,
polygonzkevm: true,
injective: true,
inevm: true,
redstone: true,
scroll: true,
viction: true,
zetachain: true,
},
[Role.Relayer]: {
arbitrum: true,
@ -75,19 +77,21 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = {
bsc: true,
celo: true,
ethereum: true,
// At the moment, we only relay between Neutron and Manta Pacific on the neutron context.
neutron: false,
gnosis: true,
injective: true,
inevm: true,
mantapacific: true,
mode: true,
moonbeam: true,
// At the moment, we only relay between Neutron and Manta Pacific on the neutron context.
neutron: false,
optimism: true,
polygon: true,
gnosis: true,
scroll: true,
polygonzkevm: true,
injective: true,
inevm: true,
redstone: true,
scroll: true,
viction: true,
zetachain: true,
},
[Role.Scraper]: {
arbitrum: true,
@ -98,21 +102,23 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = {
bsc: true,
celo: true,
ethereum: true,
gnosis: true,
// Cannot scrape non-EVM chains
neutron: false,
injective: false,
inevm: true,
mantapacific: true,
mode: true,
moonbeam: true,
// Cannot scrape non-EVM chains
neutron: false,
optimism: true,
polygon: true,
gnosis: true,
scroll: true,
polygonzkevm: true,
// Cannot scrape non-EVM chains
injective: false,
inevm: true,
redstone: true,
scroll: true,
// Has RPC non-compliance that breaks scraping.
viction: false,
zetachain: true,
},
};
@ -203,7 +209,7 @@ const hyperlane: RootAgentConfig = {
rpcConsensusType: RpcConsensusType.Fallback,
docker: {
repo,
tag: 'c9c5d37-20240510-014327',
tag: 'd6bb976-20240520-164138',
},
gasPaymentEnforcement: gasPaymentEnforcement,
metricAppContexts,
@ -211,7 +217,7 @@ const hyperlane: RootAgentConfig = {
validators: {
docker: {
repo,
tag: 'c9c5d37-20240510-014327',
tag: 'de8c2a7-20240515-135254',
},
rpcConsensusType: RpcConsensusType.Quorum,
chains: validatorChainConfig(Contexts.Hyperlane),
@ -220,7 +226,7 @@ const hyperlane: RootAgentConfig = {
rpcConsensusType: RpcConsensusType.Fallback,
docker: {
repo,
tag: 'c9c5d37-20240510-014327',
tag: 'd6bb976-20240520-164138',
},
},
};

@ -109,6 +109,9 @@
"0x6a1da2e0b7ae26aaece1377c0a4dbe25b85fa3ca"
]
},
"redstone": {
"validators": ["0x1400b9737007f7978d8b4bbafb4a69c83f0641a7"]
},
"scroll": {
"validators": [
"0xad557170a9f2f21c35e03de07cb30dcbcc3dff63",
@ -118,5 +121,8 @@
},
"viction": {
"validators": ["0x1f87c368f8e05a85ef9126d984a980a20930cb9c"]
},
"zetachain": {
"validators": ["0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef"]
}
}

@ -106,6 +106,9 @@
"0x1cd73544c000fd519784f56e59bc380a5fef53d6"
]
},
"redstone": {
"validators": ["0x51ed7127c0afc0513a0f141e910c5e02b2a9a4b5"]
},
"scroll": {
"validators": [
"0x11387d89856219cf685f22781bf4e85e00468d54",
@ -119,5 +122,8 @@
"0xad94659e2383214e4a1c4e8d3c17caffb75bc31b",
"0x0f9e5775ac4d3b73dd28e5a3f8394443186cb70c"
]
},
"zetachain": {
"validators": ["0xa13d146b47242671466e4041f5fe68d22a2ffe09"]
}
}

@ -30,7 +30,7 @@ export const ethereumMainnetConfigs: ChainMap<ChainMetadata> = {
transactionOverrides: {
// A very high max fee per gas is used as Polygon is susceptible
// to large swings in gas prices.
maxFeePerGas: 800 * 10 ** 9, // 800 gwei
maxFeePerGas: 550 * 10 ** 9, // 550 gwei
maxPriorityFeePerGas: 50 * 10 ** 9, // 50 gwei
},
},

@ -9,7 +9,7 @@ import { environment } from './chains.js';
export const keyFunderConfig: KeyFunderConfig = {
docker: {
repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo',
tag: '5d1391c-20240418-100607',
tag: '375ec39-20240520-160456',
},
// We're currently using the same deployer/key funder key as mainnet2.
// To minimize nonce clobbering we offset the key funder cron
@ -44,6 +44,8 @@ export const keyFunderConfig: KeyFunderConfig = {
polygonzkevm: '0.5',
scroll: '0.5',
ancient8: '0.5',
redstone: '0.2',
zetachain: '20',
},
desiredKathyBalancePerChain: {
arbitrum: '0.1',

@ -28,7 +28,7 @@
"decimals": 9
},
"ethereum": {
"amount": "26.346912847",
"amount": "20",
"decimals": 9
},
"mantapacific": {
@ -63,6 +63,10 @@
"amount": "3.95",
"decimals": 9
},
"redstone": {
"amount": "0.0003",
"decimals": 9
},
"inevm": {
"amount": "0.1",
"decimals": 9
@ -78,5 +82,9 @@
"injective": {
"amount": "700000000",
"decimals": 1
},
"zetachain": {
"amount": "0.0001",
"decimals": 9
}
}

@ -3043,6 +3043,68 @@
"name": "DomaingRoutingIsm"
}
],
"redstone": [
{
"address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
"constructorArguments": "",
"isProxy": false,
"name": "StaticMerkleRootMultisigIsmFactory"
},
{
"address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F",
"constructorArguments": "",
"isProxy": true,
"name": "StaticMerkleRootMultisigIsm"
},
{
"address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
"constructorArguments": "",
"isProxy": false,
"name": "StaticMessageIdMultisigIsmFactory"
},
{
"address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2",
"constructorArguments": "",
"isProxy": true,
"name": "StaticMessageIdMultisigIsm"
},
{
"address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
"constructorArguments": "",
"isProxy": false,
"name": "StaticAggregationIsmFactory"
},
{
"address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0",
"constructorArguments": "",
"isProxy": true,
"name": "StaticAggregationIsm"
},
{
"address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
"constructorArguments": "",
"isProxy": false,
"name": "StaticAggregationHookFactory"
},
{
"address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874",
"constructorArguments": "",
"isProxy": true,
"name": "StaticAggregationHook"
},
{
"address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
"constructorArguments": "",
"isProxy": false,
"name": "DomainRoutingIsmFactory"
},
{
"address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7",
"constructorArguments": "",
"isProxy": true,
"name": "DomaingRoutingIsm"
}
],
"scroll": [
{
"address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC",
@ -3352,5 +3414,67 @@
"isProxy": true,
"name": "DomaingRoutingIsm"
}
],
"zetachain": [
{
"address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC",
"constructorArguments": "",
"isProxy": false,
"name": "StaticMerkleRootMultisigIsmFactory"
},
{
"address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc",
"constructorArguments": "",
"isProxy": true,
"name": "StaticMerkleRootMultisigIsm"
},
{
"address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
"constructorArguments": "",
"isProxy": false,
"name": "StaticMessageIdMultisigIsmFactory"
},
{
"address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F",
"constructorArguments": "",
"isProxy": true,
"name": "StaticMessageIdMultisigIsm"
},
{
"address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
"constructorArguments": "",
"isProxy": false,
"name": "StaticAggregationIsmFactory"
},
{
"address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2",
"constructorArguments": "",
"isProxy": true,
"name": "StaticAggregationIsm"
},
{
"address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
"constructorArguments": "",
"isProxy": false,
"name": "StaticAggregationHookFactory"
},
{
"address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0",
"constructorArguments": "",
"isProxy": true,
"name": "StaticAggregationHook"
},
{
"address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
"constructorArguments": "",
"isProxy": false,
"name": "DomainRoutingIsmFactory"
},
{
"address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874",
"constructorArguments": "",
"isProxy": true,
"name": "DomaingRoutingIsm"
}
]
}

@ -55,6 +55,7 @@ export const owners: ChainMap<OwnableConfig> = Object.fromEntries(
proxyAdmin: timelocks[local] ?? safes[local] ?? DEPLOYER,
validatorAnnounce: DEPLOYER, // unused
testRecipient: DEPLOYER,
fallbackRoutingHook: DEPLOYER,
},
},
]),

@ -4,21 +4,23 @@ export const supportedChainNames = [
'arbitrum',
'ancient8',
'avalanche',
'base',
'blast',
'bsc',
'celo',
'ethereum',
'neutron',
'gnosis',
'inevm',
'injective',
'mantapacific',
'mode',
'moonbeam',
'neutron',
'optimism',
'polygon',
'gnosis',
'base',
'scroll',
'polygonzkevm',
'injective',
'inevm',
'redstone',
'scroll',
'viction',
'zetachain',
];

@ -1,22 +1,24 @@
{
"arbitrum": "3174.87",
"ancient8": "3174.87",
"avalanche": "38.39",
"base": "3174.87",
"blast": "3174.87",
"bsc": "609.32",
"celo": "0.860923",
"ethereum": "3174.87",
"mantapacific": "3174.87",
"mode": "3174.87",
"moonbeam": "0.338118",
"optimism": "3174.87",
"polygon": "0.730041",
"gnosis": "0.993981",
"scroll": "3174.87",
"polygonzkevm": "3174.87",
"inevm": "28.12",
"viction": "0.775722",
"neutron": "0.842639",
"injective": "28.12"
"arbitrum": "2919.87",
"ancient8": "2919.87",
"avalanche": "33.19",
"base": "2919.87",
"blast": "2919.87",
"bsc": "570.1",
"celo": "0.738559",
"ethereum": "2919.87",
"gnosis": "1.005",
"inevm": "21.59",
"mantapacific": "2919.87",
"mode": "2919.87",
"moonbeam": "0.253144",
"optimism": "2919.87",
"polygon": "0.663051",
"polygonzkevm": "2919.87",
"redstone": "2919.87",
"scroll": "2919.87",
"viction": "0.424231",
"zetachain": "1.53",
"injective": "21.59",
"neutron": "0.606906"
}

@ -380,5 +380,33 @@ export const validatorChainConfig = (
'mode',
),
},
redstone: {
interval: 5,
reorgPeriod: getReorgPeriod('redstone'),
validators: validatorsConfig(
{
[Contexts.Hyperlane]: ['0x1400b9737007f7978d8b4bbafb4a69c83f0641a7'],
[Contexts.ReleaseCandidate]: [
'0x51ed7127c0afc0513a0f141e910c5e02b2a9a4b5',
],
[Contexts.Neutron]: [],
},
'redstone',
),
},
zetachain: {
interval: 5,
reorgPeriod: getReorgPeriod('zetachain'),
validators: validatorsConfig(
{
[Contexts.Hyperlane]: ['0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef'],
[Contexts.ReleaseCandidate]: [
'0xa13d146b47242671466e4041f5fe68d22a2ffe09',
],
[Contexts.Neutron]: [],
},
'zetachain',
),
},
};
};

@ -164,6 +164,13 @@ export function withBuildArtifactPath<T>(args: Argv<T>) {
.alias('b', 'buildArtifactPath');
}
export function withConcurrentDeploy<T>(args: Argv<T>) {
return args
.describe('concurrentDeploy', 'If enabled, runs all deploys concurrently')
.boolean('concurrentDeploy')
.default('concurrentDeploy', false);
}
// not requiring to build coreConfig to get agentConfig
export async function getAgentConfigsBasedOnArgs(argv?: {
environment: DeployEnvironment;

@ -42,6 +42,7 @@ import {
getArgs,
getModuleDirectory,
withBuildArtifactPath,
withConcurrentDeploy,
withContext,
withModuleAndFork,
withNetwork,
@ -56,8 +57,11 @@ async function main() {
environment,
network,
buildArtifactPath,
concurrentDeploy,
} = await withContext(
withNetwork(withModuleAndFork(withBuildArtifactPath(getArgs()))),
withConcurrentDeploy(
withNetwork(withModuleAndFork(withBuildArtifactPath(getArgs()))),
),
).argv;
const envConfig = getEnvironmentConfig(environment);
@ -113,6 +117,7 @@ async function main() {
multiProvider,
ismFactory,
contractVerifier,
concurrentDeploy,
);
} else if (module === Modules.WARP) {
const ismFactory = HyperlaneIsmFactory.fromAddressesMap(

@ -129,9 +129,9 @@ function getMinUsdCost(local: ChainName, remote: ChainName): number {
// By default, min cost is 20 cents
let minUsdCost = 0.2;
// For Ethereum local, min cost is 2 USD
// For Ethereum local, min cost is 1.5 USD
if (local === 'ethereum') {
minUsdCost = Math.max(minUsdCost, 2);
minUsdCost = Math.max(minUsdCost, 1.5);
}
const remoteMinCostOverrides: ChainMap<number> = {

@ -142,7 +142,12 @@ export async function writeAgentConfig(
const deployedBlock = await mailbox.deployedBlock();
return deployedBlock.toNumber();
} catch (err) {
console.error('Failed to get deployed block for', chain, err);
console.error(
'Failed to get deployed block, defaulting to 0. Chain:',
chain,
'Error:',
err,
);
return 0;
}
}),

@ -115,7 +115,9 @@ export abstract class HyperlaneAppGovernor<
if (calls.length > 0) {
const confirmed = await summarizeCalls(submissionType, calls);
if (confirmed) {
console.log(`Submitting calls on ${chain} via ${submissionType}`);
console.log(
`Submitting calls on ${chain} via ${SubmissionType[submissionType]}`,
);
await multiSend.sendTransactions(
calls.map((call) => ({
to: call.to,
@ -125,7 +127,7 @@ export abstract class HyperlaneAppGovernor<
);
} else {
console.log(
`Skipping submission of calls on ${chain} via ${submissionType}`,
`Skipping submission of calls on ${chain} via ${SubmissionType[submissionType]}`,
);
}
}

@ -57,6 +57,7 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
validators: [
'0xf20c0b09f597597c8d2430d3d72dfddaf09177d1',
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
'0xae53467a5c2a9d9420c188d10fef5e1d9b9a5b80', // superform
],
},
@ -231,6 +232,14 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
],
},
redstone: {
threshold: 2,
validators: [
'0x1400b9737007f7978d8b4bbafb4a69c83f0641a7',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
],
},
scroll: {
threshold: 2,
validators: [
@ -281,4 +290,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
'0x1f87c368f8e05a85ef9126d984a980a20930cb9c',
],
},
zetachain: {
threshold: 2,
validators: [
'0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
],
},
};

@ -32,12 +32,14 @@ export class HyperlaneCoreDeployer extends HyperlaneDeployer<
multiProvider: MultiProvider,
readonly ismFactory: HyperlaneIsmFactory,
contractVerifier?: ContractVerifier,
concurrentDeploy: boolean = false,
) {
super(multiProvider, coreFactories, {
logger: rootLogger.child({ module: 'CoreDeployer' }),
chainTimeoutMs: 1000 * 60 * 10, // 10 minutes
ismFactory,
contractVerifier,
concurrentDeploy,
});
this.hookDeployer = new HyperlaneHookDeployer(
multiProvider,
@ -133,7 +135,9 @@ export class HyperlaneCoreDeployer extends HyperlaneDeployer<
!e.message.includes('Reverted 0x08c379a') &&
// Handle situation where the gas estimation fails on the call function,
// then the real error reason is not available in `e.message`, but rather in `e.error.reason`
!e.error?.reason?.includes('already initialized')
!e.error?.reason?.includes('already initialized') &&
// Some providers, like on Viction, return a generic error message for all revert reasons
!e.message.includes('always failing transaction')
) {
throw e;
}

@ -60,6 +60,7 @@ export interface DeployerOptions {
ismFactory?: HyperlaneIsmFactory;
icaApp?: InterchainAccount;
contractVerifier?: ContractVerifier;
concurrentDeploy?: boolean;
}
export abstract class HyperlaneDeployer<
@ -82,7 +83,7 @@ export abstract class HyperlaneDeployer<
protected readonly icaAddresses = {},
) {
this.logger = options?.logger ?? rootLogger.child({ module: 'deployer' });
this.chainTimeoutMs = options?.chainTimeoutMs ?? 5 * 60 * 1000; // 5 minute timeout per chain
this.chainTimeoutMs = options?.chainTimeoutMs ?? 15 * 60 * 1000; // 15 minute timeout per chain
this.options.ismFactory?.setDeployer(this);
if (Object.keys(icaAddresses).length > 0) {
this.options.icaApp = InterchainAccount.fromAddressesMap(
@ -125,6 +126,8 @@ export abstract class HyperlaneDeployer<
).intersection;
this.logger.debug(`Start deploy to ${targetChains}`);
const deployPromises = [];
for (const chain of targetChains) {
const signerUrl = await this.multiProvider.tryGetExplorerAddressUrl(
chain,
@ -135,11 +138,31 @@ export abstract class HyperlaneDeployer<
this.startingBlockNumbers[chain] = await this.multiProvider
.getProvider(chain)
.getBlockNumber();
await runWithTimeout(this.chainTimeoutMs, async () => {
const deployPromise = runWithTimeout(this.chainTimeoutMs, async () => {
const contracts = await this.deployContracts(chain, configMap[chain]);
this.addDeployedContracts(chain, contracts);
this.logger.info({ chain }, 'Successfully deployed contracts');
});
if (this.options.concurrentDeploy) {
deployPromises.push(deployPromise);
} else {
await deployPromise;
}
}
// Await all deploy promises. If concurrent deploy is not enabled, this will be a no-op.
const deployResults = await Promise.allSettled(deployPromises);
for (const [i, result] of deployResults.entries()) {
if (result.status === 'rejected') {
this.logger.error(
{ chain: targetChains[i], error: result.reason },
'Deployment failed',
);
throw result.reason;
}
}
return this.deployedContracts;
}
@ -715,7 +738,7 @@ export abstract class HyperlaneDeployer<
);
if (!eqAddress(current, owner)) {
this.logger.debug(
{ contractName },
{ contractName, current, desiredOwner: owner },
'Current owner and config owner do not match',
);
const receipt = await this.runIfOwner(chain, ownable, () => {

@ -137,7 +137,7 @@ export class ContractVerifier {
break;
default:
errorMessage = `Verification failed. ${
result.result ?? response.statusText
JSON.stringify(result.result) ?? response.statusText
}`;
break;
}
@ -155,7 +155,7 @@ export class ContractVerifier {
if (result.result === ExplorerApiErrors.UNABLE_TO_VERIFY) {
const errorMessage = `Verification failed. ${
result.result ?? response.statusText
JSON.stringify(result.result) ?? response.statusText
}`;
verificationLogger.debug(errorMessage);
throw new Error(`[${chain}] ${errorMessage}`);

@ -313,12 +313,20 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer<
}
const overrides = this.multiProvider.getTransactionOverrides(chain);
await this.runIfOwner(chain, routingHook, async () =>
this.multiProvider.handleTx(
await this.runIfOwner(chain, routingHook, async () => {
this.logger.debug(
{
chain,
routingHookAddress: routingHook.address,
routingConfigs,
},
'Setting routing hooks',
);
return this.multiProvider.handleTx(
chain,
routingHook.setHooks(routingConfigs, overrides),
),
);
);
});
await this.transferOwnershipOfContracts(chain, config, {
[config.type]: routingHook,

Loading…
Cancel
Save