From 6b5a763e78bc056d36de915dbb69250ed83ec653 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 20:11:27 -0400 Subject: [PATCH 01/35] Version Packages (#3980) This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @hyperlane-xyz/core@3.15.1 ### Patch Changes - 6620fe636: fix: `TokenRouter.transferRemote` with hook overrides - @hyperlane-xyz/utils@3.15.1 ## @hyperlane-xyz/cli@3.15.1 ### Patch Changes - 921e449b4: Support priorityFee fetching from RPC and some better logging - Updated dependencies [acaa22cd9] - Updated dependencies [921e449b4] - @hyperlane-xyz/sdk@3.15.1 - @hyperlane-xyz/utils@3.15.1 ## @hyperlane-xyz/helloworld@3.15.1 ### Patch Changes - 6620fe636: fix: `TokenRouter.transferRemote` with hook overrides - Updated dependencies [6620fe636] - Updated dependencies [acaa22cd9] - Updated dependencies [921e449b4] - @hyperlane-xyz/core@3.15.1 - @hyperlane-xyz/sdk@3.15.1 ## @hyperlane-xyz/sdk@3.15.1 ### Patch Changes - acaa22cd9: Do not consider xERC20 a collateral standard to fix fungibility checking logic while maintaining mint limit checking - 921e449b4: Support priorityFee fetching from RPC and some better logging - Updated dependencies [6620fe636] - @hyperlane-xyz/core@3.15.1 - @hyperlane-xyz/utils@3.15.1 ## @hyperlane-xyz/utils@3.15.1 ## @hyperlane-xyz/infra@3.15.1 ### Patch Changes - Updated dependencies [6620fe636] - Updated dependencies [acaa22cd9] - Updated dependencies [921e449b4] - @hyperlane-xyz/helloworld@3.15.1 - @hyperlane-xyz/sdk@3.15.1 - @hyperlane-xyz/utils@3.15.1 ## @hyperlane-xyz/ccip-server@3.15.1 Co-authored-by: github-actions[bot] --- .changeset/mean-impalas-leave.md | 6 ------ .changeset/olive-geckos-behave.md | 5 ----- .changeset/sixty-ducks-brush.md | 6 ------ solidity/CHANGELOG.md | 7 +++++++ solidity/package.json | 4 ++-- typescript/ccip-server/CHANGELOG.md | 2 ++ typescript/ccip-server/package.json | 2 +- typescript/cli/CHANGELOG.md | 10 ++++++++++ typescript/cli/package.json | 6 +++--- typescript/cli/src/version.ts | 2 +- typescript/helloworld/CHANGELOG.md | 11 +++++++++++ typescript/helloworld/package.json | 6 +++--- typescript/infra/CHANGELOG.md | 11 +++++++++++ typescript/infra/package.json | 8 ++++---- typescript/sdk/CHANGELOG.md | 10 ++++++++++ typescript/sdk/package.json | 6 +++--- typescript/utils/CHANGELOG.md | 2 ++ typescript/utils/package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 19 files changed, 85 insertions(+), 49 deletions(-) delete mode 100644 .changeset/mean-impalas-leave.md delete mode 100644 .changeset/olive-geckos-behave.md delete mode 100644 .changeset/sixty-ducks-brush.md diff --git a/.changeset/mean-impalas-leave.md b/.changeset/mean-impalas-leave.md deleted file mode 100644 index caa85890f4..0000000000 --- a/.changeset/mean-impalas-leave.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@hyperlane-xyz/core": patch -"@hyperlane-xyz/helloworld": patch ---- - -fix: `TokenRouter.transferRemote` with hook overrides diff --git a/.changeset/olive-geckos-behave.md b/.changeset/olive-geckos-behave.md deleted file mode 100644 index b199df2cb7..0000000000 --- a/.changeset/olive-geckos-behave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperlane-xyz/sdk": patch ---- - -Do not consider xERC20 a collateral standard to fix fungibility checking logic while maintaining mint limit checking diff --git a/.changeset/sixty-ducks-brush.md b/.changeset/sixty-ducks-brush.md deleted file mode 100644 index ac4e4366cd..0000000000 --- a/.changeset/sixty-ducks-brush.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@hyperlane-xyz/cli": patch -"@hyperlane-xyz/sdk": patch ---- - -Support priorityFee fetching from RPC and some better logging diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index 0763cef17c..4107a5ba8e 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,12 @@ # @hyperlane-xyz/core +## 3.15.1 + +### Patch Changes + +- 6620fe636: fix: `TokenRouter.transferRemote` with hook overrides + - @hyperlane-xyz/utils@3.15.1 + ## 3.15.0 ### Minor Changes diff --git a/solidity/package.json b/solidity/package.json index 0d2921a584..ce10f806f7 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -1,10 +1,10 @@ { "name": "@hyperlane-xyz/core", "description": "Core solidity contracts for Hyperlane", - "version": "3.15.0", + "version": "3.15.1", "dependencies": { "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "3.15.0", + "@hyperlane-xyz/utils": "3.15.1", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^v4.9.3", diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index ee27ea4460..115debd5e4 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/ccip-server +## 3.15.1 + ## 3.15.0 ## 3.14.0 diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index c5e859ac2f..1b3f5c7928 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "3.15.0", + "version": "3.15.1", "description": "CCIP server", "typings": "dist/index.d.ts", "typedocMain": "src/index.ts", diff --git a/typescript/cli/CHANGELOG.md b/typescript/cli/CHANGELOG.md index be0e07baa3..428039d50f 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,15 @@ # @hyperlane-xyz/cli +## 3.15.1 + +### Patch Changes + +- 921e449b4: Support priorityFee fetching from RPC and some better logging +- Updated dependencies [acaa22cd9] +- Updated dependencies [921e449b4] + - @hyperlane-xyz/sdk@3.15.1 + - @hyperlane-xyz/utils@3.15.1 + ## 3.15.0 ### Minor Changes diff --git a/typescript/cli/package.json b/typescript/cli/package.json index aaa8fe0e8b..77531e30fe 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,13 +1,13 @@ { "name": "@hyperlane-xyz/cli", - "version": "3.15.0", + "version": "3.15.1", "description": "A command-line utility for common Hyperlane operations", "dependencies": { "@aws-sdk/client-kms": "^3.577.0", "@aws-sdk/client-s3": "^3.577.0", "@hyperlane-xyz/registry": "1.3.0", - "@hyperlane-xyz/sdk": "3.15.0", - "@hyperlane-xyz/utils": "3.15.0", + "@hyperlane-xyz/sdk": "3.15.1", + "@hyperlane-xyz/utils": "3.15.1", "@inquirer/prompts": "^3.0.0", "asn1.js": "^5.4.1", "bignumber.js": "^9.1.1", diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index eb5b8185d0..871417df17 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '3.15.0'; +export const VERSION = '3.15.1'; diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index 1ea1e9cc39..7b62ae8f62 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,16 @@ # @hyperlane-xyz/helloworld +## 3.15.1 + +### Patch Changes + +- 6620fe636: fix: `TokenRouter.transferRemote` with hook overrides +- Updated dependencies [6620fe636] +- Updated dependencies [acaa22cd9] +- Updated dependencies [921e449b4] + - @hyperlane-xyz/core@3.15.1 + - @hyperlane-xyz/sdk@3.15.1 + ## 3.15.0 ### Patch Changes diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 22138b9bcb..f039a6893b 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/helloworld", "description": "A basic skeleton of an Hyperlane app", - "version": "3.15.0", + "version": "3.15.1", "dependencies": { - "@hyperlane-xyz/core": "3.15.0", + "@hyperlane-xyz/core": "3.15.1", "@hyperlane-xyz/registry": "1.3.0", - "@hyperlane-xyz/sdk": "3.15.0", + "@hyperlane-xyz/sdk": "3.15.1", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" }, diff --git a/typescript/infra/CHANGELOG.md b/typescript/infra/CHANGELOG.md index ed68044f8f..8d4e38701c 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,16 @@ # @hyperlane-xyz/infra +## 3.15.1 + +### Patch Changes + +- Updated dependencies [6620fe636] +- Updated dependencies [acaa22cd9] +- Updated dependencies [921e449b4] + - @hyperlane-xyz/helloworld@3.15.1 + - @hyperlane-xyz/sdk@3.15.1 + - @hyperlane-xyz/utils@3.15.1 + ## 3.15.0 ### Patch Changes diff --git a/typescript/infra/package.json b/typescript/infra/package.json index daede08e4b..33b1706766 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/infra", "description": "Infrastructure utilities for the Hyperlane Network", - "version": "3.15.0", + "version": "3.15.1", "dependencies": { "@arbitrum/sdk": "^3.0.0", "@aws-sdk/client-iam": "^3.74.0", @@ -13,10 +13,10 @@ "@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "3.15.0", + "@hyperlane-xyz/helloworld": "3.15.1", "@hyperlane-xyz/registry": "1.3.0", - "@hyperlane-xyz/sdk": "3.15.0", - "@hyperlane-xyz/utils": "3.15.0", + "@hyperlane-xyz/sdk": "3.15.1", + "@hyperlane-xyz/utils": "3.15.1", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@solana/web3.js": "^1.78.0", "asn1.js": "5.4.1", diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index 3810b575db..d999027776 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,15 @@ # @hyperlane-xyz/sdk +## 3.15.1 + +### Patch Changes + +- acaa22cd9: Do not consider xERC20 a collateral standard to fix fungibility checking logic while maintaining mint limit checking +- 921e449b4: Support priorityFee fetching from RPC and some better logging +- Updated dependencies [6620fe636] + - @hyperlane-xyz/core@3.15.1 + - @hyperlane-xyz/utils@3.15.1 + ## 3.15.0 ### Minor Changes diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 0b74f6a0c3..ba63cab439 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,13 +1,13 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "3.15.0", + "version": "3.15.1", "dependencies": { "@aws-sdk/client-s3": "^3.74.0", "@cosmjs/cosmwasm-stargate": "^0.31.3", "@cosmjs/stargate": "^0.31.3", - "@hyperlane-xyz/core": "3.15.0", - "@hyperlane-xyz/utils": "3.15.0", + "@hyperlane-xyz/core": "3.15.1", + "@hyperlane-xyz/utils": "3.15.1", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@solana/spl-token": "^0.3.8", diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index a796ccac6b..a11397181a 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/utils +## 3.15.1 + ## 3.15.0 ## 3.14.0 diff --git a/typescript/utils/package.json b/typescript/utils/package.json index c7f4b7ec08..e02d1c1df6 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/utils", "description": "General utilities and types for the Hyperlane network", - "version": "3.15.0", + "version": "3.15.1", "dependencies": { "@cosmjs/encoding": "^0.31.3", "@solana/web3.js": "^1.78.0", diff --git a/yarn.lock b/yarn.lock index 577194fa9d..529e0c6672 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5684,8 +5684,8 @@ __metadata: "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" "@hyperlane-xyz/registry": "npm:1.3.0" - "@hyperlane-xyz/sdk": "npm:3.15.0" - "@hyperlane-xyz/utils": "npm:3.15.0" + "@hyperlane-xyz/sdk": "npm:3.15.1" + "@hyperlane-xyz/utils": "npm:3.15.1" "@inquirer/prompts": "npm:^3.0.0" "@types/mocha": "npm:^10.0.1" "@types/node": "npm:^18.14.5" @@ -5713,12 +5713,12 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:3.15.0, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:3.15.1, @hyperlane-xyz/core@workspace:solidity": version: 0.0.0-use.local resolution: "@hyperlane-xyz/core@workspace:solidity" dependencies: "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:3.15.0" + "@hyperlane-xyz/utils": "npm:3.15.1" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -5769,13 +5769,13 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/helloworld@npm:3.15.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:3.15.1, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: - "@hyperlane-xyz/core": "npm:3.15.0" + "@hyperlane-xyz/core": "npm:3.15.1" "@hyperlane-xyz/registry": "npm:1.3.0" - "@hyperlane-xyz/sdk": "npm:3.15.0" + "@hyperlane-xyz/sdk": "npm:3.15.1" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -5822,10 +5822,10 @@ __metadata: "@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/providers": "npm:^5.7.2" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:3.15.0" + "@hyperlane-xyz/helloworld": "npm:3.15.1" "@hyperlane-xyz/registry": "npm:1.3.0" - "@hyperlane-xyz/sdk": "npm:3.15.0" - "@hyperlane-xyz/utils": "npm:3.15.0" + "@hyperlane-xyz/sdk": "npm:3.15.1" + "@hyperlane-xyz/utils": "npm:3.15.1" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" @@ -5885,15 +5885,15 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:3.15.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:3.15.1, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: "@aws-sdk/client-s3": "npm:^3.74.0" "@cosmjs/cosmwasm-stargate": "npm:^0.31.3" "@cosmjs/stargate": "npm:^0.31.3" - "@hyperlane-xyz/core": "npm:3.15.0" - "@hyperlane-xyz/utils": "npm:3.15.0" + "@hyperlane-xyz/core": "npm:3.15.1" + "@hyperlane-xyz/utils": "npm:3.15.1" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -5961,7 +5961,7 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/utils@npm:3.15.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:3.15.1, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: From 6171d82c82e60f911f2b52c98144b98caf2c8789 Mon Sep 17 00:00:00 2001 From: Ayene <2958807+ayenesimo1i@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:58:36 +0300 Subject: [PATCH 02/35] chore: fix broken links (#3970) ### Description changed links pointing to Solana docs due to migration to different repository --- rust/sealevel/libraries/ecdsa-signature/Cargo.toml | 2 +- rust/sealevel/libraries/message-recipient-interface/Cargo.toml | 2 +- rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml | 2 +- rust/sealevel/programs/mailbox/Cargo.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/sealevel/libraries/ecdsa-signature/Cargo.toml b/rust/sealevel/libraries/ecdsa-signature/Cargo.toml index ddb511b400..7390610a03 100644 --- a/rust/sealevel/libraries/ecdsa-signature/Cargo.toml +++ b/rust/sealevel/libraries/ecdsa-signature/Cargo.toml @@ -11,7 +11,7 @@ thiserror.workspace = true hyperlane-core = { path = "../../../hyperlane-core" } # Required to allow dependencies `getrandom` but to preserve determinism required by programs, see -# https://github.com/solana-labs/solana/blob/master/docs/src/developing/on-chain-programs/developing-rust.md#depending-on-rand +# https://github.com/solana-foundation/developer-content/blob/main/docs/programs/lang-rust.md#depending-on-rand getrandom = { workspace = true, features = ["custom"] } [lib] diff --git a/rust/sealevel/libraries/message-recipient-interface/Cargo.toml b/rust/sealevel/libraries/message-recipient-interface/Cargo.toml index 1cdec684d8..de95c312c8 100644 --- a/rust/sealevel/libraries/message-recipient-interface/Cargo.toml +++ b/rust/sealevel/libraries/message-recipient-interface/Cargo.toml @@ -12,7 +12,7 @@ spl-type-length-value.workspace = true hyperlane-core = { path = "../../../hyperlane-core" } # Required to allow dependencies `getrandom` but to preserve determinism required by programs, see -# https://github.com/solana-labs/solana/blob/master/docs/src/developing/on-chain-programs/developing-rust.md#depending-on-rand +# https://github.com/solana-foundation/developer-content/blob/main/docs/programs/lang-rust.md#depending-on-rand getrandom = { workspace = true, features = ["custom"] } [lib] diff --git a/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml b/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml index 442ada46ea..31146408c6 100644 --- a/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml +++ b/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml @@ -21,7 +21,7 @@ num-derive.workspace = true num-traits.workspace = true thiserror.workspace = true # Required to allow dependencies `getrandom` but to preserve determinism required by programs, see -# https://github.com/solana-labs/solana/blob/master/docs/src/developing/on-chain-programs/developing-rust.md#depending-on-rand +# https://github.com/solana-foundation/developer-content/blob/main/docs/programs/lang-rust.md#depending-on-rand getrandom = { workspace = true, features = ["custom"] } serde = { workspace = true, optional = true } diff --git a/rust/sealevel/programs/mailbox/Cargo.toml b/rust/sealevel/programs/mailbox/Cargo.toml index 179891f422..4931fa315e 100644 --- a/rust/sealevel/programs/mailbox/Cargo.toml +++ b/rust/sealevel/programs/mailbox/Cargo.toml @@ -17,7 +17,7 @@ solana-program.workspace = true thiserror.workspace = true spl-noop.workspace = true # Required to allow dependencies `getrandom` but to preserve determinism required by programs, see -# https://github.com/solana-labs/solana/blob/master/docs/src/developing/on-chain-programs/developing-rust.md#depending-on-rand +# https://github.com/solana-foundation/developer-content/blob/main/docs/programs/lang-rust.md#depending-on-rand getrandom = { workspace = true, features = ["custom"] } proc-macro-crate = "~1.2.1" # TODO: remove this dependency once solana supports rust >=1.64 From 5cc64eb095486606b3444822a495f60df67b29b8 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Tue, 18 Jun 2024 12:31:39 +0100 Subject: [PATCH 03/35] feat: deploy to new chains (fraxtal, linea, sei) (#3887) https://github.com/hyperlane-xyz/issues/issues/1279 - adds `fraxtal`, `linea`, `sei` - supports `osmosis` as a remote - ~drive-by hack to skip reconfiguring the same gas oracle (cc @tkporter)~ - drive-by fix to bring the logic of estimating tx + adding 10% buffer into the ism factory (as originally seen in the multiprovider handleDeploy function) - drive-by fix for creating custom safes - drive-by support of `osmosis` as a remote chain - drive-by addition of `osmosis` to the rust agent --------- Signed-off-by: Paul Balaji Co-authored-by: Trevor Porter Co-authored-by: nambrot --- .changeset/cuddly-ways-grin.md | 7 + .changeset/five-eels-reflect.md | 6 + .changeset/tall-jeans-camp.md | 5 + .github/workflows/test.yml | 5 + .../m20230309_000001_create_table_domain.rs | 24 + rust/config/mainnet_config.json | 282 +- rust/hyperlane-core/src/chain.rs | 15 +- .../config/environments/mainnet3/agent.ts | 20 +- .../mainnet3/aw-validators/hyperlane.json | 12 + .../mainnet3/aw-validators/rc.json | 9 + .../config/environments/mainnet3/chains.ts | 17 + .../mainnet3/core/verification.json | 4544 +++++++++++++---- .../config/environments/mainnet3/funding.ts | 8 +- .../environments/mainnet3/gasPrices.json | 58 +- .../config/environments/mainnet3/index.ts | 9 +- .../mainnet3/ism/verification.json | 186 + .../mainnet3/supportedChainNames.ts | 4 + .../environments/mainnet3/tokenPrices.json | 48 +- .../environments/mainnet3/validators.ts | 54 + typescript/infra/config/registry.ts | 2 +- .../infra/scripts/announce-validators.ts | 4 +- typescript/infra/scripts/check-deploy.ts | 15 +- typescript/infra/scripts/deploy.ts | 26 +- typescript/infra/scripts/print-gas-prices.ts | 37 +- .../infra/scripts/print-token-prices.ts | 12 +- typescript/infra/src/config/chain.ts | 1 - .../infra/src/govern/HyperlaneAppGovernor.ts | 72 +- typescript/sdk/src/aws/validator.ts | 7 +- typescript/sdk/src/consts/multisigIsm.ts | 30 + typescript/sdk/src/ism/HyperlaneIsmFactory.ts | 23 +- typescript/sdk/src/utils/gnosisSafe.js | 12 +- 31 files changed, 4464 insertions(+), 1090 deletions(-) create mode 100644 .changeset/cuddly-ways-grin.md create mode 100644 .changeset/five-eels-reflect.md create mode 100644 .changeset/tall-jeans-camp.md diff --git a/.changeset/cuddly-ways-grin.md b/.changeset/cuddly-ways-grin.md new file mode 100644 index 0000000000..8c950149c5 --- /dev/null +++ b/.changeset/cuddly-ways-grin.md @@ -0,0 +1,7 @@ +--- +'@hyperlane-xyz/infra': minor +--- + +Add support for new chains: linea, fraxtal, sei. +Support osmosis remote. +Drive-by fix to always fetch explorer API keys when running deploy script. diff --git a/.changeset/five-eels-reflect.md b/.changeset/five-eels-reflect.md new file mode 100644 index 0000000000..26a64bda6e --- /dev/null +++ b/.changeset/five-eels-reflect.md @@ -0,0 +1,6 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Add validator addresses for linea, fraxtal, sei. +Estimate gas and add 10% buffer inside HyperlaneIsmFactory as well. diff --git a/.changeset/tall-jeans-camp.md b/.changeset/tall-jeans-camp.md new file mode 100644 index 0000000000..37e3158345 --- /dev/null +++ b/.changeset/tall-jeans-camp.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/infra': patch +--- + +Allow selecting a specific chain to govern in check-deploy script diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b83bc9c35d..e01741aab6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -172,6 +172,7 @@ jobs: path: | ${{ env.REGISTRY_URI_ABSOLUTE }} key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} + fail-on-cache-miss: true - name: Unit Tests run: yarn test:ci @@ -215,6 +216,7 @@ jobs: path: | ${{ env.REGISTRY_URI_ABSOLUTE }} key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} + fail-on-cache-miss: true - name: Generate ${{ matrix.environment }} agent config run: | @@ -292,6 +294,7 @@ jobs: path: | ${{ env.REGISTRY_URI_ABSOLUTE }} key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} + fail-on-cache-miss: true - name: cargo-cache uses: actions/cache@v4 @@ -396,6 +399,7 @@ jobs: path: | ${{ env.REGISTRY_URI_ABSOLUTE }} key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} + fail-on-cache-miss: true - name: cargo-cache uses: actions/cache@v4 @@ -447,6 +451,7 @@ jobs: path: | ${{ env.REGISTRY_URI_ABSOLUTE }} key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} + fail-on-cache-miss: true - name: Fork test ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} deployment run: cd typescript/infra && ./fork.sh ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} diff --git a/rust/agents/scraper/migration/src/m20230309_000001_create_table_domain.rs b/rust/agents/scraper/migration/src/m20230309_000001_create_table_domain.rs index 305f43badc..578548e957 100644 --- a/rust/agents/scraper/migration/src/m20230309_000001_create_table_domain.rs +++ b/rust/agents/scraper/migration/src/m20230309_000001_create_table_domain.rs @@ -94,6 +94,14 @@ const DOMAINS: &[RawDomain] = &[ is_test_net: false, is_deprecated: false, }, + RawDomain { + name: "fraxtal", + token: "frxETH", + domain: 252, + chain_id: 252, + is_test_net: false, + is_deprecated: false, + }, RawDomain { name: "fuji", token: "AVAX", @@ -110,6 +118,14 @@ const DOMAINS: &[RawDomain] = &[ is_test_net: false, is_deprecated: false, }, + RawDomain { + name: "linea", + token: "ETH", + domain: 59144, + chain_id: 59144, + is_test_net: false, + is_deprecated: false, + }, RawDomain { name: "mantapacific", token: "ETH", @@ -182,6 +198,14 @@ const DOMAINS: &[RawDomain] = &[ is_test_net: true, is_deprecated: false, }, + RawDomain { + name: "sei", + token: "SEI", + domain: 1329, + chain_id: 1329, + is_test_net: false, + is_deprecated: false, + }, RawDomain { name: "sepolia", token: "ETH", diff --git a/rust/config/mainnet_config.json b/rust/config/mainnet_config.json index c4c494f463..5be8bfff09 100644 --- a/rust/config/mainnet_config.json +++ b/rust/config/mainnet_config.json @@ -19,7 +19,7 @@ "chainId": 888888888, "displayName": "Ancient8", "domainId": 888888888, - "domainRoutingIsm": "0xB6F0f1267B01C27326F61a4B4fe2c73751802685", + "domainRoutingIsm": "0x477145b11E1a71fEb658d96A0E27F19495121504", "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0x5E01d8F34b629E3f92d69546bbc4142A7Adee7e9", "gasCurrencyCoinGeckoId": "ethereum", @@ -27,7 +27,7 @@ "from": 2507127 }, "interchainGasPaymaster": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", - "interchainSecurityModule": "0xBd3C7253F08c040eDB9c54e7CD4f8a5fd1eb935D", + "interchainSecurityModule": "0xa10686c87d47C8b78c846E77BE2f96607C7c44F4", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x811808Dd29ba8B0FC6C0ec0b5537035E59745162", @@ -38,7 +38,7 @@ "symbol": "ETH" }, "pausableHook": "0x66DC49405Ae2956f7E87FEAa9fE8f506C8987462", - "pausableIsm": "0xcf678903c003651DB0bb933820259A16ea9d95e4", + "pausableIsm": "0xF8DbA46fF9D8ef650052c89CA2Df793FaBc375F9", "protocol": "ethereum", "protocolFee": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", @@ -48,7 +48,7 @@ } ], "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", - "staticAggregationIsm": "0xBd3C7253F08c040eDB9c54e7CD4f8a5fd1eb935D", + "staticAggregationIsm": "0xc6ec1364d1ce3E963Fa65A0bDF57eC722478e1FB", "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", @@ -86,7 +86,7 @@ "interchainAccountIsm": "0xfa8bfcE55B3A0631dF38257615cEF7FCD3523A48", "interchainAccountRouter": "0xCD0CFFf6eFD943b4b81f2c15847730dbcD30e3aE", "interchainGasPaymaster": "0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22", - "interchainSecurityModule": "0x96845a0469363f90779f6D5cd49D79bDDAc69429", + "interchainSecurityModule": "0xd12C017529BE32c23150313F1E473B76e6B19773", "mailbox": "0x979Ca5202784112f4738403dBec5D0F3B9daabB9", "merkleTreeHook": "0x748040afB89B8FdBb992799808215419d36A0930", "name": "arbitrum", @@ -152,7 +152,7 @@ "interchainAccountIsm": "0x786c26C1857032617c215f265509d6E44e44Bfe3", "interchainAccountRouter": "0xA967A6CE0e73fAf672843DECaA372511996E8852", "interchainGasPaymaster": "0x95519ba800BBd0d34eeAE026fEc620AD978176C0", - "interchainSecurityModule": "0xe7a61510EA7197281b49e5bdf1798608d5132595", + "interchainSecurityModule": "0xB7D96FcD923267640BcffC7c3F23530E6C7A4209", "mailbox": "0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6", "merkleTreeHook": "0x84eea61D679F42D92145fA052C89900CBAccE95A", "name": "avalanche", @@ -218,7 +218,7 @@ "interchainAccountIsm": "0x861908E6c8F992537F557da5Fb5876836036b347", "interchainAccountRouter": "0xa85F9e4fdA2FFF1c07f2726a630443af3faDF830", "interchainGasPaymaster": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", - "interchainSecurityModule": "0x77bE0b5aE400675063Ce2B2B0d692D9341f4b193", + "interchainSecurityModule": "0xe7aaFbA826B0bDC60aD09b7b8cA8175c9A89cE0b", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x19dc38aeae620380430C200a6E990D5Af5480117", "name": "base", @@ -275,11 +275,12 @@ "domainRoutingIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "fallbackRoutingHook": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://transaction.blast-safe.io", "index": { "from": 2496427 }, "interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", - "interchainSecurityModule": "0x208263bB303B2a737642fB13C765F106a2591be8", + "interchainSecurityModule": "0xdE516712D58166257E03254BD596CA726417a837", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", "name": "blast", @@ -338,7 +339,7 @@ "interchainAccountIsm": "0xB274Bbbc1df5f1d1763216A93d473fde6f5de043", "interchainAccountRouter": "0x4BBd67dC995572b40Dc6B3eB6CdE5185a5373868", "interchainGasPaymaster": "0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451", - "interchainSecurityModule": "0xfA360ff588623A026BF19A1801F2A8F1f045fa33", + "interchainSecurityModule": "0x4C23e778aF68a54cb59A44581b90E78b35763C83", "mailbox": "0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4", "merkleTreeHook": "0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26", "name": "bsc", @@ -411,7 +412,7 @@ "interchainAccountIsm": "0x30a8DEc5318e2aAa9ad5b069fC606c4CfF6f5676", "interchainAccountRouter": "0x4ED23E3885e1651E62564F78817D91865beba575", "interchainGasPaymaster": "0x571f1435613381208477ac5d6974310d88AC7cB7", - "interchainSecurityModule": "0x0dcb01D4ABfa73fadB17C4B0e8cd52A38BD52c66", + "interchainSecurityModule": "0x1b90cCF49e45a87F751b344864e4246D1a57a100", "mailbox": "0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb", "merkleTreeHook": "0x04dB778f05854f26E67e0a66b740BBbE9070D366", "name": "celo", @@ -476,7 +477,7 @@ "interchainAccountIsm": "0x609707355a53d2aAb6366f48E2b607C599D26B29", "interchainAccountRouter": "0x8dBae9B1616c46A20591fE0006Bf015E28ca5cC9", "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611", - "interchainSecurityModule": "0x8CE0c6cAf18DbF5882b35F26E28412f3E9AbDeca", + "interchainSecurityModule": "0x355F2c5532521ca6Df8A908641Ed69eD0619466d", "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239", "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA", "name": "ethereum", @@ -513,6 +514,60 @@ }, "validatorAnnounce": "0xCe74905e51497b4adD3639366708b821dcBcff96" }, + "fraxtal": { + "aggregationHook": "0xD7ff06cDd83642D648baF0d36f77e79349120dA4", + "blockExplorers": [ + { + "apiUrl": "https://api.fraxscan.com/api", + "family": "etherscan", + "name": "Fraxscan", + "url": "https://fraxscan.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 252, + "displayName": "Fraxtal", + "domainId": 252, + "domainRoutingIsm": "0x0CA20946c1b7367Bd47C0a35E8feD23a4Ff59B9a", + "domainRoutingIsmFactory": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "fallbackRoutingHook": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", + "gasCurrencyCoinGeckoId": "frax-ether", + "index": { + "from": 5350807 + }, + "interchainGasPaymaster": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "interchainSecurityModule": "0xf1465DB845d0978e74d45EF195734b43bB739094", + "mailbox": "0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3", + "merkleTreeHook": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", + "name": "fraxtal", + "nativeToken": { + "decimals": 18, + "name": "Frax Ether", + "symbol": "frxETH" + }, + "pausableHook": "0x4E1c88DD261BEe2941e6c1814597e30F53330428", + "pausableIsm": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", + "protocol": "ethereum", + "protocolFee": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807", + "proxyAdmin": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "rpcUrls": [ + { + "http": "https://rpc.frax.com" + } + ], + "staticAggregationHookFactory": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "staticAggregationIsm": "0xcA26D50602efA9d835b01A142Ae218f59aa60433", + "staticAggregationIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticMerkleRootMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", + "testRecipient": "0x62B7592C1B6D1E43f4630B8e37f4377097840C05", + "validatorAnnounce": "0x1956848601549de5aa0c887892061fA5aB4f6fC4" + }, "gnosis": { "aggregationHook": "0xdD1FA1C12496474c1dDC67a658Ba81437F818861", "blockExplorers": [ @@ -542,7 +597,7 @@ "interchainAccountIsm": "0x5a56dff3D92D635372718f86e6dF09C1129CFf53", "interchainAccountRouter": "0x5E59EBAedeB691408EBAcF6C37218fa2cFcaC9f2", "interchainGasPaymaster": "0xDd260B99d302f0A3fF885728c086f729c06f227f", - "interchainSecurityModule": "0x5DB7edF8C1CF91e34895dB2e4b28d8b9C68ddC7B", + "interchainSecurityModule": "0x613D9ab2dd6cCFa2763d86FdEE3d96C4Ef4C2E96", "mailbox": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "name": "gnosis", @@ -592,11 +647,13 @@ "reorgPeriod": 0 }, "chainId": 2525, + "customHook": "0xA376b27212D608324808923Add679A2c9FAFe9Da", "displayName": "Injective EVM", "displayNameShort": "inEVM", "domainId": 2525, "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0xA376b27212D608324808923Add679A2c9FAFe9Da", "gasCurrencyCoinGeckoId": "injective-protocol", "index": { "from": 18972465 @@ -604,7 +661,7 @@ "interchainAccountIsm": "0x31894E7a734540B343d67E491148EB4FC9f7A45B", "interchainAccountRouter": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", "interchainGasPaymaster": "0x19dc38aeae620380430C200a6E990D5Af5480117", - "interchainSecurityModule": "0x440f7AD246F3e75df88a6338E8A33e91DA4B2B05", + "interchainSecurityModule": "0xC1a7a7b15d2B243f7c6Dbbdd6e8A2C2434cdf7BF", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65", "name": "inevm", @@ -629,6 +686,7 @@ "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", "storageGasOracle": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "testRecipient": "0x28291a7062afA569104bEd52F7AcCA3dD2FafD11", "timelockController": "0x0000000000000000000000000000000000000000", "validatorAnnounce": "0x15ab173bDB6832f9b64276bA128659b0eD77730B" }, @@ -684,6 +742,61 @@ "slip44": 118, "validatorAnnounce": "0x1fb225b2fcfbe75e614a1d627de97ff372242eed" }, + "linea": { + "aggregationHook": "0x43fF73dF1E170D076D9Ed30d4C6922A9D34322dE", + "blockExplorers": [ + { + "apiUrl": "https://api.lineascan.build/api", + "family": "etherscan", + "name": "LineaScan", + "url": "https://lineascan.build" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 1 + }, + "chainId": 59144, + "displayName": "Linea", + "domainId": 59144, + "domainRoutingIsm": "0x6faCF71D804964Ca62f16e56DE74d7dF38FdC3F0", + "domainRoutingIsmFactory": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "fallbackRoutingHook": "0x4E1c88DD261BEe2941e6c1814597e30F53330428", + "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://transaction.safe.linea.build", + "index": { + "from": 5154574 + }, + "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "interchainSecurityModule": "0xF8aD4EB8aBA13ae546B8D01501c63e4543Ff0660", + "mailbox": "0x02d16BC51af6BfD153d67CA61754cF912E82C4d9", + "merkleTreeHook": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", + "name": "linea", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "pausableHook": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", + "pausableIsm": "0x01aA8200936B475762Ee28D38B43a6cFe9076E52", + "protocol": "ethereum", + "protocolFee": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E", + "proxyAdmin": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", + "rpcUrls": [ + { + "http": "https://rpc.linea.build" + } + ], + "staticAggregationHookFactory": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "staticAggregationIsm": "0xF8aD4EB8aBA13ae546B8D01501c63e4543Ff0660", + "staticAggregationIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticMerkleRootMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "testRecipient": "0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42", + "validatorAnnounce": "0x62B7592C1B6D1E43f4630B8e37f4377097840C05" + }, "mantapacific": { "aggregationHook": "0x8464aF853363B8d6844070F68b0AB34Cb6523d0F", "blockExplorers": [ @@ -714,7 +827,7 @@ "interchainAccountIsm": "0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD", "interchainAccountRouter": "0x0f6fF770Eda6Ba1433C39cCf47d4059b254224Aa", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0xEda7cCD2A8CF717dc997D0002e363e4D10bF5c0d", + "interchainSecurityModule": "0x83319BD846D54E49C850027191D094D5E9114339", "isTestnet": false, "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", @@ -725,6 +838,7 @@ "symbol": "ETH" }, "pausableHook": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E", + "pausableIsm": "0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1", "protocol": "ethereum", "protocolFee": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", @@ -734,6 +848,7 @@ } ], "staticAggregationHookFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticAggregationIsm": "0x845A3feB4BcdC32a457c4051F67d3950FC6Fd1d1", "staticAggregationIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "staticMerkleRootMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", "staticMessageIdMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", @@ -744,6 +859,7 @@ "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9" }, "mode": { + "aggregationHook": "0x80D80cfBa98dD2d456ECd43Dcc1f852D5C4EeD7a", "blockExplorers": [ { "apiUrl": "https://explorer.mode.network/api", @@ -760,14 +876,16 @@ "chainId": 34443, "displayName": "Mode", "domainId": 34443, + "domainRoutingIsm": "0xB6F0f1267B01C27326F61a4B4fe2c73751802685", "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://transaction-mode.safe.optimism.io", "index": { "from": 6817759 }, "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0x8dfE6790DbB2Ecc1bEdb0eECfc1Ff467Ae5d8C89", + "interchainSecurityModule": "0xEe9443bc2Df7C10327077c605120CDd95e8Ca75F", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "mode", @@ -777,6 +895,7 @@ "symbol": "ETH" }, "pausableHook": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", + "pausableIsm": "0xe243Fb51d91c5DE62afAbE44F7Ed2D4DC51668C6", "protocol": "ethereum", "protocolFee": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4", "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", @@ -786,6 +905,7 @@ } ], "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x6BdA2074b7edCE8c4e4cD3D35517267468Aed93F", "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", @@ -812,6 +932,7 @@ "chainId": 1284, "displayName": "Moonbeam", "domainId": 1284, + "domainRoutingIsm": "0x7Faa23CEdA03364A79e05259e07D5E358E7400F7", "domainRoutingIsmFactory": "0x8061Af3A459093540d17823D651BC5E2A92669a7", "fallbackRoutingHook": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", "gnosisSafeTransactionServiceUrl": "https://transaction.multisig.moonbeam.network", @@ -821,7 +942,7 @@ "interchainAccountIsm": "0x799eA6f430f5CA901b59335fFC2fA10531106009", "interchainAccountRouter": "0x6b142f596FFc761ac3fFaaC1ecaDe54f4EE09977", "interchainGasPaymaster": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "interchainSecurityModule": "0x373836DFa82f2D27ec79Ca32A197Aa1665F0E1e9", + "interchainSecurityModule": "0x3db9D7c5cD0Aa312AB1262C711C10DeBA8303388", "mailbox": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", "merkleTreeHook": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", "name": "moonbeam", @@ -831,6 +952,7 @@ "symbol": "GLMR" }, "pausableHook": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "pausableIsm": "0x58062b26193B28000Cd991Df767f3A2674502de8", "protocol": "ethereum", "protocolFee": "0xCd3e29A9D293DcC7341295996a118913F7c582c0", "proxyAdmin": "0x6A9cdA3dd1F593983BFd142Eb35e6ce4137bd5ce", @@ -840,6 +962,7 @@ } ], "staticAggregationHookFactory": "0x59cC3E7A49DdC4893eB8754c7908f96072A7DbE8", + "staticAggregationIsm": "0xDAAfa04d38d95f5B8418786AE0F7ee5B962ee92B", "staticAggregationIsmFactory": "0x40c6Abcb6A2CdC8882d4bEcaC47927005c7Bb8c2", "staticMerkleRootMultisigIsmFactory": "0xE2f485bc031Feb5a4C41C1967bf028653d75f0C3", "staticMessageIdMultisigIsmFactory": "0x84Df48F8f241f11d0fA302d09d73030429Bd9C73", @@ -935,6 +1058,7 @@ "chainId": 10, "displayName": "Optimism", "domainId": 10, + "domainRoutingIsm": "0xDFfFCA9320E2c7530c61c4946B4c2376A1901dF2", "domainRoutingIsmFactory": "0xD2e905108c5e44dADA680274740f896Ea96Cf2Fb", "fallbackRoutingHook": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", "gasCurrencyCoinGeckoId": "ethereum", @@ -945,7 +1069,7 @@ "interchainAccountIsm": "0x0389faCac114023C123E22F3E54394944cAbcb48", "interchainAccountRouter": "0x33Ef006E7083BB38E0AFe3C3979F4e9b84415bf1", "interchainGasPaymaster": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "interchainSecurityModule": "0x04938856bE60c8e734ffDe5f720E2238302BE8D2", + "interchainSecurityModule": "0x32Ce76b9FfD0BbA0e43a2C27c2cAc90E82C48B95", "mailbox": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", "merkleTreeHook": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", "name": "optimism", @@ -955,6 +1079,7 @@ "symbol": "ETH" }, "pausableHook": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", + "pausableIsm": "0xD84D8114cCfa5c2403E56aBf754da529430704F0", "protocol": "ethereum", "protocolFee": "0xD71Ff941120e8f935b8b1E2C1eD72F5d140FF458", "proxyAdmin": "0xE047cb95FB3b7117989e911c6afb34771183fC35", @@ -964,6 +1089,7 @@ } ], "staticAggregationHookFactory": "0x15DEeAB8dECDe553bb0B1F9C00984cbcae1af3D7", + "staticAggregationIsm": "0xdF6316DF574974110DCC94BB4E520B09Fe3CbEf9", "staticAggregationIsmFactory": "0x7491843F3A5Ba24E0f17a22645bDa04A1Ae2c584", "staticMerkleRootMultisigIsmFactory": "0xCA6Cb9Bc3cfF9E11003A06617cF934B684Bc78BC", "staticMessageIdMultisigIsmFactory": "0xAa4Be20E9957fE21602c74d7C3cF5CB1112EA9Ef", @@ -975,13 +1101,25 @@ }, "osmosis": { "bech32Prefix": "osmo", + "blockExplorers": [ + { + "apiUrl": "https://www.mintscan.io/osmosis", + "family": "other", + "name": "Mintscan", + "url": "https://www.mintscan.io/osmosis" + } + ], "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, "reorgPeriod": 1 }, "canonicalAsset": "uosmo", "chainId": "osmosis-1", "contractAddressBytes": 32, - "domainId": "875", + "displayName": "Osmosis", + "domainId": 875, + "gasCurrencyCoinGeckoId": "osmosis", "gasPrice": { "amount": "0.025", "denom": "uosmo" @@ -992,18 +1130,32 @@ } ], "index": { + "chunk": 5, "from": 14389169 }, "interchainGasPaymaster": "0xd20a9dcf61939fc2fe6ad501b9457b1029b3cc7ab12ed72675ea2e10d831ee5d", + "isTestnet": false, "mailbox": "0x9493e39d85dd038022f97d88aba6bff98d98f9a016b4f2e498bf1d9898420172", "merkleTreeHook": "0x8920e062ee5ed8afccbc155d13ea9049296399ee41403655864fcd243edc7388", - "name": "osmosis1", + "name": "osmosis", + "nativeToken": { + "decimals": 6, + "denom": "uosmo", + "name": "Osmosis", + "symbol": "OSMO" + }, "protocol": "cosmos", + "restUrls": [ + { + "http": "https://osmosis-rest.publicnode.com" + } + ], "rpcUrls": [ { - "http": "https://osmosis-rpc.publicnode.com:443" + "http": "https://osmosis-rpc.publicnode.com" } ], + "slip44": 118, "validatorAnnounce": "0xaf867da5b09a20ee49161d57f99477c0c42d100f34eb53da0d2eb7fc6c257235" }, "polygon": { @@ -1035,7 +1187,7 @@ "interchainAccountIsm": "0x90384bC552e3C48af51Ef7D9473A9bF87431f5c7", "interchainAccountRouter": "0x5e80f3474825B61183c0F0f0726796F589082420", "interchainGasPaymaster": "0x0071740Bf129b05C4684abfbBeD248D80971cce2", - "interchainSecurityModule": "0xe289bD204Dbb4F3aaFA27Dbe5751C71e101CFD80", + "interchainSecurityModule": "0x1c39BD73C933c6B1b14685ABD28F996A6a0e306f", "mailbox": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB", "merkleTreeHook": "0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6", "name": "polygon", @@ -1094,6 +1246,7 @@ "displayName": "Polygon zkEVM", "displayNameShort": "zkEVM", "domainId": 1101, + "domainRoutingIsm": "0x8b6862a784f634F4C8E1cbb04c9DA3dB637B7EaA", "domainRoutingIsmFactory": "0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d", "fallbackRoutingHook": "0x01aE937A7B05d187bBCBE80F44F41879D3D335a4", "gasCurrencyCoinGeckoId": "ethereum", @@ -1104,7 +1257,7 @@ "interchainAccountIsm": "0xC49aF4965264FA7BB6424CE37aA06773ad177224", "interchainAccountRouter": "0xF15D70941dE2Bf95A23d6488eBCbedE0a444137f", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0xf2BEE9D2c15Ba9D7e06799B5912dE1F05533c141", + "interchainSecurityModule": "0xb7556707f04BEF8888294C18c447bE1e4446bF7D", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "polygonzkevm", @@ -1114,6 +1267,7 @@ "symbol": "ETH" }, "pausableHook": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "pausableIsm": "0x784b9D0f4eF9fb8444DfB5d24AB221C9D1A85395", "protocol": "ethereum", "protocolFee": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", @@ -1126,14 +1280,20 @@ } ], "staticAggregationHookFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticAggregationIsm": "0xAe7d2FA2aFc57Ce9F05930d403673A267b3efE50", "staticAggregationIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "staticMerkleRootMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", "staticMessageIdMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", "storageGasOracle": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "testRecipient": "0xD127D4549cb4A5B2781303a4fE99a10EAd13263A", "timelockController": "0x0000000000000000000000000000000000000000", + "transactionOverrides": { + "gasPrice": 1000000000 + }, "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9" }, "redstone": { + "aggregationHook": "0x7bC13D23eD161E152a05c71D037b4642EA61B8eF", "blockExplorers": [ { "apiUrl": "https://explorer.redstone.xyz/api", @@ -1150,6 +1310,7 @@ "chainId": 690, "displayName": "Redstone", "domainId": 690, + "domainRoutingIsm": "0x5D1e7D7c5B9e6dDC8439F67F10c578f2A1084f6F", "domainRoutingIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", "fallbackRoutingHook": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", "gasCurrencyCoinGeckoId": "ethereum", @@ -1157,7 +1318,7 @@ "from": 1797579 }, "interchainGasPaymaster": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "interchainSecurityModule": "0xF4689C7fA4920C91a6EEEd59630C9C8da7a77D40", + "interchainSecurityModule": "0xD10AD7d927817558468Ce0F0ab1edEF8D230E2d8", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", "name": "redstone", @@ -1167,6 +1328,7 @@ "symbol": "ETH" }, "pausableHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "pausableIsm": "0xD53Fdbb7537aCa82bAf7cCA7204088f15b52796a", "protocol": "ethereum", "protocolFee": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "proxyAdmin": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", @@ -1176,6 +1338,7 @@ } ], "staticAggregationHookFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "staticAggregationIsm": "0x3Bb9244a2aBBb710c933e8D82Ff8F0C200F3c036", "staticAggregationIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", "staticMerkleRootMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", "staticMessageIdMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", @@ -1201,10 +1364,11 @@ "chainId": 534352, "displayName": "Scroll", "domainId": 534352, + "domainRoutingIsm": "0x4d02AfFc3F030c887e2f914B8B67E0B845e034fD", "domainRoutingIsmFactory": "0xe03dad16074BC5EEA9A9311257BF02Eb0B6AAA2b", "fallbackRoutingHook": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", "gasCurrencyCoinGeckoId": "ethereum", - "gnosisSafeTransactionServiceUrl": "https://transaction.safe.scroll.xyz", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-scroll.safe.global", "index": { "chunk": 999, "from": 271840 @@ -1212,7 +1376,7 @@ "interchainAccountIsm": "0xb89c6ED617f5F46175E41551350725A09110bbCE", "interchainAccountRouter": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", "interchainGasPaymaster": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "interchainSecurityModule": "0xaDc0cB48E8DB81855A930C0C1165ea3dCe4Ba5C7", + "interchainSecurityModule": "0x0E6aFC8a7b5223cAD7a7c346da1B2e6ECBaA93f0", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", "name": "scroll", @@ -1222,6 +1386,7 @@ "symbol": "ETH" }, "pausableHook": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", + "pausableIsm": "0x11Fa12DBaCe771E293e19743feA342e378C6341F", "protocol": "ethereum", "protocolFee": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", @@ -1231,16 +1396,75 @@ } ], "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0xAC0F1820F1F3fEd26293B8714464ca431824f823", "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", "storageGasOracle": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", + "testRecipient": "0x674f4698d063cE4C0d604c88dD7D542De72f327f", "timelockController": "0x0000000000000000000000000000000000000000", "transactionOverrides": { "gasPrice": 2000000000 }, "validatorAnnounce": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638" }, + "sei": { + "aggregationHook": "0x40514BD46C57455933Be8BAedE96C4F0Ba3507D6", + "blockExplorers": [ + { + "apiUrl": "https://seitrace.com/pacific-1/api", + "family": "etherscan", + "name": "Seitrace", + "url": "https://seitrace.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 1329, + "displayName": "Sei", + "domainId": 1329, + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", + "gasCurrencyCoinGeckoId": "sei-network", + "index": { + "from": 80809403 + }, + "interchainGasPaymaster": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "interchainSecurityModule": "0x10FF77061869714E92E574FcE9025a419f5b999d", + "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "merkleTreeHook": "0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49", + "name": "sei", + "nativeToken": { + "decimals": 18, + "name": "Sei", + "symbol": "SEI" + }, + "pausableHook": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4", + "pausableIsm": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "protocol": "ethereum", + "protocolFee": "0x83c2DB237e93Ce52565AB110124f78fdf159E3f4", + "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "rpcUrls": [ + { + "http": "https://evm-rpc.sei-apis.com" + } + ], + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x596eCC936068AeBD836e79D530043b868569a61B", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "storageGasOracle": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", + "testRecipient": "0xdB670e1a1e312BF17425b08cE55Bdf2cD8F8eD54", + "transactionOverrides": { + "gasPrice": 2000000000 + }, + "validatorAnnounce": "0x5332D1AC0A626D265298c14ff681c0A8D28dB86d" + }, "viction": { "aggregationHook": "0x5c7890FAf9c99dC55926F00d624D7Bc6D7ac6834", "blockExplorers": [ @@ -1270,7 +1494,7 @@ "interchainAccountIsm": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807", "interchainAccountRouter": "0x1956848601549de5aa0c887892061fA5aB4f6fC4", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0xf8F3AF5F6B8f319364c339c0b8cA5975481901eD", + "interchainSecurityModule": "0xA76F4620ac1e97d273B2C9Ca71805c8afD792098", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "viction", @@ -1304,6 +1528,7 @@ "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9" }, "zetachain": { + "aggregationHook": "0x80D80cfBa98dD2d456ECd43Dcc1f852D5C4EeD7a", "blockExplorers": [ { "apiUrl": "https://explorer.zetachain.com", @@ -1320,6 +1545,7 @@ "chainId": 7000, "displayName": "ZetaChain", "domainId": 7000, + "domainRoutingIsm": "0xaDc0cB48E8DB81855A930C0C1165ea3dCe4Ba5C7", "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", "gasCurrencyCoinGeckoId": "zetachain", @@ -1327,7 +1553,7 @@ "from": 3068132 }, "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0x8dfE6790DbB2Ecc1bEdb0eECfc1Ff467Ae5d8C89", + "interchainSecurityModule": "0x8fB4297373f1f11032856693Cf6eee5eC8d7FF4F", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "zetachain", @@ -1337,6 +1563,7 @@ "symbol": "ZETA" }, "pausableHook": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", + "pausableIsm": "0x7b75b29caD47e10146e29BBf7BD9025e021a7023", "protocol": "ethereum", "protocolFee": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4", "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", @@ -1352,6 +1579,7 @@ } ], "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x7CB2dbE36aF0C0893B1B3502358Bc3697343559c", "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", diff --git a/rust/hyperlane-core/src/chain.rs b/rust/hyperlane-core/src/chain.rs index 03f4dc44da..e17790e7ab 100644 --- a/rust/hyperlane-core/src/chain.rs +++ b/rust/hyperlane-core/src/chain.rs @@ -80,6 +80,8 @@ pub enum KnownHyperlaneDomain { Neutron = 1853125230, + Osmosis = 875, + Injective = 6909546, InEvm = 2525, @@ -97,6 +99,12 @@ pub enum KnownHyperlaneDomain { PlumeTestnet = 161221135, + Fraxtal = 252, + + Linea = 59144, + + Sei = 1329, + // -- Local test chains -- /// Test1 local chain Test1 = 13371, @@ -229,7 +237,7 @@ impl KnownHyperlaneDomain { Mainnet: [ Ethereum, Avalanche, Arbitrum, Polygon, Optimism, BinanceSmartChain, Celo, Moonbeam, Gnosis, MantaPacific, Neutron, Injective, InEvm, Ancient8, Blast, - Mode, Redstone, Viction, Zetachain + Mode, Redstone, Viction, Zetachain, Fraxtal, Linea, Sei, Osmosis ], Testnet: [ Alfajores, MoonbaseAlpha, Sepolia, ScrollSepolia, Chiado, PlumeTestnet, Fuji, BinanceSmartChainTestnet, Holesky @@ -247,11 +255,12 @@ impl KnownHyperlaneDomain { Optimism, BinanceSmartChain, BinanceSmartChainTestnet, Celo, Gnosis, Alfajores, Moonbeam, InEvm, Ancient8, Blast, Mode, Redstone, Viction, Zetachain, MoonbaseAlpha, ScrollSepolia, Chiado, MantaPacific, PlumeTestnet, + Fraxtal, Linea, Sei, Test1, Test2, Test3 ], HyperlaneDomainProtocol::Fuel: [FuelTest1], HyperlaneDomainProtocol::Sealevel: [SealevelTest1, SealevelTest2], - HyperlaneDomainProtocol::Cosmos: [CosmosTest99990, CosmosTest99991, Neutron, Injective], + HyperlaneDomainProtocol::Cosmos: [CosmosTest99990, CosmosTest99991, Neutron, Osmosis, Injective], }) } @@ -264,7 +273,7 @@ impl KnownHyperlaneDomain { Ethereum, Sepolia, Holesky, Polygon, Avalanche, Fuji, Optimism, BinanceSmartChain, BinanceSmartChainTestnet, Celo, Gnosis, Alfajores, Moonbeam, MoonbaseAlpha, ScrollSepolia, Chiado, MantaPacific, Neutron, Injective, InEvm, Ancient8, Blast, Mode, Redstone, - Viction, Zetachain, + Viction, Zetachain, Fraxtal, Linea, Sei, Osmosis, Test1, Test2, Test3, FuelTest1, SealevelTest1, SealevelTest2, CosmosTest99990, CosmosTest99991 ], }) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 7d24fcc203..39e201053d 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -53,18 +53,22 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = { bsc: true, celo: true, ethereum: true, + fraxtal: true, gnosis: true, injective: true, inevm: true, + linea: true, mantapacific: true, mode: true, moonbeam: true, neutron: true, optimism: true, + osmosis: true, polygon: true, polygonzkevm: true, redstone: true, scroll: true, + sei: true, viction: true, zetachain: true, }, @@ -77,19 +81,23 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = { bsc: true, celo: true, ethereum: true, + fraxtal: true, gnosis: true, injective: true, inevm: true, + linea: 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, + osmosis: false, polygon: true, polygonzkevm: true, redstone: true, scroll: true, + sei: true, viction: true, zetachain: true, }, @@ -102,19 +110,25 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = { bsc: true, celo: true, ethereum: true, + fraxtal: true, gnosis: true, // Cannot scrape non-EVM chains injective: false, inevm: true, + linea: true, mantapacific: true, mode: true, moonbeam: true, // Cannot scrape non-EVM chains neutron: false, optimism: true, + osmosis: false, polygon: true, polygonzkevm: true, redstone: true, + // Out of caution around pointer contracts (https://www.docs.sei.io/dev-interoperability/pointer-contracts) not being compatible + // and the scraper not gracefully handling txs that may not exist via the eth RPC, we don't run the scraper. + sei: false, scroll: true, // Has RPC non-compliance that breaks scraping. viction: false, @@ -209,7 +223,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '939fa81-20240607-194607', + tag: '59451d6-20240612-171611', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContexts, @@ -217,7 +231,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: 'de8c2a7-20240515-135254', + tag: '59451d6-20240612-171611', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -226,7 +240,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '939fa81-20240607-194607', + tag: '59451d6-20240612-171611', }, }, }; diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index a519362328..d5d6a3f02b 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -47,6 +47,9 @@ "0x749d6e7ad949e522c92181dc77f7bbc1c5d71506" ] }, + "fraxtal": { + "validators": ["0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1"] + }, "gnosis": { "validators": [ "0xd4df66a859585678f2ea8357161d896be19cc1ca", @@ -64,6 +67,9 @@ "injective": { "validators": ["0xbfb8911b72cfb138c7ce517c57d9c691535dc517"] }, + "linea": { + "validators": ["0xf2d5409a59e0f5ae7635aff73685624904a77d94"] + }, "mantapacific": { "validators": [ "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", @@ -95,6 +101,9 @@ "0x779a17e035018396724a6dec8a59bda1b5adf738" ] }, + "osmosis": { + "validators": ["0xea483af11c19fa41b16c31d1534c2a486a92bcac"] + }, "polygon": { "validators": [ "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", @@ -119,6 +128,9 @@ "0x7210fa0a6be39a75cb14d682ebfb37e2b53ecbe5" ] }, + "sei": { + "validators": ["0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5"] + }, "viction": { "validators": ["0x1f87c368f8e05a85ef9126d984a980a20930cb9c"] }, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/rc.json b/typescript/infra/config/environments/mainnet3/aw-validators/rc.json index 31f01e7aa1..0db2621f9a 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/rc.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/rc.json @@ -47,6 +47,9 @@ "0x87cf8a85465118aff9ec728ca157798201b1e368" ] }, + "fraxtal": { + "validators": ["0x8c772b730c8deb333dded14cb462e577a06283da"] + }, "gnosis": { "validators": [ "0xd5122daa0c3dfc94a825ae928f3ea138cdb6a2e1", @@ -61,6 +64,9 @@ "0xe83d36fd00d9ef86243d9f7147b29e98d11df0ee" ] }, + "linea": { + "validators": ["0xad4886b6f5f5088c7ae53b69d1ff5cfc2a17bec4"] + }, "mantapacific": { "validators": [ "0x84fcb05e6e5961df2dfd9f36e8f2b3e87ede7d76", @@ -116,6 +122,9 @@ "0x07c2f32a402543badc3141f6b98969d75ef2ac28" ] }, + "sei": { + "validators": ["0x846e48a7e85e5403cc690a347e1ad3c3dca11b6e"] + }, "viction": { "validators": [ "0xe858971cd865b11d3e8fb6b6af72db0d85881baf", diff --git a/typescript/infra/config/environments/mainnet3/chains.ts b/typescript/infra/config/environments/mainnet3/chains.ts index c511b72e6e..a5e518b3d9 100644 --- a/typescript/infra/config/environments/mainnet3/chains.ts +++ b/typescript/infra/config/environments/mainnet3/chains.ts @@ -1,5 +1,7 @@ +import { IRegistry } from '@hyperlane-xyz/registry'; import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk'; +import { getRegistryForEnvironment } from '../../../src/config/chain.js'; import { isEthereumProtocolChain } from '../../../src/utils/utils.js'; import { supportedChainNames } from './supportedChainNames.js'; @@ -44,6 +46,13 @@ export const chainMetadataOverrides: ChainMap> = { gasPrice: 2 * 10 ** 9, // 2 gwei }, }, + sei: { + // Sei's `eth_feeHistory` is not to spec and incompatible with ethers-rs, + // so we force legacy transactions by setting a gas price. + transactionOverrides: { + gasPrice: 2 * 10 ** 9, // 2 gwei + }, + }, moonbeam: { transactionOverrides: { maxFeePerGas: 350 * 10 ** 9, // 350 gwei @@ -51,3 +60,11 @@ export const chainMetadataOverrides: ChainMap> = { }, }, }; + +export const getRegistry = async (useSecrets = true): Promise => + getRegistryForEnvironment( + environment, + supportedChainNames, + chainMetadataOverrides, + useSecrets, + ); diff --git a/typescript/infra/config/environments/mainnet3/core/verification.json b/typescript/infra/config/environments/mainnet3/core/verification.json index aa032b48a1..e08a8c6fa7 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -689,6 +689,12 @@ "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, "name": "PausableIsm" + }, + { + "address": "0xF8DbA46fF9D8ef650052c89CA2Df793FaBc375F9", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" } ], "arbitrum": [ @@ -2349,2634 +2355,5298 @@ "name": "PausableIsm" } ], - "gnosis": [ + "fraxtal": [ { - "address": "0x53642476e24E28c3218E8Da44eDEBB4adB9DE13e", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000064", + "address": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" - }, - { - "address": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", - "constructorArguments": "00000000000000000000000053642476e24e28c3218e8da44edebb4adb9de13e00000000000000000000000081a92a1a272cb09d7b4970b07548463dc7ae0cb700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "name": "ProxyAdmin" }, { - "address": "0x53642476e24E28c3218E8Da44eDEBB4adB9DE13e", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000064", + "address": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000fc", "isProxy": false, "name": "Mailbox" }, { - "address": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", - "constructorArguments": "00000000000000000000000053642476e24e28c3218e8da44edebb4adb9de13e00000000000000000000000081a92a1a272cb09d7b4970b07548463dc7ae0cb700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b390000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", - "isProxy": false, - "name": "ProtocolFee" - }, - { - "address": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, - "name": "ProtocolFee" + "name": "PausableIsm" }, { - "address": "0x87ED6926abc9E38b9C7C19f835B41943b622663c", - "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f", + "address": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", + "constructorArguments": "0000000000000000000000002f9db5616fa3fad1ab06cb2c906830ba63d135e3", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "MerkleTreeHook" }, { - "address": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c", - "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000002684c6f89e901987e1fdb7649dc5be0c57c61645", + "address": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", + "constructorArguments": "0000000000000000000000002f9db5616fa3fad1ab06cb2c906830ba63d135e3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000008358d8291e3bedb04804975eea0fe9fe0fafb147", "isProxy": false, "name": "FallbackRoutingHook" }, { - "address": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6", + "address": "0x4E1c88DD261BEe2941e6c1814597e30F53330428", "constructorArguments": "", "isProxy": false, "name": "PausableHook" }, { - "address": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c", - "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000002684c6f89e901987e1fdb7649dc5be0c57c61645", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c", - "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000002684c6f89e901987e1fdb7649dc5be0c57c61645", - "isProxy": false, - "name": "FallbackRoutingHook" + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" - }, - { - "address": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c", - "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000002684c6f89e901987e1fdb7649dc5be0c57c61645", - "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0x223F7D3f27E6272266AE4B5B91Fd5C7A2d798cD8", - "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", - "isProxy": false, - "name": "PausableIsm" - } - ], - "inevm": [ + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, { - "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, - "name": "ProxyAdmin" + "name": "StorageGasOracle" }, { - "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000009dd", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" + "name": "InterchainGasPaymaster" }, { - "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", - "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", - "constructorArguments": "000000000000000000000000481171eb1aad17ede6a56005b7f1ab00c581ef130000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", - "constructorArguments": "000000000000000000000000481171eb1aad17ede6a56005b7f1ab00c581ef130000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", - "isProxy": false, - "name": "ProtocolFee" - }, - { - "address": "0x15ab173bDB6832f9b64276bA128659b0eD77730B", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", + "constructorArguments": "", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", - "constructorArguments": "", - "isProxy": false, - "name": "PausableHook" - } - ], - "mantapacific": [ + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, { - "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, - "name": "ProxyAdmin" + "name": "StorageGasOracle" }, { - "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000a9", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" + "name": "InterchainGasPaymaster" }, { - "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", - "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", + "constructorArguments": "", "isProxy": false, - "name": "ProtocolFee" + "name": "StorageGasOracle" }, { - "address": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", + "constructorArguments": "", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "InterchainGasPaymaster" }, { - "address": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f112", - "isProxy": false, - "name": "FallbackRoutingHook" + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" - }, - { - "address": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f112", - "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0x2d5918c3602F17937Ff982F7Bb7110774D3A24AD", - "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", - "isProxy": false, - "name": "PausableIsm" + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fb36672365C7c797028C400A61c58c0ECc53cD2", - "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", - "isProxy": false, - "name": "PausableIsm" - } - ], - "mode": [ - { - "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, - "name": "ProxyAdmin" + "name": "StorageGasOracle" }, { - "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", - "constructorArguments": "000000000000000000000000000000000000000000000000000000000000868b", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" + "name": "InterchainGasPaymaster" }, { - "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", - "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x61DDB465eEA5bc3708Cf8B53156aC91a77A2f029", - "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", - "isProxy": false, - "name": "PausableIsm" - }, - { - "address": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", + "constructorArguments": "", "isProxy": false, - "name": "MerkleTreeHook" + "name": "StorageGasOracle" }, { - "address": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000e2ee936bea8e42671c400ac96de198e06f2ba2a6", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "InterchainGasPaymaster" }, { - "address": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", - "constructorArguments": "", - "isProxy": false, - "name": "PausableHook" + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", - "constructorArguments": "", + "address": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", + "constructorArguments": "0000000000000000000000002f9db5616fa3fad1ab06cb2c906830ba63d135e3", "isProxy": false, - "name": "StorageGasOracle" + "name": "MerkleTreeHook" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", - "constructorArguments": "", + "address": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", + "constructorArguments": "0000000000000000000000002f9db5616fa3fad1ab06cb2c906830ba63d135e3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000008358d8291e3bedb04804975eea0fe9fe0fafb147", "isProxy": false, - "name": "InterchainGasPaymaster" + "name": "FallbackRoutingHook" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "address": "0x4E1c88DD261BEe2941e6c1814597e30F53330428", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000e2ee936bea8e42671c400ac96de198e06f2ba2a6", - "isProxy": false, - "name": "FallbackRoutingHook" - }, - { - "address": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", - "constructorArguments": "", - "isProxy": false, - "name": "PausableHook" - }, - { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xF5165f115ba4E1Adc09f0EB392232D65F219806a", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", + "constructorArguments": "000000000000000000000000f5165f115ba4e1adc09f0eb392232d65f219806a0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", - "constructorArguments": "", + "address": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, - "name": "StorageGasOracle" + "name": "ProtocolFee" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", - "constructorArguments": "", + "address": "0x1956848601549de5aa0c887892061fA5aB4f6fC4", + "constructorArguments": "0000000000000000000000002f9db5616fa3fad1ab06cb2c906830ba63d135e3", "isProxy": false, - "name": "InterchainGasPaymaster" + "name": "ValidatorAnnounce" + } + ], + "gnosis": [ + { + "address": "0x53642476e24E28c3218E8Da44eDEBB4adB9DE13e", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000064", + "isProxy": false, + "name": "Mailbox" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", + "constructorArguments": "00000000000000000000000053642476e24e28c3218e8da44edebb4adb9de13e00000000000000000000000081a92a1a272cb09d7b4970b07548463dc7ae0cb700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", - "constructorArguments": "", - "isProxy": false, - "name": "StorageGasOracle" - }, - { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", - "constructorArguments": "", + "address": "0x53642476e24E28c3218E8Da44eDEBB4adB9DE13e", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000064", "isProxy": false, - "name": "InterchainGasPaymaster" + "name": "Mailbox" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", + "constructorArguments": "00000000000000000000000053642476e24e28c3218e8da44edebb4adb9de13e00000000000000000000000081a92a1a272cb09d7b4970b07548463dc7ae0cb700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", - "constructorArguments": "", + "address": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, - "name": "StorageGasOracle" + "name": "ProtocolFee" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", - "constructorArguments": "", + "address": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, - "name": "InterchainGasPaymaster" + "name": "ProtocolFee" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "address": "0x87ED6926abc9E38b9C7C19f835B41943b622663c", + "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f", + "isProxy": false, + "name": "ValidatorAnnounce" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", - "constructorArguments": "", + "address": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c", + "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000002684c6f89e901987e1fdb7649dc5be0c57c61645", "isProxy": false, - "name": "StorageGasOracle" + "name": "FallbackRoutingHook" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6", "constructorArguments": "", "isProxy": false, - "name": "InterchainGasPaymaster" - }, - { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "name": "PausableHook" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", - "constructorArguments": "", + "address": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c", + "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000002684c6f89e901987e1fdb7649dc5be0c57c61645", "isProxy": false, - "name": "StorageGasOracle" + "name": "FallbackRoutingHook" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6", "constructorArguments": "", "isProxy": false, - "name": "InterchainGasPaymaster" - }, - { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "name": "PausableHook" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", - "constructorArguments": "", + "address": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c", + "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000002684c6f89e901987e1fdb7649dc5be0c57c61645", "isProxy": false, - "name": "StorageGasOracle" + "name": "FallbackRoutingHook" }, { - "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "address": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6", "constructorArguments": "", "isProxy": false, - "name": "InterchainGasPaymaster" + "name": "PausableHook" }, { - "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "address": "0x24f5E353dD03E103Ba2372F7D6FC0cf3A66f849c", + "constructorArguments": "000000000000000000000000ad09d78f4c6b9da2ae82b1d34107802d380bb74f000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000002684c6f89e901987e1fdb7649dc5be0c57c61645", + "isProxy": false, + "name": "FallbackRoutingHook" }, { - "address": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0xf728C884De5275a608dEC222dACd0f2BF2E23AB6", + "constructorArguments": "", "isProxy": false, - "name": "ProtocolFee" + "name": "PausableHook" }, { - "address": "0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", + "address": "0x223F7D3f27E6272266AE4B5B91Fd5C7A2d798cD8", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "PausableIsm" } ], - "moonbeam": [ + "inevm": [ { - "address": "0xeE064c4Dd3d476676a40b7cab94Ef651444175c0", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000504", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" - }, - { - "address": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", - "constructorArguments": "000000000000000000000000ee064c4dd3d476676a40b7cab94ef651444175c00000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "name": "ProxyAdmin" }, { - "address": "0xeE064c4Dd3d476676a40b7cab94Ef651444175c0", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000504", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000009dd", "isProxy": false, "name": "Mailbox" }, { - "address": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", - "constructorArguments": "000000000000000000000000ee064c4dd3d476676a40b7cab94ef651444175c00000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "address": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "MerkleTreeHook" }, { - "address": "0x89e8C8735f3C3956168BAd6C31e95ecE19CaF507", + "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "constructorArguments": "00000000000000000000000089e8c8735f3c3956168bad6c31e95ece19caf5070000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "constructorArguments": "000000000000000000000000481171eb1aad17ede6a56005b7f1ab00c581ef130000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "address": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "MerkleTreeHook" }, { - "address": "0x89e8C8735f3C3956168BAd6C31e95ecE19CaF507", + "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "constructorArguments": "00000000000000000000000089e8c8735f3c3956168bad6c31e95ece19caf5070000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "constructorArguments": "000000000000000000000000481171eb1aad17ede6a56005b7f1ab00c581ef130000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xCd3e29A9D293DcC7341295996a118913F7c582c0", + "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, "name": "ProtocolFee" }, { - "address": "0x8c1001eBee6F25b31863A55EadfF149aF88B356F", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "address": "0x15ab173bDB6832f9b64276bA128659b0eD77730B", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "ValidatorAnnounce" }, { - "address": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xA376b27212D608324808923Add679A2c9FAFe9Da", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000000972954923a1e2b2aab04fa0c4a0797e5989cd65", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xA376b27212D608324808923Add679A2c9FAFe9Da", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000000972954923a1e2b2aab04fa0c4a0797e5989cd65", + "isProxy": false, + "name": "FallbackRoutingHook" + } + ], + "linea": [ + { + "address": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "constructorArguments": "", + "isProxy": false, + "name": "ProxyAdmin" + }, + { + "address": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", + "constructorArguments": "", + "isProxy": false, + "name": "ProxyAdmin" + }, + { + "address": "0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000e708", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x02d16BC51af6BfD153d67CA61754cF912E82C4d9", + "constructorArguments": "0000000000000000000000002f9db5616fa3fad1ab06cb2c906830ba63d135e30000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + }, + { + "address": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", + "constructorArguments": "00000000000000000000000002d16bc51af6bfd153d67ca61754cf912e82c4d9", "isProxy": false, "name": "MerkleTreeHook" }, { - "address": "0x89e8C8735f3C3956168BAd6C31e95ecE19CaF507", + "address": "0x4E1c88DD261BEe2941e6c1814597e30F53330428", + "constructorArguments": "00000000000000000000000002d16bc51af6bfd153d67ca61754cf912e82c4d9000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000c077a0cc408173349b1c9870c667b40fe3c01dd7", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "constructorArguments": "00000000000000000000000089e8c8735f3c3956168bad6c31e95ece19caf5070000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "MerkleTreeHook" + "name": "StorageGasOracle" }, { - "address": "0x89e8C8735f3C3956168BAd6C31e95ecE19CaF507", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "constructorArguments": "00000000000000000000000089e8c8735f3c3956168bad6c31e95ece19caf5070000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xCd3e29A9D293DcC7341295996a118913F7c582c0", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "ProtocolFee" + "name": "StorageGasOracle" }, { - "address": "0x8c1001eBee6F25b31863A55EadfF149aF88B356F", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "InterchainGasPaymaster" }, { - "address": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000087403b85f6f316e7ba91ba1fa6c3fb7dd4095547", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000087403b85f6f316e7ba91ba1fa6c3fb7dd4095547", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000087403b85f6f316e7ba91ba1fa6c3fb7dd4095547", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", - "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000087403b85f6f316e7ba91ba1fa6c3fb7dd4095547", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" - } - ], - "optimism": [ + "name": "InterchainGasPaymaster" + }, { - "address": "0xF00824861e4bFe5dFC769295A50006BA203BBc29", - "constructorArguments": "000000000000000000000000000000000000000000000000000000000000000a", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" + "name": "StorageGasOracle" }, { - "address": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", - "constructorArguments": "000000000000000000000000f00824861e4bfe5dfc769295a50006ba203bbc29000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "MerkleTreeHook" + "name": "StorageGasOracle" }, { - "address": "0x9b27988D926673fe99126DF4eed42A4aae8Bc01F", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "constructorArguments": "0000000000000000000000009b27988d926673fe99126df4eed42a4aae8bc01f000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "MerkleTreeHook" + "name": "StorageGasOracle" }, { - "address": "0x9b27988D926673fe99126DF4eed42A4aae8Bc01F", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "constructorArguments": "0000000000000000000000009b27988d926673fe99126df4eed42a4aae8bc01f000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xD71Ff941120e8f935b8b1E2C1eD72F5d140FF458", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "ProtocolFee" + "name": "StorageGasOracle" }, { - "address": "0x30f5b08e01808643221528BB2f7953bf2830Ef38", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "InterchainGasPaymaster" }, { - "address": "0xF00824861e4bFe5dFC769295A50006BA203BBc29", - "constructorArguments": "000000000000000000000000000000000000000000000000000000000000000a", + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" + "name": "StorageGasOracle" }, { - "address": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", - "constructorArguments": "000000000000000000000000f00824861e4bfe5dfc769295a50006ba203bbc29000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", + "constructorArguments": "00000000000000000000000002d16bc51af6bfd153d67ca61754cf912e82c4d9", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x4E1c88DD261BEe2941e6c1814597e30F53330428", + "constructorArguments": "00000000000000000000000002d16bc51af6bfd153d67ca61754cf912e82c4d9000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000c077a0cc408173349b1c9870c667b40fe3c01dd7", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0x5060eCD5dFAD300A90592C04e504600A7cdcF70b", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xc22B646edf6c9A43d83fDBc8D5E1B3c6DAfACb83", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", + "constructorArguments": "000000000000000000000000c22b646edf6c9a43d83fdbc8d5e1b3c6dafacb830000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x62B7592C1B6D1E43f4630B8e37f4377097840C05", + "constructorArguments": "00000000000000000000000002d16bc51af6bfd153d67ca61754cf912e82c4d9", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0x01aA8200936B475762Ee28D38B43a6cFe9076E52", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + } + ], + "mantapacific": [ + { + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false, + "name": "ProxyAdmin" + }, + { + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000a9", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", + "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", + "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f112", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f112", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x2d5918c3602F17937Ff982F7Bb7110774D3A24AD", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + }, + { + "address": "0x6Fb36672365C7c797028C400A61c58c0ECc53cD2", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + }, + { + "address": "0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + } + ], + "mode": [ + { + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false, + "name": "ProxyAdmin" + }, + { + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000868b", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x61DDB465eEA5bc3708Cf8B53156aC91a77A2f029", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + }, + { + "address": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000e2ee936bea8e42671c400ac96de198e06f2ba2a6", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000e2ee936bea8e42671c400ac96de198e06f2ba2a6", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", + "constructorArguments": "000000000000000000000000e0c452dda7506f0f4de5c8c1d383f7ad866ea4f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0xe243Fb51d91c5DE62afAbE44F7Ed2D4DC51668C6", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + } + ], + "moonbeam": [ + { + "address": "0xeE064c4Dd3d476676a40b7cab94Ef651444175c0", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000504", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", + "constructorArguments": "000000000000000000000000ee064c4dd3d476676a40b7cab94ef651444175c00000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xeE064c4Dd3d476676a40b7cab94Ef651444175c0", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000504", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", + "constructorArguments": "000000000000000000000000ee064c4dd3d476676a40b7cab94ef651444175c00000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x89e8C8735f3C3956168BAd6C31e95ecE19CaF507", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x14760E32C0746094cF14D97124865BC7F0F7368F", + "constructorArguments": "00000000000000000000000089e8c8735f3c3956168bad6c31e95ece19caf5070000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x89e8C8735f3C3956168BAd6C31e95ecE19CaF507", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x14760E32C0746094cF14D97124865BC7F0F7368F", + "constructorArguments": "00000000000000000000000089e8c8735f3c3956168bad6c31e95ece19caf5070000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xCd3e29A9D293DcC7341295996a118913F7c582c0", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x8c1001eBee6F25b31863A55EadfF149aF88B356F", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x89e8C8735f3C3956168BAd6C31e95ecE19CaF507", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x14760E32C0746094cF14D97124865BC7F0F7368F", + "constructorArguments": "00000000000000000000000089e8c8735f3c3956168bad6c31e95ece19caf5070000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x89e8C8735f3C3956168BAd6C31e95ecE19CaF507", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x14760E32C0746094cF14D97124865BC7F0F7368F", + "constructorArguments": "00000000000000000000000089e8c8735f3c3956168bad6c31e95ece19caf5070000000000000000000000006a9cda3dd1f593983bfd142eb35e6ce4137bd5ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xCd3e29A9D293DcC7341295996a118913F7c582c0", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x8c1001eBee6F25b31863A55EadfF149aF88B356F", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000087403b85f6f316e7ba91ba1fa6c3fb7dd4095547", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000087403b85f6f316e7ba91ba1fa6c3fb7dd4095547", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000087403b85f6f316e7ba91ba1fa6c3fb7dd4095547", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x6C2D6eA0969F7Aa0A850CCA88c7BFACa563B2361", + "constructorArguments": "000000000000000000000000094d03e751f49908080eff000dd6fd177fd44cc3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000087403b85f6f316e7ba91ba1fa6c3fb7dd4095547", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xe28f2AEEB42ee83CAd068D9A9a449c8b868C137f", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x58062b26193B28000Cd991Df767f3A2674502de8", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + } + ], + "optimism": [ + { + "address": "0xF00824861e4bFe5dFC769295A50006BA203BBc29", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000000a", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", + "constructorArguments": "000000000000000000000000f00824861e4bfe5dfc769295a50006ba203bbc29000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x9b27988D926673fe99126DF4eed42A4aae8Bc01F", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", + "constructorArguments": "0000000000000000000000009b27988d926673fe99126df4eed42a4aae8bc01f000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x9b27988D926673fe99126DF4eed42A4aae8Bc01F", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", + "constructorArguments": "0000000000000000000000009b27988d926673fe99126df4eed42a4aae8bc01f000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xD71Ff941120e8f935b8b1E2C1eD72F5d140FF458", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x30f5b08e01808643221528BB2f7953bf2830Ef38", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0xF00824861e4bFe5dFC769295A50006BA203BBc29", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000000a", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", + "constructorArguments": "000000000000000000000000f00824861e4bfe5dfc769295a50006ba203bbc29000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x9b27988D926673fe99126DF4eed42A4aae8Bc01F", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", + "constructorArguments": "0000000000000000000000009b27988d926673fe99126df4eed42a4aae8bc01f000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x9b27988D926673fe99126DF4eed42A4aae8Bc01F", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", + "constructorArguments": "0000000000000000000000009b27988d926673fe99126df4eed42a4aae8bc01f000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xD71Ff941120e8f935b8b1E2C1eD72F5d140FF458", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x30f5b08e01808643221528BB2f7953bf2830Ef38", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000068ee9bec9b4dbb61f69d9d293ae26a5aacb2e28f", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000068ee9bec9b4dbb61f69d9d293ae26a5aacb2e28f", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000068ee9bec9b4dbb61f69d9d293ae26a5aacb2e28f", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", + "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000068ee9bec9b4dbb61f69d9d293ae26a5aacb2e28f", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xD59a200cCEc5b3b1bF544dD7439De452D718f594", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + }, + { + "address": "0x33D3803215a32B84BFb6b1627367231EcD6F138F", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + }, + { + "address": "0xD84D8114cCfa5c2403E56aBf754da529430704F0", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + } + ], + "polygon": [ + { + "address": "0xA3Ae1C7dBAc1C9658708E6aCD271bfB93d87f8A3", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000089", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB", + "constructorArguments": "000000000000000000000000a3ae1c7dbac1c9658708e6acd271bfb93d87f8a3000000000000000000000000c4f7590c5d30be959225dc75640657954a86b98000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xA3Ae1C7dBAc1C9658708E6aCD271bfB93d87f8A3", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000089", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB", + "constructorArguments": "000000000000000000000000a3ae1c7dbac1c9658708e6acd271bfb93d87f8a3000000000000000000000000c4f7590c5d30be959225dc75640657954a86b98000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xF8F3629e308b4758F8396606405989F8D8C9c578", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5", + "constructorArguments": "0000000000000000000000005d934f4e2f797775e53561bb72aca21ba36b96bb", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0xF8F3629e308b4758F8396606405989F8D8C9c578", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5", + "constructorArguments": "0000000000000000000000005d934f4e2f797775e53561bb72aca21ba36b96bb", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0x6741e91fFDC31c7786E3684427c628dad06299B0", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + } + ], + "polygonzkevm": [ + { + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false, + "name": "ProxyAdmin" + }, + { + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000044d", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", + "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", + "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false, + "name": "ProxyAdmin" + }, + { + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000044d", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", + "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", + "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "ProtocolFee" + }, + { + "address": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x784b9D0f4eF9fb8444DfB5d24AB221C9D1A85395", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + } + ], + "redstone": [ + { + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false, + "name": "ProxyAdmin" + }, + { + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000002b2", + "isProxy": false, + "name": "Mailbox" + }, + { + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a70000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x79b3D752cc9494eCB93800712471a7a62954C8AE", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" + }, + { + "address": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000008f1e22d309baa69d398a03cc88e9b46037e988aa", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d", + "isProxy": false, + "name": "MerkleTreeHook" + }, + { + "address": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000008f1e22d309baa69d398a03cc88e9b46037e988aa", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", + "isProxy": false, + "name": "StorageGasOracle" + }, + { + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", "isProxy": false, - "name": "MerkleTreeHook" + "name": "StorageGasOracle" }, { - "address": "0x9b27988D926673fe99126DF4eed42A4aae8Bc01F", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "constructorArguments": "0000000000000000000000009b27988d926673fe99126df4eed42a4aae8bc01f000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", "isProxy": false, - "name": "MerkleTreeHook" + "name": "StorageGasOracle" }, { - "address": "0x9b27988D926673fe99126DF4eed42A4aae8Bc01F", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "constructorArguments": "0000000000000000000000009b27988d926673fe99126df4eed42a4aae8bc01f000000000000000000000000e047cb95fb3b7117989e911c6afb34771183fc3500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xD71Ff941120e8f935b8b1E2C1eD72F5d140FF458", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", "isProxy": false, - "name": "ProtocolFee" + "name": "StorageGasOracle" }, { - "address": "0x30f5b08e01808643221528BB2f7953bf2830Ef38", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "InterchainGasPaymaster" }, { - "address": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000068ee9bec9b4dbb61f69d9d293ae26a5aacb2e28f", - "isProxy": false, - "name": "FallbackRoutingHook" + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "StorageGasOracle" }, { - "address": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000068ee9bec9b4dbb61f69d9d293ae26a5aacb2e28f", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "InterchainGasPaymaster" }, { - "address": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", - "constructorArguments": "", - "isProxy": false, - "name": "PausableHook" + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000068ee9bec9b4dbb61f69d9d293ae26a5aacb2e28f", + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0xD4b132C6d4AA93A4247F1A91e1ED929c0572a43d", - "constructorArguments": "000000000000000000000000d4c1905bb1d26bc93dac913e13cacc278cdcc80d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000068ee9bec9b4dbb61f69d9d293ae26a5aacb2e28f", - "isProxy": false, - "name": "FallbackRoutingHook" + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0xf753CA2269c8A7693ce1808b5709Fbf36a65D47A", + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "StorageGasOracle" }, { - "address": "0xD59a200cCEc5b3b1bF544dD7439De452D718f594", - "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", "isProxy": false, - "name": "PausableIsm" + "name": "InterchainGasPaymaster" }, { - "address": "0x33D3803215a32B84BFb6b1627367231EcD6F138F", - "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", "isProxy": false, - "name": "PausableIsm" - } - ], - "polygon": [ + "name": "StorageGasOracle" + }, { - "address": "0xA3Ae1C7dBAc1C9658708E6aCD271bfB93d87f8A3", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000089", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" + "name": "InterchainGasPaymaster" }, { - "address": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB", - "constructorArguments": "000000000000000000000000a3ae1c7dbac1c9658708e6acd271bfb93d87f8a3000000000000000000000000c4f7590c5d30be959225dc75640657954a86b98000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xA3Ae1C7dBAc1C9658708E6aCD271bfB93d87f8A3", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000089", + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" + "name": "StorageGasOracle" }, { - "address": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB", - "constructorArguments": "000000000000000000000000a3ae1c7dbac1c9658708e6acd271bfb93d87f8a3000000000000000000000000c4f7590c5d30be959225dc75640657954a86b98000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", + "isProxy": false, + "name": "InterchainGasPaymaster" + }, + { + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xF8F3629e308b4758F8396606405989F8D8C9c578", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "constructorArguments": "", "isProxy": false, - "name": "ProtocolFee" + "name": "StorageGasOracle" }, { - "address": "0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5", - "constructorArguments": "0000000000000000000000005d934f4e2f797775e53561bb72aca21ba36b96bb", + "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "constructorArguments": "", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "InterchainGasPaymaster" }, { - "address": "0xF8F3629e308b4758F8396606405989F8D8C9c578", + "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", + "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" + }, + { + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, "name": "ProtocolFee" }, { - "address": "0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5", - "constructorArguments": "0000000000000000000000005d934f4e2f797775e53561bb72aca21ba36b96bb", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d", "isProxy": false, "name": "ValidatorAnnounce" }, { - "address": "0x6741e91fFDC31c7786E3684427c628dad06299B0", + "address": "0xD53Fdbb7537aCa82bAf7cCA7204088f15b52796a", "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, "name": "PausableIsm" } ], - "polygonzkevm": [ + "scroll": [ { - "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", "constructorArguments": "", "isProxy": false, "name": "ProxyAdmin" }, { - "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", - "constructorArguments": "000000000000000000000000000000000000000000000000000000000000044d", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000082750", "isProxy": false, "name": "Mailbox" }, { - "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", - "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "MerkleTreeHook" }, { - "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f1120000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "MerkleTreeHook" }, { - "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f1120000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "address": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, "name": "ProtocolFee" }, { - "address": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "ValidatorAnnounce" }, { - "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", "constructorArguments": "", "isProxy": false, "name": "ProxyAdmin" }, { - "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", - "constructorArguments": "000000000000000000000000000000000000000000000000000000000000044d", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000082750", "isProxy": false, "name": "Mailbox" }, { - "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", - "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "MerkleTreeHook" }, { - "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f1120000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "MerkleTreeHook" }, { - "address": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "constructorArguments": "000000000000000000000000bf12ef4b9f307463d3fb59c3604f294ddce287e20000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", + "constructorArguments": "000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f1120000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "address": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, "name": "ProtocolFee" }, { - "address": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", - "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", + "isProxy": false, + "name": "ValidatorAnnounce" + }, + { + "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000006119e37bd66406a1db74920ac79c15fb8411ba76", + "isProxy": false, + "name": "FallbackRoutingHook" + }, + { + "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", + "constructorArguments": "", + "isProxy": false, + "name": "PausableHook" + }, + { + "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000006119e37bd66406a1db74920ac79c15fb8411ba76", "isProxy": false, - "name": "ValidatorAnnounce" + "name": "FallbackRoutingHook" }, { - "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", "constructorArguments": "", "isProxy": false, "name": "PausableHook" }, { - "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", - "constructorArguments": "", + "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000006119e37bd66406a1db74920ac79c15fb8411ba76", "isProxy": false, - "name": "PausableHook" + "name": "FallbackRoutingHook" }, { - "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", "constructorArguments": "", "isProxy": false, "name": "PausableHook" }, { - "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", - "constructorArguments": "", + "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000006119e37bd66406a1db74920ac79c15fb8411ba76", "isProxy": false, - "name": "PausableHook" + "name": "FallbackRoutingHook" }, { - "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", + "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", "constructorArguments": "", "isProxy": false, "name": "PausableHook" }, { - "address": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", - "constructorArguments": "", + "address": "0x11Fa12DBaCe771E293e19743feA342e378C6341F", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, - "name": "PausableHook" + "name": "PausableIsm" } ], - "redstone": [ + "sei": [ { - "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", "constructorArguments": "", "isProxy": false, "name": "ProxyAdmin" }, { - "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000002b2", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000531", "isProxy": false, "name": "Mailbox" }, { - "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a70000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x79b3D752cc9494eCB93800712471a7a62954C8AE", + "address": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, "name": "PausableIsm" }, { - "address": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", - "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d", + "address": "0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "MerkleTreeHook" }, { - "address": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", - "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000008f1e22d309baa69d398a03cc88e9b46037e988aa", + "address": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000ca1b69fa4c4a7c7fd839bc50867c589592bcfe49", "isProxy": false, "name": "FallbackRoutingHook" }, { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", + "address": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4", "constructorArguments": "", "isProxy": false, "name": "PausableHook" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", - "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882", - "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000008f1e22d309baa69d398a03cc88e9b46037e988aa", - "isProxy": false, - "name": "FallbackRoutingHook" - }, - { - "address": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", - "constructorArguments": "", - "isProxy": false, - "name": "PausableHook" - }, - { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", - "constructorArguments": "", - "isProxy": false, - "name": "StorageGasOracle" - }, - { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", - "constructorArguments": "", + "address": "0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, - "name": "InterchainGasPaymaster" - }, - { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "name": "MerkleTreeHook" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", - "constructorArguments": "", + "address": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000ca1b69fa4c4a7c7fd839bc50867c589592bcfe49", "isProxy": false, - "name": "StorageGasOracle" + "name": "FallbackRoutingHook" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4", "constructorArguments": "", "isProxy": false, - "name": "InterchainGasPaymaster" - }, - { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" + "name": "PausableHook" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "constructorArguments": "000000000000000000000000bda330ea8f3005c421c8088e638fbb64fa71b9e00000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "constructorArguments": "", "isProxy": false, - "name": "ProtocolFee" + "name": "StorageGasOracle" }, { "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", - "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d", - "isProxy": false, - "name": "ValidatorAnnounce" - } - ], - "scroll": [ - { - "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", "constructorArguments": "", "isProxy": false, - "name": "ProxyAdmin" - }, - { - "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000082750", - "isProxy": false, - "name": "Mailbox" + "name": "InterchainGasPaymaster" }, { - "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", - "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "constructorArguments": "000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f1120000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "constructorArguments": "000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f1120000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", - "isProxy": false, - "name": "ProtocolFee" - }, - { - "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "ValidatorAnnounce" - }, - { - "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, - "name": "ProxyAdmin" + "name": "StorageGasOracle" }, { - "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000082750", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", + "constructorArguments": "", "isProxy": false, - "name": "Mailbox" + "name": "InterchainGasPaymaster" }, { - "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", - "constructorArguments": "0000000000000000000000004ed7d626f1e96cd1c0401607bf70d95243e3ded10000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "constructorArguments": "000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f1120000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "MerkleTreeHook" - }, - { - "address": "0x481171eb1aad17eDE6a56005B7F1aB00C581ef13", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, "name": "StorageGasOracle" }, { - "address": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, "name": "InterchainGasPaymaster" }, { - "address": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "constructorArguments": "000000000000000000000000149db7afd694722747035d5aec7007ccb6f8f1120000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", "isProxy": true, "name": "TransparentUpgradeableProxy" }, { - "address": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", - "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", - "isProxy": false, - "name": "ProtocolFee" - }, - { - "address": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "ValidatorAnnounce" - }, - { - "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000006119e37bd66406a1db74920ac79c15fb8411ba76", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "StorageGasOracle" }, { - "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "InterchainGasPaymaster" }, { - "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000006119e37bd66406a1db74920ac79c15fb8411ba76", - "isProxy": false, - "name": "FallbackRoutingHook" + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", + "address": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", "constructorArguments": "", "isProxy": false, - "name": "PausableHook" + "name": "StorageGasOracle" }, { - "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000006119e37bd66406a1db74920ac79c15fb8411ba76", + "address": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0", + "constructorArguments": "", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "InterchainGasPaymaster" }, { - "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", - "constructorArguments": "", - "isProxy": false, - "name": "PausableHook" + "address": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", + "constructorArguments": "00000000000000000000000012582c7b0f43c6a667cbaa7fa8b112f7fb1e69f00000000000000000000000000761b0827849abbf7b0cc09ce14e1c93d87f500400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "name": "TransparentUpgradeableProxy" }, { - "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", - "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000006119e37bd66406a1db74920ac79c15fb8411ba76", + "address": "0x83c2DB237e93Ce52565AB110124f78fdf159E3f4", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", "isProxy": false, - "name": "FallbackRoutingHook" + "name": "ProtocolFee" }, { - "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", - "constructorArguments": "", + "address": "0x5332D1AC0A626D265298c14ff681c0A8D28dB86d", + "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, - "name": "PausableHook" + "name": "ValidatorAnnounce" } ], "viction": [ @@ -6001,6 +8671,12 @@ "constructorArguments": "0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", "isProxy": false, "name": "ValidatorAnnounce" + }, + { + "address": "0x7b75b29caD47e10146e29BBf7BD9025e021a7023", + "constructorArguments": "000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false, + "name": "PausableIsm" } ] } diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index 25e01b03d5..0a111dea82 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -7,7 +7,7 @@ import { environment } from './chains.js'; export const keyFunderConfig: KeyFunderConfig = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '7720875-20240531-072251', + tag: 'b134b04-20240605-133031', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron @@ -31,8 +31,10 @@ export const keyFunderConfig: KeyFunderConfig = { bsc: '5', celo: '3', ethereum: '0.5', + fraxtal: '0.2', gnosis: '5', inevm: '3', + linea: '0.2', mantapacific: '0.2', mode: '0.2', moonbeam: '5', @@ -41,6 +43,7 @@ export const keyFunderConfig: KeyFunderConfig = { polygonzkevm: '0.5', redstone: '0.2', scroll: '0.5', + sei: '10', viction: '3', zetachain: '20', }, @@ -53,8 +56,10 @@ export const keyFunderConfig: KeyFunderConfig = { bsc: '0.35', celo: '150', ethereum: '0.4', + fraxtal: '0', gnosis: '100', inevm: '0.05', + linea: '0', mantapacific: '0', mode: '0', moonbeam: '250', @@ -63,6 +68,7 @@ export const keyFunderConfig: KeyFunderConfig = { polygonzkevm: '0.05', redstone: '0', scroll: '0.05', + sei: '0', viction: '0.05', zetachain: '0', }, diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index 8fd3ca2aac..cb689e2970 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -16,7 +16,7 @@ "decimals": 9 }, "blast": { - "amount": "0.1", + "amount": "0.01649352", "decimals": 9 }, "bsc": { @@ -31,8 +31,28 @@ "amount": "20", "decimals": 9 }, + "fraxtal": { + "amount": "0.001000253", + "decimals": 9 + }, + "gnosis": { + "amount": "5.877696928", + "decimals": 9 + }, + "inevm": { + "amount": "0.1", + "decimals": 9 + }, + "injective": { + "amount": "700000000", + "decimals": 1 + }, + "linea": { + "amount": "0.110844655", + "decimals": 9 + }, "mantapacific": { - "amount": "0.100163166", + "amount": "0.101967574", "decimals": 9 }, "mode": { @@ -43,22 +63,22 @@ "amount": "125.0", "decimals": 9 }, + "neutron": { + "amount": "0.0053", + "decimals": 1 + }, "optimism": { "amount": "0.061126811", "decimals": 9 }, + "osmosis": { + "amount": "0.025", + "decimals": 1 + }, "polygon": { "amount": "101.76455238", "decimals": 9 }, - "gnosis": { - "amount": "3.236596353", - "decimals": 9 - }, - "scroll": { - "amount": "1.3231", - "decimals": 9 - }, "polygonzkevm": { "amount": "3.95", "decimals": 9 @@ -67,24 +87,20 @@ "amount": "0.0003", "decimals": 9 }, - "inevm": { - "amount": "0.1", + "scroll": { + "amount": "1.3231", + "decimals": 9 + }, + "sei": { + "amount": "1.0", "decimals": 9 }, "viction": { "amount": "0.25", "decimals": 9 }, - "neutron": { - "amount": "0.0053", - "decimals": 1 - }, - "injective": { - "amount": "700000000", - "decimals": 1 - }, "zetachain": { - "amount": "0.0001", + "amount": "10.1", "decimals": 9 } } diff --git a/typescript/infra/config/environments/mainnet3/index.ts b/typescript/infra/config/environments/mainnet3/index.ts index 94c76e53aa..fdc0e05e9a 100644 --- a/typescript/infra/config/environments/mainnet3/index.ts +++ b/typescript/infra/config/environments/mainnet3/index.ts @@ -14,6 +14,7 @@ import { agents } from './agent.js'; import { chainMetadataOverrides, environment as environmentName, + getRegistry, } from './chains.js'; import { core } from './core.js'; import { keyFunderConfig } from './funding.js'; @@ -24,14 +25,6 @@ import { bridgeAdapterConfigs, relayerConfig } from './liquidityLayer.js'; import { owners } from './owners.js'; import { supportedChainNames } from './supportedChainNames.js'; -const getRegistry = async (useSecrets = true): Promise => - getRegistryForEnvironment( - environmentName, - supportedChainNames, - chainMetadataOverrides, - useSecrets, - ); - export const environment: EnvironmentConfig = { environment: environmentName, supportedChainNames, diff --git a/typescript/infra/config/environments/mainnet3/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index cd76f9f2be..e201aa24d3 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -1767,6 +1767,68 @@ "name": "DomaingRoutingIsm" } ], + "fraxtal": [ + { + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false, + "name": "StaticMerkleRootMultisigIsmFactory" + }, + { + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true, + "name": "StaticMerkleRootMultisigIsm" + }, + { + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false, + "name": "StaticMessageIdMultisigIsmFactory" + }, + { + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true, + "name": "StaticMessageIdMultisigIsm" + }, + { + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false, + "name": "StaticAggregationIsmFactory" + }, + { + "address": "0x7f51A658837A315134A97ff8B586d71B726B7e61", + "constructorArguments": "", + "isProxy": true, + "name": "StaticAggregationIsm" + }, + { + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "", + "isProxy": false, + "name": "StaticAggregationHookFactory" + }, + { + "address": "0xDFF18Bf286c9cDd0fC653a28616460Cf7443F8EF", + "constructorArguments": "", + "isProxy": true, + "name": "StaticAggregationHook" + }, + { + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "", + "isProxy": false, + "name": "DomainRoutingIsmFactory" + }, + { + "address": "0x3a49EcAC1031612D66fa20D6F40f214aCeAc2B4B", + "constructorArguments": "", + "isProxy": true, + "name": "DomaingRoutingIsm" + } + ], "gnosis": [ { "address": "0x8E273260EAd8B72A085B19346A676d355740e875", @@ -2173,6 +2235,68 @@ "name": "DomaingRoutingIsm" } ], + "linea": [ + { + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false, + "name": "StaticMerkleRootMultisigIsmFactory" + }, + { + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true, + "name": "StaticMerkleRootMultisigIsm" + }, + { + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false, + "name": "StaticMessageIdMultisigIsmFactory" + }, + { + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true, + "name": "StaticMessageIdMultisigIsm" + }, + { + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false, + "name": "StaticAggregationIsmFactory" + }, + { + "address": "0x7f51A658837A315134A97ff8B586d71B726B7e61", + "constructorArguments": "", + "isProxy": true, + "name": "StaticAggregationIsm" + }, + { + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "", + "isProxy": false, + "name": "StaticAggregationHookFactory" + }, + { + "address": "0xDFF18Bf286c9cDd0fC653a28616460Cf7443F8EF", + "constructorArguments": "", + "isProxy": true, + "name": "StaticAggregationHook" + }, + { + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "", + "isProxy": false, + "name": "DomainRoutingIsmFactory" + }, + { + "address": "0x3a49EcAC1031612D66fa20D6F40f214aCeAc2B4B", + "constructorArguments": "", + "isProxy": true, + "name": "DomaingRoutingIsm" + } + ], "mantapacific": [ { "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", @@ -3323,6 +3447,68 @@ "name": "DomaingRoutingIsm" } ], + "sei": [ + { + "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" + } + ], "viction": [ { "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index 5a0042c8ee..ab36b8a4b0 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -9,18 +9,22 @@ export const supportedChainNames = [ 'bsc', 'celo', 'ethereum', + 'fraxtal', 'gnosis', 'inevm', 'injective', + 'linea', 'mantapacific', 'mode', 'moonbeam', 'neutron', 'optimism', + 'osmosis', 'polygon', 'polygonzkevm', 'redstone', 'scroll', + 'sei', 'viction', 'zetachain', ]; diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index dac9798f6e..314984d8b2 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,24 +1,28 @@ { - "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" + "arbitrum": "3537.12", + "ancient8": "3537.12", + "avalanche": "32.04", + "base": "3537.12", + "blast": "3537.12", + "bsc": "611.69", + "celo": "0.709793", + "ethereum": "3537.12", + "fraxtal": "3519.8", + "gnosis": "1.001", + "inevm": "28.61", + "injective": "28.61", + "linea": "3537.12", + "mantapacific": "3537.12", + "mode": "3537.12", + "moonbeam": "0.278261", + "neutron": "0.623705", + "optimism": "3537.12", + "osmosis": "0.649286", + "polygon": "0.643148", + "polygonzkevm": "3537.12", + "redstone": "3537.12", + "scroll": "3537.12", + "sei": "0.477119", + "viction": "0.404896", + "zetachain": "1.16" } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 444bc70f25..2650929694 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -164,6 +164,18 @@ export const validatorChainConfig = ( 'optimism', ), }, + osmosis: { + interval: 5, + reorgPeriod: getReorgPeriod('osmosis'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xea483af11c19fa41b16c31d1534c2a486a92bcac'], + [Contexts.ReleaseCandidate]: [], + [Contexts.Neutron]: [], + }, + 'osmosis', + ), + }, moonbeam: { interval: 5, reorgPeriod: getReorgPeriod('moonbeam'), @@ -256,6 +268,48 @@ export const validatorChainConfig = ( 'inevm', ), }, + fraxtal: { + interval: 5, + reorgPeriod: getReorgPeriod('fraxtal'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1'], + [Contexts.ReleaseCandidate]: [ + '0x8c772b730c8deb333dded14cb462e577a06283da', + ], + [Contexts.Neutron]: [], + }, + 'fraxtal', + ), + }, + linea: { + interval: 5, + reorgPeriod: getReorgPeriod('linea'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xf2d5409a59e0f5ae7635aff73685624904a77d94'], + [Contexts.ReleaseCandidate]: [ + '0xad4886b6f5f5088c7ae53b69d1ff5cfc2a17bec4', + ], + [Contexts.Neutron]: [], + }, + 'linea', + ), + }, + sei: { + interval: 5, + reorgPeriod: getReorgPeriod('sei'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5'], + [Contexts.ReleaseCandidate]: [ + '0x846e48a7e85e5403cc690a347e1ad3c3dca11b6e', + ], + [Contexts.Neutron]: [], + }, + 'sei', + ), + }, scroll: { interval: 5, reorgPeriod: getReorgPeriod('scroll'), diff --git a/typescript/infra/config/registry.ts b/typescript/infra/config/registry.ts index 8c8be46bb8..cf25e595ac 100644 --- a/typescript/infra/config/registry.ts +++ b/typescript/infra/config/registry.ts @@ -50,7 +50,7 @@ export function setRegistry(reg: FileSystemRegistry) { export function getRegistry(): FileSystemRegistry { if (!registry) { const registryUri = process.env.REGISTRY_URI || DEFAULT_REGISTRY_URI; - rootLogger.info({ registryUri }, 'Using registry URI'); + rootLogger.debug({ registryUri }, 'Using registry URI'); registry = new FileSystemRegistry({ uri: registryUri, logger: rootLogger.child({ module: 'infra-registry' }), diff --git a/typescript/infra/scripts/announce-validators.ts b/typescript/infra/scripts/announce-validators.ts index 09748de985..0d6e47fd1d 100644 --- a/typescript/infra/scripts/announce-validators.ts +++ b/typescript/infra/scripts/announce-validators.ts @@ -50,7 +50,7 @@ async function main() { const validator = await InfraS3Validator.fromStorageLocation(location); announcements.push({ storageLocation: validator.storageLocation(), - announcement: await validator.getAnnouncement(), + announcement: await validator.getSignedAnnouncement(), }); } else if (location.startsWith('file://')) { const announcementFilepath = path.join( @@ -97,7 +97,7 @@ async function main() { ); announcements.push({ storageLocation: validator.storageLocation(), - announcement: await validator.getAnnouncement(), + announcement: await validator.getSignedAnnouncement(), }); chains.push(validatorChain); } diff --git a/typescript/infra/scripts/check-deploy.ts b/typescript/infra/scripts/check-deploy.ts index 47160c889d..d09a20749a 100644 --- a/typescript/infra/scripts/check-deploy.ts +++ b/typescript/infra/scripts/check-deploy.ts @@ -26,6 +26,7 @@ import { Modules, getAddresses, getArgs as getRootArgs, + withChain, withContext, withModuleAndFork, } from './agent-utils.js'; @@ -33,14 +34,14 @@ import { getEnvironmentConfig, getHyperlaneCore } from './core-utils.js'; import { getHelloWorldApp } from './helloworld/utils.js'; function getArgs() { - return withModuleAndFork(withContext(getRootArgs())) + return withChain(withModuleAndFork(withContext(getRootArgs()))) .boolean('govern') .default('govern', false) .alias('g', 'govern').argv; } async function check() { - const { fork, govern, module, environment, context } = await getArgs(); + const { fork, govern, module, environment, context, chain } = await getArgs(); const envConfig = getEnvironmentConfig(environment); let multiProvider = await envConfig.getMultiProvider(); @@ -64,7 +65,10 @@ async function check() { } } - const { core, chainAddresses } = await getHyperlaneCore(environment); + const { core, chainAddresses } = await getHyperlaneCore( + environment, + multiProvider, + ); const ismFactory = HyperlaneIsmFactory.fromAddressesMap( chainAddresses, multiProvider, @@ -146,6 +150,11 @@ async function check() { if (govern) { await governor.govern(false, fork); } + } else if (chain) { + await governor.checker.checkChain(chain); + if (govern) { + await governor.govern(true, chain); + } } else { await governor.checker.check(); if (govern) { diff --git a/typescript/infra/scripts/deploy.ts b/typescript/infra/scripts/deploy.ts index fc67190510..e7ef139661 100644 --- a/typescript/infra/scripts/deploy.ts +++ b/typescript/infra/scripts/deploy.ts @@ -2,6 +2,7 @@ import { ethers } from 'ethers'; import path from 'path'; import prompts from 'prompts'; +import { buildArtifact as coreBuildArtifact } from '@hyperlane-xyz/core/buildArtifact.js'; import { HelloWorldDeployer } from '@hyperlane-xyz/helloworld'; import { ChainMap, @@ -35,6 +36,7 @@ import { fetchExplorerApiKeys, } from '../src/deployment/verify.js'; import { impersonateAccount, useLocalProvider } from '../src/utils/fork.js'; +import { inCIMode } from '../src/utils/utils.js'; import { Modules, @@ -84,20 +86,16 @@ async function main() { multiProvider.setSharedSigner(signer); } - let contractVerifier; - if (buildArtifactPath) { - // fetch explorer API keys from GCP - const apiKeys = await fetchExplorerApiKeys(); - // extract build artifact contents - const buildArtifact = extractBuildArtifact(buildArtifactPath); - // instantiate verifier - contractVerifier = new ContractVerifier( - multiProvider, - apiKeys, - buildArtifact, - ExplorerLicenseType.MIT, - ); - } + // if none provided, instantiate a default verifier with the default core contract build artifact + // fetch explorer API keys from GCP + const contractVerifier = new ContractVerifier( + multiProvider, + inCIMode() ? {} : await fetchExplorerApiKeys(), + buildArtifactPath + ? extractBuildArtifact(buildArtifactPath) + : coreBuildArtifact, + ExplorerLicenseType.MIT, + ); let config: ChainMap = {}; let deployer: HyperlaneDeployer; diff --git a/typescript/infra/scripts/print-gas-prices.ts b/typescript/infra/scripts/print-gas-prices.ts index 61126c3716..4f94dd26aa 100644 --- a/typescript/infra/scripts/print-gas-prices.ts +++ b/typescript/infra/scripts/print-gas-prices.ts @@ -1,26 +1,26 @@ +import { Provider } from '@ethersproject/providers'; import { ethers } from 'ethers'; -import { - ChainMap, - MultiProtocolProvider, - ProviderType, -} from '@hyperlane-xyz/sdk'; +import { ChainMap, MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; +// Intentionally circumvent `mainnet3/index.ts` and `getEnvironmentConfig('mainnet3')` +// to avoid circular dependencies. +import { getRegistry as getMainnet3Registry } from '../config/environments/mainnet3/chains.js'; +import { supportedChainNames as mainnet3SupportedChainNames } from '../config/environments/mainnet3/supportedChainNames.js'; import { GasPriceConfig, getCosmosChainGasPrice, } from '../src/config/gas-oracle.js'; -import { getEnvironmentConfig } from './core-utils.js'; - async function main() { - const environmentConfig = getEnvironmentConfig('mainnet3'); - - const mpp = await environmentConfig.getMultiProtocolProvider(); + const registry = await getMainnet3Registry(); + const chainMetadata = await registry.getMetadata(); + const mpp = new MultiProtocolProvider(chainMetadata); const prices: ChainMap = Object.fromEntries( await Promise.all( - environmentConfig.supportedChainNames.map(async (chain) => [ + mainnet3SupportedChainNames.map(async (chain) => [ chain, await getGasPrice(mpp, chain), ]), @@ -34,16 +34,17 @@ async function getGasPrice( mpp: MultiProtocolProvider, chain: string, ): Promise { - const provider = mpp.getProvider(chain); - switch (provider.type) { - case ProviderType.EthersV5: { - const gasPrice = await provider.provider.getGasPrice(); + const protocolType = mpp.getProtocol(chain); + switch (protocolType) { + case ProtocolType.Ethereum: { + const provider = mpp.getProvider(chain); + const gasPrice = await (provider.provider as Provider).getGasPrice(); return { amount: ethers.utils.formatUnits(gasPrice, 'gwei'), decimals: 9, }; } - case ProviderType.CosmJsWasm: { + case ProtocolType.Cosmos: { const { amount } = await getCosmosChainGasPrice(chain); return { @@ -51,14 +52,14 @@ async function getGasPrice( decimals: 1, }; } - case ProviderType.SolanaWeb3: + case ProtocolType.Sealevel: // TODO get a reasonable value return { amount: '0.001', decimals: 9, }; default: - throw new Error(`Unsupported provider type: ${provider.type}`); + throw new Error(`Unsupported protocol type: ${protocolType}`); } } diff --git a/typescript/infra/scripts/print-token-prices.ts b/typescript/infra/scripts/print-token-prices.ts index b125bac957..6e912f6305 100644 --- a/typescript/infra/scripts/print-token-prices.ts +++ b/typescript/infra/scripts/print-token-prices.ts @@ -1,16 +1,18 @@ import { objMap, pick } from '@hyperlane-xyz/utils'; -import { getEnvironmentConfig } from './core-utils.js'; +// Intentionally circumvent `mainnet3/index.ts` and `getEnvironmentConfig('mainnet3')` +// to avoid circular dependencies. +import { getRegistry as getMainnet3Registry } from '../config/environments/mainnet3/chains.js'; +import { supportedChainNames as mainnet3SupportedChainNames } from '../config/environments/mainnet3/supportedChainNames.js'; const CURRENCY = 'usd'; async function main() { - const environmentConfig = getEnvironmentConfig('mainnet3'); - - const registry = await environmentConfig.getRegistry(); + const registry = await getMainnet3Registry(); + const chainMetadata = await registry.getMetadata(); const metadata = pick( await registry.getMetadata(), - environmentConfig.supportedChainNames, + mainnet3SupportedChainNames, ); const ids = objMap( diff --git a/typescript/infra/src/config/chain.ts b/typescript/infra/src/config/chain.ts index 51584fc373..f9062b49bd 100644 --- a/typescript/infra/src/config/chain.ts +++ b/typescript/infra/src/config/chain.ts @@ -1,4 +1,3 @@ -import { SecretManagerServiceClient } from '@google-cloud/secret-manager'; import { providers } from 'ethers'; import { IRegistry } from '@hyperlane-xyz/registry'; diff --git a/typescript/infra/src/govern/HyperlaneAppGovernor.ts b/typescript/infra/src/govern/HyperlaneAppGovernor.ts index cfe2243a87..3bbefbce16 100644 --- a/typescript/infra/src/govern/HyperlaneAppGovernor.ts +++ b/typescript/infra/src/govern/HyperlaneAppGovernor.ts @@ -77,7 +77,7 @@ export abstract class HyperlaneAppGovernor< } } - protected async sendCalls(chain: ChainName, confirm: boolean) { + protected async sendCalls(chain: ChainName, requestConfirmation: boolean) { const calls = this.calls[chain]; console.log(`\nFound ${calls.length} transactions for ${chain}`); const filterCalls = (submissionType: SubmissionType) => @@ -93,15 +93,16 @@ export abstract class HyperlaneAppGovernor< calls.map((c) => console.log(`> > ${c.description} (to: ${c.to} data: ${c.data})`), ); - const response = - !confirm || - (await prompts({ - type: 'confirm', - name: 'value', - message: 'Can you confirm?', - initial: false, - })); - return !!response; + + if (!requestConfirmation) return true; + + const { value: confirmed } = await prompts({ + type: 'confirm', + name: 'value', + message: 'Can you confirm?', + initial: false, + }); + return !!confirmed; } return false; }; @@ -157,15 +158,21 @@ export abstract class HyperlaneAppGovernor< protected async inferCallSubmissionTypes() { for (const chain of Object.keys(this.calls)) { - for (const call of this.calls[chain]) { - let submissionType = await this.inferCallSubmissionType(chain, call); - if (submissionType === SubmissionType.MANUAL) { - submissionType = await this.inferICAEncodedSubmissionType( - chain, - call, - ); + try { + for (const call of this.calls[chain]) { + let submissionType = await this.inferCallSubmissionType(chain, call); + if (submissionType === SubmissionType.MANUAL) { + submissionType = await this.inferICAEncodedSubmissionType( + chain, + call, + ); + } + call.submissionType = submissionType; } - call.submissionType = submissionType; + } catch (error) { + console.error( + `Error inferring call submission types for chain ${chain}: ${error}`, + ); } } } @@ -253,16 +260,34 @@ export abstract class HyperlaneAppGovernor< // This should implicitly check whether or not the owner is a gnosis // safe. if (!this.canPropose[chain].has(safeAddress)) { - this.canPropose[chain].set( - safeAddress, - await canProposeSafeTransactions( + try { + const canPropose = await canProposeSafeTransactions( signerAddress, chain, multiProvider, safeAddress, - ), - ); + ); + this.canPropose[chain].set(safeAddress, canPropose); + } catch (error) { + // if we hit this error, it's likely a custom safe chain + // so let's fallback to a manual submission + if ( + error instanceof Error && + (error.message.includes('Invalid MultiSend contract address') || + error.message.includes( + 'Invalid MultiSendCallOnly contract address', + )) + ) { + console.warn(`${error.message}: Setting submission type to MANUAL`); + return SubmissionType.MANUAL; + } else { + console.error( + `Failed to determine if signer can propose safe transactions: ${error}`, + ); + } + } } + // 2b. Check if calling from the owner/safeAddress will succeed. if ( this.canPropose[chain].get(safeAddress) && @@ -271,6 +296,7 @@ export abstract class HyperlaneAppGovernor< return SubmissionType.SAFE; } } + return SubmissionType.MANUAL; } diff --git a/typescript/sdk/src/aws/validator.ts b/typescript/sdk/src/aws/validator.ts index a60c05b0ab..11f91c576f 100644 --- a/typescript/sdk/src/aws/validator.ts +++ b/typescript/sdk/src/aws/validator.ts @@ -63,12 +63,17 @@ export class S3Validator extends BaseValidator { } async getAnnouncement(): Promise { + const { value } = await this.getSignedAnnouncement(); + return value; + } + + async getSignedAnnouncement(): Promise { const resp = await this.s3Bucket.getS3Obj(ANNOUNCEMENT_KEY); if (!resp) { throw new Error('No announcement found'); } - return resp.data.value; + return resp.data; } async getCheckpoint(index: number): Promise { diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 6dd1ba4c97..5428e94463 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -116,6 +116,14 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + fraxtal: { + threshold: 2, + validators: [ + '0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + ], + }, + fuji: { threshold: 2, validators: [ @@ -158,6 +166,15 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + linea: { + threshold: 2, + validators: [ + '0xf2d5409a59e0f5ae7635aff73685624904a77d94', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], + }, + mantapacific: { threshold: 5, validators: [ @@ -213,6 +230,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + osmosis: { + threshold: 1, + validators: ['0xea483af11c19fa41b16c31d1534c2a486a92bcac'], + }, + plumetestnet: { threshold: 1, validators: ['0xe765a214849f3ecdf00793b97d00422f2d408ea6'], @@ -264,6 +286,14 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + sei: { + threshold: 2, + validators: [ + '0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + ], + }, + sepolia: { threshold: 2, validators: [ diff --git a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts index 1f679ca62b..ca30468485 100644 --- a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts +++ b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts @@ -373,12 +373,23 @@ export class HyperlaneIsmFactory extends HyperlaneApp { destination, config.owner, ); - const tx = await domainRoutingIsmFactory.deploy( + // estimate gas + const estimatedGas = await domainRoutingIsmFactory.estimateGas.deploy( owner, safeConfigDomains, submoduleAddresses, overrides, ); + // add 10% buffer + const tx = await domainRoutingIsmFactory.deploy( + owner, + safeConfigDomains, + submoduleAddresses, + { + ...overrides, + gasLimit: estimatedGas.add(estimatedGas.div(10)), // 10% buffer + }, + ); receipt = await this.multiProvider.handleTx(destination, tx); // TODO: Break this out into a generalized function @@ -457,11 +468,19 @@ export class HyperlaneIsmFactory extends HyperlaneApp { `Deploying new ${threshold} of ${values.length} address set to ${chain}`, ); const overrides = this.multiProvider.getTransactionOverrides(chain); - const hash = await factory['deploy(address[],uint8)']( + + // estimate gas + const estimatedGas = await factory.estimateGas['deploy(address[],uint8)']( sorted, threshold, overrides, ); + // add 10% buffer + const hash = await factory['deploy(address[],uint8)'](sorted, threshold, { + ...overrides, + gasLimit: estimatedGas.add(estimatedGas.div(10)), // 10% buffer + }); + await this.multiProvider.handleTx(chain, hash); // TODO: add proxy verification artifact? } else { diff --git a/typescript/sdk/src/utils/gnosisSafe.js b/typescript/sdk/src/utils/gnosisSafe.js index 892785ec5d..0eeb86464e 100644 --- a/typescript/sdk/src/utils/gnosisSafe.js +++ b/typescript/sdk/src/utils/gnosisSafe.js @@ -16,9 +16,19 @@ export function getSafeService(chain, multiProvider) { export function getSafe(chain, multiProvider, safeAddress) { const signer = multiProvider.getSigner(chain); const ethAdapter = new EthersAdapter({ ethers, signerOrProvider: signer }); + + const domainId = multiProvider.getDomainId(chain); + const contractNetworks = { + [domainId]: { + multiSendAddress: safeAddress, + multiSendCallOnlyAddress: safeAddress, + }, + }; + return Safe.default.create({ ethAdapter, - safeAddress: safeAddress, + safeAddress, + contractNetworks, }); } From 9c7cf45c41f7cde15b4f39c4951ab77a4488ac27 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Tue, 18 Jun 2024 17:51:21 +0100 Subject: [PATCH 04/35] feat: reduce extraneous entries in generated registry/agent artifacts (#3988) - filters out remote domain metadata from configs written to disk ``` "ancient8": { // this gets removed "arbitrum": { "aggregationHook": "0xblahblahblah", "interchainSecurityModule": "0xblahblah" ...etc }, // keep the usual entries like this "aggregationHook": "0x1EF4ED658d542524d1D547ba2F94d3B038a55b8f", "batchContractAddress": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28", "blockExplorers": [ ...etc ``` - no longer include secret overrides in the configs written to disk - i.e. use public registry RPCs and chain metadata (want our output to be like that of update-agent-config, but with updated contract addresses only) --------- Signed-off-by: Paul Balaji --- typescript/infra/scripts/agent-utils.ts | 9 +++----- typescript/infra/src/deployment/deploy.ts | 25 ++++++++++++++------- typescript/infra/src/utils/utils.ts | 27 +++++++++++++++++++++-- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index 313af5d440..a0f0669983 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -4,7 +4,6 @@ import yargs, { Argv } from 'yargs'; import { ChainAddresses, IRegistry } from '@hyperlane-xyz/registry'; import { ChainMap, - ChainMetadata, ChainName, CoreConfig, MultiProtocolProvider, @@ -16,7 +15,6 @@ import { ProtocolType, objFilter, objMap, - objMerge, promiseObjAll, rootLogger, symmetricDifference, @@ -36,10 +34,6 @@ import { getCurrentKubernetesContext } from '../src/agents/index.js'; import { getCloudAgentKey } from '../src/agents/key-utils.js'; import { CloudAgentKey } from '../src/agents/keys.js'; import { RootAgentConfig } from '../src/config/agent/agent.js'; -import { - fetchProvider, - getSecretMetadataOverrides, -} from '../src/config/chain.js'; import { AgentEnvironment, DeployEnvironment, @@ -50,6 +44,7 @@ import { Role } from '../src/roles.js'; import { assertContext, assertRole, + filterRemoteDomainMetadata, getInfraPath, inCIMode, readJSONAtPath, @@ -424,6 +419,8 @@ export function writeAddresses( module: Modules, addressesMap: ChainMap>, ) { + addressesMap = filterRemoteDomainMetadata(addressesMap); + if (isRegistryModule(environment, module)) { for (const [chainName, addresses] of Object.entries(addressesMap)) { getRegistry().updateChain({ chainName, addresses }); diff --git a/typescript/infra/src/deployment/deploy.ts b/typescript/infra/src/deployment/deploy.ts index 4a418def79..55d713fd9d 100644 --- a/typescript/infra/src/deployment/deploy.ts +++ b/typescript/infra/src/deployment/deploy.ts @@ -11,7 +11,6 @@ import { } from '@hyperlane-xyz/sdk'; import { ProtocolType, - objFilter, objMap, objMerge, promiseObjAll, @@ -25,10 +24,12 @@ import { getAgentConfigJsonPath, writeAddresses, } from '../../scripts/agent-utils.js'; +import { getEnvironmentConfig } from '../../scripts/core-utils.js'; import { DeployEnvironment, envNameToAgentEnv } from '../config/environment.js'; import { getCosmosChainGasPrice } from '../config/gas-oracle.js'; import { chainIsProtocol, + filterRemoteDomainMetadata, readJSONAtPath, writeJsonAtPath, writeMergedJSONAtPath, @@ -121,16 +122,18 @@ export async function writeAgentConfig( multiProvider: MultiProvider, environment: DeployEnvironment, ) { - const addresses = getAddresses(environment, Modules.CORE); - const addressesForEnv = objFilter( - addresses, - (chain, _): _ is ChainAddresses => multiProvider.hasChain(chain), - ); + // Get the addresses for the environment + const addressesMap = getAddresses( + environment, + Modules.CORE, + ) as ChainMap; + const addressesForEnv = filterRemoteDomainMetadata(addressesMap); const core = HyperlaneCore.fromAddressesMap(addressesForEnv, multiProvider); + // Write agent config indexing from the deployed Mailbox which stores the block number at deployment const startBlocks = await promiseObjAll( - objMap(addressesForEnv, async (chain, _) => { + objMap(addressesForEnv, async (chain: string, _) => { // If the index.from is specified in the chain metadata, use that. const indexFrom = multiProvider.getChainMetadata(chain).index?.from; if (indexFrom !== undefined) { @@ -173,11 +176,17 @@ export async function writeAgentConfig( const agentConfig = buildAgentConfig( environmentChains, - multiProvider, + await getEnvironmentConfig(environment).getMultiProvider( + undefined, + undefined, + // Don't use secrets + false, + ), addressesForEnv as ChainMap, startBlocks, additionalConfig, ); + writeMergedJSONAtPath( getAgentConfigJsonPath(envNameToAgentEnv[environment]), agentConfig, diff --git a/typescript/infra/src/utils/utils.ts b/typescript/infra/src/utils/utils.ts index d3a8075fff..4982e7a740 100644 --- a/typescript/infra/src/utils/utils.ts +++ b/typescript/infra/src/utils/utils.ts @@ -8,8 +8,13 @@ import path, { dirname, join } from 'path'; import { fileURLToPath } from 'url'; import { parse as yamlParse } from 'yaml'; -import { ChainName, NativeToken } from '@hyperlane-xyz/sdk'; -import { ProtocolType, objMerge } from '@hyperlane-xyz/utils'; +import { ChainMap, ChainName, NativeToken } from '@hyperlane-xyz/sdk'; +import { + Address, + ProtocolType, + objFilter, + objMerge, +} from '@hyperlane-xyz/utils'; import { Contexts } from '../../config/contexts.js'; import { testChainNames } from '../../config/environments/test/chains.js'; @@ -273,3 +278,21 @@ export function getInfraPath() { export function inCIMode() { return process.env.CI === 'true'; } + +// Filter out chains that are not supported by the multiProvider +// Filter out any value that is not a string e.g. remote domain metadata +export function filterRemoteDomainMetadata( + addressesMap: ChainMap>, +): ChainMap> { + return Object.fromEntries( + Object.entries(addressesMap).map(([chain, addresses]) => [ + chain, + // Filter out any non-string writes + // e.g. remote domain metadata that might be present + objFilter( + addresses, + (_, value): value is string => typeof value === 'string', + ), + ]), + ); +} From bbbe93206fb91cbfc122d619d968ced448bfbe98 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Wed, 19 Jun 2024 11:02:28 +0100 Subject: [PATCH 05/35] chore: bump default ISM max depth from 5 to 7 (#3989) ### Description Needed for some Renzo messages that hit the max depth ### Drive-by changes - drive by to update the agent config with the updated registry ### Related issues ### Backward compatibility ### Testing --- rust/agents/relayer/src/msg/metadata/base.rs | 3 ++- rust/agents/relayer/src/msg/processor.rs | 1 - rust/agents/relayer/src/relayer.rs | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rust/agents/relayer/src/msg/metadata/base.rs b/rust/agents/relayer/src/msg/metadata/base.rs index 74449d10ee..1416a7f56e 100644 --- a/rust/agents/relayer/src/msg/metadata/base.rs +++ b/rust/agents/relayer/src/msg/metadata/base.rs @@ -278,8 +278,9 @@ pub struct BaseMetadataBuilder { allow_local_checkpoint_syncers: bool, metrics: Arc, db: HyperlaneRocksDB, - max_depth: u32, app_context_classifier: IsmAwareAppContextClassifier, + #[new(value = "7")] + max_depth: u32, } impl Debug for BaseMetadataBuilder { diff --git a/rust/agents/relayer/src/msg/processor.rs b/rust/agents/relayer/src/msg/processor.rs index 1c81c30174..664c1dc640 100644 --- a/rust/agents/relayer/src/msg/processor.rs +++ b/rust/agents/relayer/src/msg/processor.rs @@ -452,7 +452,6 @@ mod test { false, Arc::new(core_metrics), db.clone(), - 5, IsmAwareAppContextClassifier::new(Arc::new(MockMailboxContract::default()), vec![]), ) } diff --git a/rust/agents/relayer/src/relayer.rs b/rust/agents/relayer/src/relayer.rs index 4206c0584a..3be0f1e590 100644 --- a/rust/agents/relayer/src/relayer.rs +++ b/rust/agents/relayer/src/relayer.rs @@ -242,7 +242,6 @@ impl BaseAgent for Relayer { settings.allow_local_checkpoint_syncers, core.metrics.clone(), db, - 5, IsmAwareAppContextClassifier::new( mailboxes[destination].clone(), settings.metric_app_contexts.clone(), From 3bb9d0a767086edd04494f8200447ad84035bfc9 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 19 Jun 2024 12:13:28 +0100 Subject: [PATCH 06/35] fix(cosmos): validator checkpoint & agent indexing improvements (#3958) - propagates RPC errors to the indexing logic, so errors cause sleeps instead of overwhelming the RPCs. This also greatly reduces cosmos log noisiness: from 9.5k logs per min, to 2.5k logs per min. - checks for published checkpoints in reverse, to prioritize recent messages among those from before the validator was spun up - fixes a validator bug where errors in checkpoint publishing would cause the entire checkpoint queue to be reiterated through, from scratch - Builds on top of https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3887 so we can test this out on osmosis ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/agents/validator/src/submit.rs | 131 +++++++++--------- .../hyperlane-cosmos/src/interchain_gas.rs | 29 +--- rust/chains/hyperlane-cosmos/src/mailbox.rs | 26 +--- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 28 +--- .../hyperlane-cosmos/src/providers/rpc.rs | 15 +- rust/chains/hyperlane-cosmos/src/utils.rs | 31 ++++- rust/config/mainnet_config.json | 4 +- .../src/accumulator/incremental.rs | 2 +- rust/hyperlane-core/src/rpc_clients/retry.rs | 8 -- rust/hyperlane-core/src/types/indexing.rs | 8 +- .../programs/mailbox-test/src/functional.rs | 2 +- rust/utils/run-locally/src/cosmos/types.rs | 5 +- .../config/environments/mainnet3/agent.ts | 4 +- 13 files changed, 129 insertions(+), 164 deletions(-) diff --git a/rust/agents/validator/src/submit.rs b/rust/agents/validator/src/submit.rs index bc040ed56c..8f91f284fb 100644 --- a/rust/agents/validator/src/submit.rs +++ b/rust/agents/validator/src/submit.rs @@ -4,7 +4,7 @@ use std::time::{Duration, Instant}; use std::vec; use hyperlane_core::rpc_clients::call_and_retry_indefinitely; -use hyperlane_core::{ChainCommunicationError, ChainResult, MerkleTreeHook}; +use hyperlane_core::{ChainResult, MerkleTreeHook}; use prometheus::IntGauge; use tokio::time::sleep; use tracing::{debug, error, info}; @@ -61,17 +61,8 @@ impl ValidatorSubmitter { /// Runs idly forever once the target checkpoint is reached to avoid exiting the task. pub(crate) async fn backfill_checkpoint_submitter(self, target_checkpoint: Checkpoint) { let mut tree = IncrementalMerkle::default(); - call_and_retry_indefinitely(|| { - let target_checkpoint = target_checkpoint; - let self_clone = self.clone(); - Box::pin(async move { - self_clone - .submit_checkpoints_until_correctness_checkpoint(&mut tree, &target_checkpoint) - .await?; - Ok(()) - }) - }) - .await; + self.submit_checkpoints_until_correctness_checkpoint(&mut tree, &target_checkpoint) + .await; info!( ?target_checkpoint, @@ -132,21 +123,8 @@ impl ValidatorSubmitter { sleep(self.interval).await; continue; } - - tree = call_and_retry_indefinitely(|| { - let mut tree = tree; - let self_clone = self.clone(); - Box::pin(async move { - self_clone - .submit_checkpoints_until_correctness_checkpoint( - &mut tree, - &latest_checkpoint, - ) - .await?; - Ok(tree) - }) - }) - .await; + self.submit_checkpoints_until_correctness_checkpoint(&mut tree, &latest_checkpoint) + .await; self.metrics .latest_checkpoint_processed @@ -162,7 +140,7 @@ impl ValidatorSubmitter { &self, tree: &mut IncrementalMerkle, correctness_checkpoint: &Checkpoint, - ) -> ChainResult<()> { + ) { // This should never be called with a tree that is ahead of the correctness checkpoint. assert!( !tree_exceeds_checkpoint(correctness_checkpoint, tree), @@ -182,7 +160,14 @@ impl ValidatorSubmitter { while tree.count() as u32 <= correctness_checkpoint.index { if let Some(insertion) = self .message_db - .retrieve_merkle_tree_insertion_by_leaf_index(&(tree.count() as u32))? + .retrieve_merkle_tree_insertion_by_leaf_index(&(tree.count() as u32)) + .unwrap_or_else(|err| { + panic!( + "Error fetching merkle tree insertion for leaf index {}: {}", + tree.count(), + err + ) + }) { debug!( index = insertion.index(), @@ -225,9 +210,7 @@ impl ValidatorSubmitter { ?correctness_checkpoint, "Incorrect tree root, something went wrong" ); - return Err(ChainCommunicationError::CustomError( - "Incorrect tree root, something went wrong".to_string(), - )); + panic!("Incorrect tree root, something went wrong"); } if !checkpoint_queue.is_empty() { @@ -236,57 +219,71 @@ impl ValidatorSubmitter { queue_len = checkpoint_queue.len(), "Reached tree consistency" ); - - self.sign_and_submit_checkpoints(checkpoint_queue).await?; + self.sign_and_submit_checkpoints(checkpoint_queue).await; info!( index = checkpoint.index, "Signed all queued checkpoints until index" ); } - - Ok(()) } - /// Signs and submits any previously unsubmitted checkpoints. - async fn sign_and_submit_checkpoints( + async fn sign_and_submit_checkpoint( &self, - checkpoints: Vec, + checkpoint: CheckpointWithMessageId, ) -> ChainResult<()> { - let last_checkpoint = checkpoints.as_slice()[checkpoints.len() - 1]; - - for queued_checkpoint in checkpoints { - let existing = self - .checkpoint_syncer - .fetch_checkpoint(queued_checkpoint.index) - .await?; - if existing.is_some() { - debug!( - index = queued_checkpoint.index, - "Checkpoint already submitted" - ); - continue; - } - let signed_checkpoint = self.signer.sign(queued_checkpoint).await?; - self.checkpoint_syncer - .write_checkpoint(&signed_checkpoint) - .await?; - debug!( - index = queued_checkpoint.index, - "Signed and submitted checkpoint" - ); - - // TODO: move these into S3 implementations - // small sleep before signing next checkpoint to avoid rate limiting - sleep(Duration::from_millis(100)).await; + let existing = self + .checkpoint_syncer + .fetch_checkpoint(checkpoint.index) + .await?; + if existing.is_some() { + debug!(index = checkpoint.index, "Checkpoint already submitted"); + return Ok(()); } - + let signed_checkpoint = self.signer.sign(checkpoint).await?; self.checkpoint_syncer - .update_latest_index(last_checkpoint.index) + .write_checkpoint(&signed_checkpoint) .await?; + debug!(index = checkpoint.index, "Signed and submitted checkpoint"); + // TODO: move these into S3 implementations + // small sleep before signing next checkpoint to avoid rate limiting + sleep(Duration::from_millis(100)).await; Ok(()) } + + /// Signs and submits any previously unsubmitted checkpoints. + async fn sign_and_submit_checkpoints(&self, checkpoints: Vec) { + let last_checkpoint = checkpoints.as_slice()[checkpoints.len() - 1]; + // Submits checkpoints to the store in reverse order. This speeds up processing historic checkpoints (those before the validator is spun up), + // since those are the most likely to make messages become processable. + // A side effect is that new checkpoints will also be submitted in reverse order. + for queued_checkpoint in checkpoints.into_iter().rev() { + // certain checkpoint stores rate limit very aggressively, so we retry indefinitely + call_and_retry_indefinitely(|| { + let self_clone = self.clone(); + Box::pin(async move { + self_clone + .sign_and_submit_checkpoint(queued_checkpoint) + .await?; + Ok(()) + }) + }) + .await; + } + + call_and_retry_indefinitely(|| { + let self_clone = self.clone(); + Box::pin(async move { + self_clone + .checkpoint_syncer + .update_latest_index(last_checkpoint.index) + .await?; + Ok(()) + }) + }) + .await; + } } /// Returns whether the tree exceeds the checkpoint. diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 4444a56eaa..eff636c2e5 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,6 +1,5 @@ use async_trait::async_trait; use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; -use futures::future; use hyperlane_core::{ ChainCommunicationError, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexed, Indexer, InterchainGasPaymaster, @@ -9,12 +8,15 @@ use hyperlane_core::{ use once_cell::sync::Lazy; use std::ops::RangeInclusive; use tendermint::abci::EventAttribute; -use tracing::{instrument, warn}; +use tracing::instrument; use crate::{ rpc::{CosmosWasmIndexer, ParsedEvent, WasmIndexer}, signers::Signer, - utils::{CONTRACT_ADDRESS_ATTRIBUTE_KEY, CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64}, + utils::{ + execute_and_parse_log_futures, CONTRACT_ADDRESS_ATTRIBUTE_KEY, + CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64, + }, ConnectionConf, CosmosProvider, HyperlaneCosmosError, }; @@ -223,26 +225,7 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { }) .collect(); - // TODO: this can be refactored when we rework indexing, to be part of the block-by-block indexing - let result = future::join_all(logs_futures) - .await - .into_iter() - .flatten() - .map(|(logs, block_number)| { - if let Err(err) = &logs { - warn!(?err, ?block_number, "Failed to fetch logs for block"); - } - logs - }) - // Propagate errors from any of the queries. This will cause the entire range to be retried, - // including successful ones, but we don't have a way to handle partial failures in a range for now. - .collect::, _>>()? - .into_iter() - .flatten() - .map(|(log, meta)| (Indexed::new(log), meta)) - .collect(); - - Ok(result) + execute_and_parse_log_futures(logs_futures).await } async fn get_finalized_block_number(&self) -> ChainResult { diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 833b92b89f..41f45bd819 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -1,5 +1,4 @@ use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; -use futures::future; use std::{ fmt::{Debug, Formatter}, io::Cursor, @@ -8,14 +7,15 @@ use std::{ str::FromStr, }; -use crate::payloads::mailbox::{ - GeneralMailboxQuery, ProcessMessageRequest, ProcessMessageRequestInner, -}; use crate::payloads::{general, mailbox}; use crate::rpc::{CosmosWasmIndexer, ParsedEvent, WasmIndexer}; use crate::CosmosProvider; use crate::{address::CosmosAddress, types::tx_response_to_outcome}; use crate::{grpc::WasmProvider, HyperlaneCosmosError}; +use crate::{ + payloads::mailbox::{GeneralMailboxQuery, ProcessMessageRequest, ProcessMessageRequestInner}, + utils::execute_and_parse_log_futures, +}; use crate::{signers::Signer, utils::get_block_height_for_lag, ConnectionConf}; use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; @@ -371,23 +371,7 @@ impl Indexer for CosmosMailboxIndexer { }) .collect(); - // TODO: this can be refactored when we rework indexing, to be part of the block-by-block indexing - let result = future::join_all(logs_futures) - .await - .into_iter() - .flatten() - .filter_map(|(logs_res, block_number)| match logs_res { - Ok(logs) => Some(logs), - Err(err) => { - warn!(?err, ?block_number, "Failed to fetch logs for block"); - None - } - }) - .flatten() - .map(|(log, meta)| (log.into(), meta)) - .collect(); - - Ok(result) + execute_and_parse_log_futures(logs_futures).await } async fn get_finalized_block_number(&self) -> ChainResult { diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 54acdf80f0..cb4e6ba005 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -2,7 +2,6 @@ use std::{fmt::Debug, num::NonZeroU64, ops::RangeInclusive, str::FromStr}; use async_trait::async_trait; use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; -use futures::future; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, ChainCommunicationError, ChainResult, Checkpoint, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, @@ -10,17 +9,14 @@ use hyperlane_core::{ }; use once_cell::sync::Lazy; use tendermint::abci::EventAttribute; -use tracing::{instrument, warn}; +use tracing::instrument; use crate::{ grpc::WasmProvider, - payloads::{ - general::{self}, - merkle_tree_hook, - }, + payloads::{general, merkle_tree_hook}, rpc::{CosmosWasmIndexer, ParsedEvent, WasmIndexer}, utils::{ - get_block_height_for_lag, CONTRACT_ADDRESS_ATTRIBUTE_KEY, + execute_and_parse_log_futures, get_block_height_for_lag, CONTRACT_ADDRESS_ATTRIBUTE_KEY, CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64, }, ConnectionConf, CosmosProvider, HyperlaneCosmosError, Signer, @@ -304,23 +300,7 @@ impl Indexer for CosmosMerkleTreeHookIndexer { }) .collect(); - // TODO: this can be refactored when we rework indexing, to be part of the block-by-block indexing - let result = future::join_all(logs_futures) - .await - .into_iter() - .flatten() - .filter_map(|(logs_res, block_number)| match logs_res { - Ok(logs) => Some(logs), - Err(err) => { - warn!(?err, ?block_number, "Failed to fetch logs for block"); - None - } - }) - .flatten() - .map(|(log, meta)| (log.into(), meta)) - .collect(); - - Ok(result) + execute_and_parse_log_futures(logs_futures).await } /// Get the chain's latest block number that has reached finality diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 7648e879e0..b5b924def8 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,6 +1,5 @@ use async_trait::async_trait; use cosmrs::rpc::client::Client; -use hyperlane_core::rpc_clients::call_with_retry; use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, LogMeta, H256, U256}; use sha256::digest; use std::fmt::Debug; @@ -216,9 +215,7 @@ impl CosmosWasmIndexer { impl WasmIndexer for CosmosWasmIndexer { #[instrument(err, skip(self))] async fn get_finalized_block_number(&self) -> ChainResult { - let latest_block = - call_with_retry(move || Box::pin(Self::get_latest_block(self.provider.rpc().clone()))) - .await?; + let latest_block = Self::get_latest_block(self.provider.rpc().clone()).await?; let latest_height: u32 = latest_block .block .header @@ -242,11 +239,11 @@ impl WasmIndexer for CosmosWasmIndexer { let client = self.provider.rpc().clone(); debug!(?block_number, cursor_label, domain=?self.provider.domain, "Getting logs in block"); - let (block, block_results) = tokio::join!( - call_with_retry(|| { Box::pin(Self::get_block(client.clone(), block_number)) }), - call_with_retry(|| { Box::pin(Self::get_block_results(client.clone(), block_number)) }), - ); + // The two calls below could be made in parallel, but on cosmos rate limiting is a bigger problem + // than indexing latency, so we do them sequentially. + let block = Self::get_block(client.clone(), block_number).await?; + let block_results = Self::get_block_results(client.clone(), block_number).await?; - Ok(self.handle_txs(block?, block_results?, parser, cursor_label)) + Ok(self.handle_txs(block, block_results, parser, cursor_label)) } } diff --git a/rust/chains/hyperlane-cosmos/src/utils.rs b/rust/chains/hyperlane-cosmos/src/utils.rs index 898298f438..dfcf0190c2 100644 --- a/rust/chains/hyperlane-cosmos/src/utils.rs +++ b/rust/chains/hyperlane-cosmos/src/utils.rs @@ -1,8 +1,11 @@ use std::num::NonZeroU64; use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; -use hyperlane_core::ChainResult; +use futures::future; +use hyperlane_core::{ChainCommunicationError, ChainResult, Indexed, LogMeta}; use once_cell::sync::Lazy; +use tokio::task::JoinHandle; +use tracing::warn; use crate::grpc::{WasmGrpcProvider, WasmProvider}; @@ -31,6 +34,32 @@ pub(crate) async fn get_block_height_for_lag( Ok(block_height) } +#[allow(clippy::type_complexity)] +pub(crate) async fn execute_and_parse_log_futures>>( + logs_futures: Vec, ChainCommunicationError>, u32)>>, +) -> ChainResult, LogMeta)>> { + // TODO: this can be refactored when we rework indexing, to be part of the block-by-block indexing + let result = future::join_all(logs_futures) + .await + .into_iter() + .flatten() + .map(|(logs, block_number)| { + if let Err(err) = &logs { + warn!(?err, ?block_number, "Failed to fetch logs for block"); + } + logs + }) + // Propagate errors from any of the queries. This will cause the entire range to be retried, + // including successful ones, but we don't have a way to handle partial failures in a range for now. + // This is also why cosmos indexing should be run with small chunks (currently set to 5). + .collect::, _>>()? + .into_iter() + .flatten() + .map(|(log, meta)| (log.into(), meta)) + .collect(); + Ok(result) +} + #[cfg(test)] /// Helper function to create a Vec from a JSON string - /// crate::payloads::general::EventAttribute has a Deserialize impl while diff --git a/rust/config/mainnet_config.json b/rust/config/mainnet_config.json index 5be8bfff09..10a980d33e 100644 --- a/rust/config/mainnet_config.json +++ b/rust/config/mainnet_config.json @@ -715,7 +715,7 @@ } ], "index": { - "chunk": 25, + "chunk": 5, "from": 58419500 }, "interchainGasPaymaster": "0x27ae52298e5b53b34b7ae0ca63e05845c31e1f59", @@ -1007,7 +1007,7 @@ } ], "index": { - "chunk": 50, + "chunk": 5, "from": 4000000 }, "interchainGasPaymaster": "0x504ee9ac43ec5814e00c7d21869a90ec52becb489636bdf893b7df9d606b5d67", diff --git a/rust/hyperlane-core/src/accumulator/incremental.rs b/rust/hyperlane-core/src/accumulator/incremental.rs index 0c265202e8..5595bbc8cf 100644 --- a/rust/hyperlane-core/src/accumulator/incremental.rs +++ b/rust/hyperlane-core/src/accumulator/incremental.rs @@ -7,7 +7,7 @@ use crate::accumulator::{ H256, TREE_DEPTH, ZERO_HASHES, }; -#[derive(BorshDeserialize, BorshSerialize, Debug, Clone, Copy, new, PartialEq, Eq)] +#[derive(BorshDeserialize, BorshSerialize, Debug, Clone, new, PartialEq, Eq)] /// An incremental merkle tree, modeled on the eth2 deposit contract pub struct IncrementalMerkle { /// The branch of the tree diff --git a/rust/hyperlane-core/src/rpc_clients/retry.rs b/rust/hyperlane-core/src/rpc_clients/retry.rs index b5c4e0bd72..7e60cf8de6 100644 --- a/rust/hyperlane-core/src/rpc_clients/retry.rs +++ b/rust/hyperlane-core/src/rpc_clients/retry.rs @@ -34,14 +34,6 @@ pub async fn call_and_retry_n_times( )) } -/// Retry calling a fallible async function a predefined number of times -#[instrument(err, skip(f))] -pub async fn call_with_retry( - f: impl FnMut() -> Pin> + Send>>, -) -> ChainResult { - call_and_retry_n_times(f, DEFAULT_MAX_RPC_RETRIES).await -} - /// Retry calling a fallible async function indefinitely, until it succeeds pub async fn call_and_retry_indefinitely( f: impl FnMut() -> Pin> + Send>>, diff --git a/rust/hyperlane-core/src/types/indexing.rs b/rust/hyperlane-core/src/types/indexing.rs index 5a7cfc48e3..93ec355a69 100644 --- a/rust/hyperlane-core/src/types/indexing.rs +++ b/rust/hyperlane-core/src/types/indexing.rs @@ -1,6 +1,6 @@ use derive_new::new; -use crate::{HyperlaneMessage, MerkleTreeInsertion, Sequenced}; +use crate::{HyperlaneMessage, InterchainGasPayment, MerkleTreeInsertion, Sequenced}; /// Wrapper struct that adds indexing information to a type #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, new)] @@ -73,3 +73,9 @@ impl From for Indexed { Indexed::new(value).with_sequence(sequence as _) } } + +impl From for Indexed { + fn from(value: InterchainGasPayment) -> Self { + Indexed::new(value) + } +} diff --git a/rust/sealevel/programs/mailbox-test/src/functional.rs b/rust/sealevel/programs/mailbox-test/src/functional.rs index 088dc7da74..99ad693051 100644 --- a/rust/sealevel/programs/mailbox-test/src/functional.rs +++ b/rust/sealevel/programs/mailbox-test/src/functional.rs @@ -212,7 +212,7 @@ async fn test_dispatch_from_eoa() { local_domain: LOCAL_DOMAIN, outbox_bump_seed: mailbox_accounts.outbox_bump_seed, owner: Some(payer.pubkey()), - tree: expected_tree, + tree: expected_tree.clone(), }, ) .await; diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 120ed05afd..78a45e6c28 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -177,10 +177,7 @@ impl AgentConfig { amount: "0.05".to_string(), }, contract_address_bytes: 32, - index: AgentConfigIndex { - from: 1, - chunk: 100, - }, + index: AgentConfigIndex { from: 1, chunk: 5 }, } } } diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 39e201053d..afdcd76769 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -231,7 +231,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '59451d6-20240612-171611', + tag: '47fbe58-20240617-173324', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -265,7 +265,7 @@ const releaseCandidate: RootAgentConfig = { validators: { docker: { repo, - tag: 'c9c5d37-20240510-014327', + tag: '47fbe58-20240617-173324', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.ReleaseCandidate), From 030eaf120491c5a2ccafe14dd62b372143cf8494 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:00:06 +0100 Subject: [PATCH 07/35] chore: bump agent docker images (#3999) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/agent.ts | 8 ++++---- typescript/infra/config/environments/testnet4/agent.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index afdcd76769..5669865883 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -223,7 +223,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '59451d6-20240612-171611', + tag: '3bb9d0a-20240619-130157', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContexts, @@ -231,7 +231,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '47fbe58-20240617-173324', + tag: '3bb9d0a-20240619-130157', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -254,7 +254,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '939fa81-20240607-194607', + tag: '3bb9d0a-20240619-130157', }, // We're temporarily (ab)using the RC relayer as a way to increase // message throughput. @@ -265,7 +265,7 @@ const releaseCandidate: RootAgentConfig = { validators: { docker: { repo, - tag: '47fbe58-20240617-173324', + tag: '3bb9d0a-20240619-130157', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.ReleaseCandidate), diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index 4ce2ab88dd..c21678f4df 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -98,7 +98,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'c9c5d37-20240510-014327', + tag: '3bb9d0a-20240619-130157', }, blacklist: [ ...releaseCandidateHelloworldMatchingList, @@ -127,7 +127,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'e09a360-20240520-090014', + tag: '3bb9d0a-20240619-130157', }, chains: validatorChainConfig(Contexts.Hyperlane), }, @@ -149,7 +149,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'c9c5d37-20240510-014327', + tag: '3bb9d0a-20240619-130157', }, whitelist: [...releaseCandidateHelloworldMatchingList], gasPaymentEnforcement, @@ -159,7 +159,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'c9c5d37-20240510-014327', + tag: '3bb9d0a-20240619-130157', }, chains: validatorChainConfig(Contexts.ReleaseCandidate), }, From 6cff4a2a9e45f142ecee219d0ec1a926f672f850 Mon Sep 17 00:00:00 2001 From: Tien Dao Date: Thu, 20 Jun 2024 01:24:22 +0700 Subject: [PATCH 08/35] fix: prevent duplication in verification artifacts array (#4001) ## Enhance Artifact Deduplication in HyperlaneDeployer ### Description **Overview**: The `addVerificationArtifacts` method in the `HyperlaneDeployer` class previously added verification artifacts without checking for duplicates, potentially leading to redundant data that could affect performance and reliability. This PR introduces a mechanism to prevent such duplication by implementing a shallow comparison check before adding new artifacts. **Changes**: - Modified the `addVerificationArtifacts` method to include a shallow comparison against existing artifacts. - Used direct property comparisons to efficiently prevent the addition of duplicate entries. - Ensured that the comparison handles large ABI-encoded strings efficiently by comparing string references. **Benefits:** - Efficiency: Reduces unnecessary processing and storage by avoiding duplicate entries. - Accuracy: Ensures that the verification process uses a unique set of artifacts, improving the reliability of deployment verifications. - Performance: Minimizes the overhead associated with handling large sets of data, particularly with large ABI-encoded strings. **Testing:** - Added unit tests to verify that duplicates are not added to the artifacts array. - Ensured existing integration tests pass with the new changes, confirming backward compatibility and functional integrity. This update streamlines the deployment process by ensuring that only necessary and unique verification artifacts are considered, thereby optimizing both memory usage and processing time during contract deployments. --------- Co-authored-by: tiendn --- typescript/.changeset/tall-radios-grin.md | 5 ++ .../sdk/src/deploy/HyperlaneDeployer.ts | 10 +++- .../sdk/src/deploy/verify/utils.test.ts | 58 +++++++++++++++++++ typescript/sdk/src/deploy/verify/utils.ts | 25 ++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 typescript/.changeset/tall-radios-grin.md create mode 100644 typescript/sdk/src/deploy/verify/utils.test.ts diff --git a/typescript/.changeset/tall-radios-grin.md b/typescript/.changeset/tall-radios-grin.md new file mode 100644 index 0000000000..87e9cb5b25 --- /dev/null +++ b/typescript/.changeset/tall-radios-grin.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': major +--- + +fix(sdk): refactor `addVerificationArtifacts` for enhanced Artifact Deduplication in HyperlaneDeployer diff --git a/typescript/sdk/src/deploy/HyperlaneDeployer.ts b/typescript/sdk/src/deploy/HyperlaneDeployer.ts index d9fefa0e1e..e6845dda45 100644 --- a/typescript/sdk/src/deploy/HyperlaneDeployer.ts +++ b/typescript/sdk/src/deploy/HyperlaneDeployer.ts @@ -52,6 +52,7 @@ import { import { buildVerificationInput, getContractVerificationInput, + shouldAddVerificationInput, } from './verify/utils.js'; export interface DeployerOptions { @@ -184,11 +185,14 @@ export abstract class HyperlaneDeployer< artifacts: ContractVerificationInput[], ): void { this.verificationInputs[chain] = this.verificationInputs[chain] || []; + artifacts.forEach((artifact) => { - this.verificationInputs[chain].push(artifact); + if ( + shouldAddVerificationInput(this.verificationInputs, chain, artifact) + ) { + this.verificationInputs[chain].push(artifact); + } }); - - // TODO: deduplicate } protected async runIf( diff --git a/typescript/sdk/src/deploy/verify/utils.test.ts b/typescript/sdk/src/deploy/verify/utils.test.ts new file mode 100644 index 0000000000..5a0f079200 --- /dev/null +++ b/typescript/sdk/src/deploy/verify/utils.test.ts @@ -0,0 +1,58 @@ +import { expect } from 'chai'; + +import { TestChainName } from '../../consts/testChains.js'; +import { randomAddress } from '../../test/testUtils.js'; +import { ChainMap, ChainName } from '../../types.js'; + +import { ContractVerificationInput } from './types.js'; +import { shouldAddVerificationInput } from './utils.js'; + +describe('shouldAddVerificationInput', () => { + const addressA = randomAddress(); + const addressB = randomAddress(); + it('should return true if the artifact does not exist in the verification inputs', () => { + const verificationInputs: ChainMap = { + [TestChainName.test1]: [ + { + name: 'ContractA', + address: addressA, + constructorArguments: 'args', + isProxy: false, + }, + ], + }; + const newArtifact: ContractVerificationInput = { + name: 'ContractB', + address: addressB, + constructorArguments: 'argsB', + isProxy: true, + }; + const chain: ChainName = TestChainName.test1; + expect( + shouldAddVerificationInput(verificationInputs, chain, newArtifact), + ).to.equal(true); + }); + + it('should return false if the artifact already exists in the verification inputs', () => { + const verificationInputs: ChainMap = { + [TestChainName.test2]: [ + { + name: 'ContractA', + address: addressA, + constructorArguments: 'args', + isProxy: false, + }, + ], + }; + const existingArtifact: ContractVerificationInput = { + name: 'ContractA', + address: addressA, + constructorArguments: 'args', + isProxy: false, + }; + const chain: ChainName = TestChainName.test2; + expect( + shouldAddVerificationInput(verificationInputs, chain, existingArtifact), + ).to.equal(false); + }); +}); diff --git a/typescript/sdk/src/deploy/verify/utils.ts b/typescript/sdk/src/deploy/verify/utils.ts index 37b9d70893..f0717cd6c1 100644 --- a/typescript/sdk/src/deploy/verify/utils.ts +++ b/typescript/sdk/src/deploy/verify/utils.ts @@ -1,5 +1,9 @@ import { ethers, utils } from 'ethers'; +import { eqAddress } from '@hyperlane-xyz/utils'; + +import { ChainMap, ChainName } from '../../types.js'; + import { ContractVerificationInput } from './types.js'; export function formatFunctionArguments( @@ -44,3 +48,24 @@ export function getContractVerificationInput( const args = getConstructorArguments(contract, bytecode); return buildVerificationInput(name, contract.address, args, isProxy); } + +/** + * Check if the artifact should be added to the verification inputs. + * @param verificationInputs - The verification inputs for the chain. + * @param chain - The chain to check. + * @param artifact - The artifact to check. + * @returns + */ +export function shouldAddVerificationInput( + verificationInputs: ChainMap, + chain: ChainName, + artifact: ContractVerificationInput, +): boolean { + return !verificationInputs[chain].some( + (existingArtifact) => + existingArtifact.name === artifact.name && + eqAddress(existingArtifact.address, artifact.address) && + existingArtifact.constructorArguments === artifact.constructorArguments && + existingArtifact.isProxy === artifact.isProxy, + ); +} From f9bbdde76494510268a0de79c758e37e700c7ee6 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Wed, 19 Jun 2024 18:48:15 -0400 Subject: [PATCH 09/35] fix: derived token supply to 0 (#4010) ### Description Token deployer should always derive token metadata's total supply to 0, otherwise the collateral token's total supply will be minted initially on the synthetic, creating 2x the desired total supply. ### Related issues - Regression introduced by https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3820 - opens https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/4013 ### Backward compatibility Yes ### Testing Unit Tests --- .changeset/bright-horses-give.md | 5 +++++ typescript/sdk/src/token/deploy.ts | 15 ++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 .changeset/bright-horses-give.md diff --git a/.changeset/bright-horses-give.md b/.changeset/bright-horses-give.md new file mode 100644 index 0000000000..1e26c14e78 --- /dev/null +++ b/.changeset/bright-horses-give.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': patch +--- + +Fix initial total supply of synthetic token deployments to 0 diff --git a/typescript/sdk/src/token/deploy.ts b/typescript/sdk/src/token/deploy.ts index 2ad13c2f61..b6098a4973 100644 --- a/typescript/sdk/src/token/deploy.ts +++ b/typescript/sdk/src/token/deploy.ts @@ -87,6 +87,9 @@ abstract class TokenDeployer< multiProvider: MultiProvider, configMap: WarpRouteDeployConfig, ): Promise { + // this is used for synthetic token metadata and should always be 0 + const DERIVED_TOKEN_SUPPLY = 0; + for (const [chain, config] of Object.entries(configMap)) { if (isTokenMetadata(config)) { return config; @@ -95,7 +98,7 @@ abstract class TokenDeployer< if (isNativeConfig(config)) { const nativeToken = multiProvider.getChainMetadata(chain).nativeToken; if (nativeToken) { - return { totalSupply: 0, ...nativeToken }; + return { totalSupply: DERIVED_TOKEN_SUPPLY, ...nativeToken }; } } @@ -107,27 +110,25 @@ abstract class TokenDeployer< config.token, provider, ); - const [name, symbol, totalSupply] = await Promise.all([ + const [name, symbol] = await Promise.all([ erc721.name(), erc721.symbol(), - erc721.totalSupply(), ]); return { name, symbol, - totalSupply: totalSupply.toString(), + totalSupply: DERIVED_TOKEN_SUPPLY, }; } const erc20 = ERC20__factory.connect(config.token, provider); - const [name, symbol, totalSupply, decimals] = await Promise.all([ + const [name, symbol, decimals] = await Promise.all([ erc20.name(), erc20.symbol(), - erc20.totalSupply(), erc20.decimals(), ]); - return { name, symbol, totalSupply: totalSupply.toString(), decimals }; + return { name, symbol, decimals, totalSupply: DERIVED_TOKEN_SUPPLY }; } } From 683a96257e446c4901022d589b5a618ef9c9f9d8 Mon Sep 17 00:00:00 2001 From: Tien Dao Date: Thu, 20 Jun 2024 16:53:08 +0700 Subject: [PATCH 10/35] fix: reduce loop test igpconfig (#4005) ### Description Refactor `testIgpConfig` in `testUtils.ts` for Enhanced Readability and Maintainability by reduce loop ### Drive-by changes 1. **Constant Usage:** Introduced `OVERHEAD_COST` as a constant to replace the magic number `60000`, making the purpose of this value clearer and the code easier to update. 2. **Improved Readability:** By using descriptive names and constants, the function is now easier to understand at a glance, which is particularly beneficial for new contributors or during code reviews. 3. **Dynamic Configuration Logic:** Ensured that the configuration for `overhead` and `oracleConfig` is dynamically generated for each chain, excluding the current chain to simulate realistic test scenarios. These changes do not alter the logic but make the codebase cleaner and more maintainable. ### Related issues ### Backward compatibility ### Testing --------- Co-authored-by: tiendn --- typescript/.changeset/pink-mirrors-sneeze.md | 5 +++ typescript/sdk/src/test/testUtils.ts | 35 +++++++++++--------- 2 files changed, 25 insertions(+), 15 deletions(-) create mode 100644 typescript/.changeset/pink-mirrors-sneeze.md diff --git a/typescript/.changeset/pink-mirrors-sneeze.md b/typescript/.changeset/pink-mirrors-sneeze.md new file mode 100644 index 0000000000..207dab4e5e --- /dev/null +++ b/typescript/.changeset/pink-mirrors-sneeze.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': major +--- + +Refactor testIgpConfig function for clarity and maintainability diff --git a/typescript/sdk/src/test/testUtils.ts b/typescript/sdk/src/test/testUtils.ts index fc498469a1..5613d6be69 100644 --- a/typescript/sdk/src/test/testUtils.ts +++ b/typescript/sdk/src/test/testUtils.ts @@ -63,25 +63,30 @@ const TEST_ORACLE_CONFIG = { tokenExchangeRate: ethers.utils.parseUnits('1', 10), }; +const TEST_OVERHEAD_COST = 60000; + export function testIgpConfig( chains: ChainName[], owner = nonZeroAddress, ): ChainMap { return Object.fromEntries( - chains.map((local) => [ - local, - { - owner, - oracleKey: owner, - beneficiary: owner, - // TODO: these should be one map - overhead: Object.fromEntries( - exclude(local, chains).map((remote) => [remote, 60000]), - ), - oracleConfig: Object.fromEntries( - exclude(local, chains).map((remote) => [remote, TEST_ORACLE_CONFIG]), - ), - }, - ]), + chains.map((local) => { + const overhead: IgpConfig['overhead'] = {}; + const oracleConfig: IgpConfig['oracleConfig'] = {}; + exclude(local, chains).map((remote: ChainName) => { + overhead[remote] = TEST_OVERHEAD_COST; + oracleConfig[remote] = TEST_ORACLE_CONFIG; + }); + return [ + local, + { + owner, + oracleKey: owner, + beneficiary: owner, + overhead, + oracleConfig, + }, + ]; + }), ); } From 8ce2a71f2046bfc528889d789488659572013385 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Thu, 20 Jun 2024 12:26:59 +0100 Subject: [PATCH 11/35] chore: reconcile mainnet config json with registry (#4016) chore: reconcile mainnet config json with registry Signed-off-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- rust/config/mainnet_config.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/rust/config/mainnet_config.json b/rust/config/mainnet_config.json index 10a980d33e..e801d0ead9 100644 --- a/rust/config/mainnet_config.json +++ b/rust/config/mainnet_config.json @@ -1573,9 +1573,6 @@ }, { "http": "https://zetachain-athens-evm.blockpi.network/v1/rpc/public" - }, - { - "http": "https://zetachain-mainnet-archive.allthatnode.com:8545" } ], "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", From f227eec892af2d4162b96a69f3af5ffe49a7b278 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 20 Jun 2024 13:06:57 +0100 Subject: [PATCH 12/35] fix: e2e invariant flake (#4017) ### Description Context is explained in the comment, copying it here: ``` // TODO: Sometimes we find more logs than expected. This may either mean that gas is deducted twice for the same message due to a bug, // or that submitting the message transaction fails for some messages. Figure out which is the case and convert this check to // strict equality. // EDIT: Having had a quick look, it seems like there are some legitimate reverts happening in the confirm step // (`Transaction attempting to process message either reverted or was reorged`) // in which case more gas expenditure logs than messages are expected. ``` ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/utils/run-locally/src/invariants.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rust/utils/run-locally/src/invariants.rs b/rust/utils/run-locally/src/invariants.rs index 2191f2ac8f..18bc026c22 100644 --- a/rust/utils/run-locally/src/invariants.rs +++ b/rust/utils/run-locally/src/invariants.rs @@ -69,8 +69,14 @@ pub fn termination_invariants_met( .len(); // Zero insertion messages don't reach `submit` stage where gas is spent, so we only expect these logs for the other messages. - assert_eq!( - gas_expenditure_log_count as u32, total_messages_expected, + // TODO: Sometimes we find more logs than expected. This may either mean that gas is deducted twice for the same message due to a bug, + // or that submitting the message transaction fails for some messages. Figure out which is the case and convert this check to + // strict equality. + // EDIT: Having had a quick look, it seems like there are some legitimate reverts happening in the confirm step + // (`Transaction attempting to process message either reverted or was reorged`) + // in which case more gas expenditure logs than messages are expected. + assert!( + gas_expenditure_log_count as u32 >= total_messages_expected, "Didn't record gas payment for all delivered messages" ); From 47338f983db2add2013792331a59af121c174926 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 20 Jun 2024 13:17:10 +0100 Subject: [PATCH 13/35] fix: set resource requests for prometheus server & node exporter (#3998) ### Description See https://discord.com/channels/935678348330434570/935679524534911007/1252943931121864824 - an attempt to fix some intermittent issues we've seen with prometheus ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../src/infrastructure/monitoring/prometheus.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/typescript/infra/src/infrastructure/monitoring/prometheus.ts b/typescript/infra/src/infrastructure/monitoring/prometheus.ts index a4049fc29c..74f3c75002 100644 --- a/typescript/infra/src/infrastructure/monitoring/prometheus.ts +++ b/typescript/infra/src/infrastructure/monitoring/prometheus.ts @@ -84,9 +84,21 @@ async function getPrometheusConfig( ], }, ], + resources: { + requests: { + cpu: '200m', + memory: '3Gi', + }, + }, }, - nodeExporter: { + 'prometheus-node-exporter': { enabled: infraConfig.monitoring.prometheus.nodeExporterEnabled, + resources: { + requests: { + cpu: '50m', + memory: '100Mi', + }, + }, }, }; } From b758a5949cc83356a6016433df1cb480ca62e5ad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:41:45 +0000 Subject: [PATCH 14/35] Version Packages (#3991) This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @hyperlane-xyz/sdk@3.16.0 ### Minor Changes - 5cc64eb09: Add validator addresses for linea, fraxtal, sei. Estimate gas and add 10% buffer inside HyperlaneIsmFactory as well. ### Patch Changes - f9bbdde76: Fix initial total supply of synthetic token deployments to 0 - @hyperlane-xyz/core@3.16.0 - @hyperlane-xyz/utils@3.16.0 ## @hyperlane-xyz/core@3.16.0 ### Patch Changes - @hyperlane-xyz/utils@3.16.0 ## @hyperlane-xyz/cli@3.16.0 ### Patch Changes - Updated dependencies [f9bbdde76] - Updated dependencies [5cc64eb09] - @hyperlane-xyz/sdk@3.16.0 - @hyperlane-xyz/utils@3.16.0 ## @hyperlane-xyz/helloworld@3.16.0 ### Patch Changes - Updated dependencies [f9bbdde76] - Updated dependencies [5cc64eb09] - @hyperlane-xyz/sdk@3.16.0 - @hyperlane-xyz/core@3.16.0 ## @hyperlane-xyz/utils@3.16.0 ## @hyperlane-xyz/infra@3.16.0 ### Minor Changes - 5cc64eb09: Add support for new chains: linea, fraxtal, sei. Support osmosis remote. Drive-by fix to always fetch explorer API keys when running deploy script. ### Patch Changes - 5cc64eb09: Allow selecting a specific chain to govern in check-deploy script - Updated dependencies [f9bbdde76] - Updated dependencies [5cc64eb09] - @hyperlane-xyz/sdk@3.16.0 - @hyperlane-xyz/helloworld@3.16.0 - @hyperlane-xyz/utils@3.16.0 ## @hyperlane-xyz/ccip-server@3.16.0 Co-authored-by: github-actions[bot] --- .changeset/bright-horses-give.md | 5 ----- .changeset/cuddly-ways-grin.md | 7 ------- .changeset/five-eels-reflect.md | 6 ------ .changeset/tall-jeans-camp.md | 5 ----- solidity/CHANGELOG.md | 6 ++++++ solidity/package.json | 4 ++-- typescript/ccip-server/CHANGELOG.md | 2 ++ typescript/ccip-server/package.json | 2 +- typescript/cli/CHANGELOG.md | 9 +++++++++ typescript/cli/package.json | 6 +++--- typescript/cli/src/version.ts | 2 +- typescript/helloworld/CHANGELOG.md | 9 +++++++++ typescript/helloworld/package.json | 6 +++--- typescript/infra/CHANGELOG.md | 17 +++++++++++++++++ typescript/infra/package.json | 8 ++++---- typescript/sdk/CHANGELOG.md | 13 +++++++++++++ typescript/sdk/package.json | 6 +++--- typescript/utils/CHANGELOG.md | 2 ++ typescript/utils/package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 20 files changed, 90 insertions(+), 55 deletions(-) delete mode 100644 .changeset/bright-horses-give.md delete mode 100644 .changeset/cuddly-ways-grin.md delete mode 100644 .changeset/five-eels-reflect.md delete mode 100644 .changeset/tall-jeans-camp.md diff --git a/.changeset/bright-horses-give.md b/.changeset/bright-horses-give.md deleted file mode 100644 index 1e26c14e78..0000000000 --- a/.changeset/bright-horses-give.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': patch ---- - -Fix initial total supply of synthetic token deployments to 0 diff --git a/.changeset/cuddly-ways-grin.md b/.changeset/cuddly-ways-grin.md deleted file mode 100644 index 8c950149c5..0000000000 --- a/.changeset/cuddly-ways-grin.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperlane-xyz/infra': minor ---- - -Add support for new chains: linea, fraxtal, sei. -Support osmosis remote. -Drive-by fix to always fetch explorer API keys when running deploy script. diff --git a/.changeset/five-eels-reflect.md b/.changeset/five-eels-reflect.md deleted file mode 100644 index 26a64bda6e..0000000000 --- a/.changeset/five-eels-reflect.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Add validator addresses for linea, fraxtal, sei. -Estimate gas and add 10% buffer inside HyperlaneIsmFactory as well. diff --git a/.changeset/tall-jeans-camp.md b/.changeset/tall-jeans-camp.md deleted file mode 100644 index 37e3158345..0000000000 --- a/.changeset/tall-jeans-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/infra': patch ---- - -Allow selecting a specific chain to govern in check-deploy script diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index 4107a5ba8e..f8089d59ea 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,11 @@ # @hyperlane-xyz/core +## 3.16.0 + +### Patch Changes + +- @hyperlane-xyz/utils@3.16.0 + ## 3.15.1 ### Patch Changes diff --git a/solidity/package.json b/solidity/package.json index ce10f806f7..ee53a0c7ce 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -1,10 +1,10 @@ { "name": "@hyperlane-xyz/core", "description": "Core solidity contracts for Hyperlane", - "version": "3.15.1", + "version": "3.16.0", "dependencies": { "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "3.15.1", + "@hyperlane-xyz/utils": "3.16.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^v4.9.3", diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index 115debd5e4..19b944f349 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/ccip-server +## 3.16.0 + ## 3.15.1 ## 3.15.0 diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index 1b3f5c7928..64929084b3 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "3.15.1", + "version": "3.16.0", "description": "CCIP server", "typings": "dist/index.d.ts", "typedocMain": "src/index.ts", diff --git a/typescript/cli/CHANGELOG.md b/typescript/cli/CHANGELOG.md index 428039d50f..1089a543b8 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @hyperlane-xyz/cli +## 3.16.0 + +### Patch Changes + +- Updated dependencies [f9bbdde76] +- Updated dependencies [5cc64eb09] + - @hyperlane-xyz/sdk@3.16.0 + - @hyperlane-xyz/utils@3.16.0 + ## 3.15.1 ### Patch Changes diff --git a/typescript/cli/package.json b/typescript/cli/package.json index 77531e30fe..d88b1fe6c1 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,13 +1,13 @@ { "name": "@hyperlane-xyz/cli", - "version": "3.15.1", + "version": "3.16.0", "description": "A command-line utility for common Hyperlane operations", "dependencies": { "@aws-sdk/client-kms": "^3.577.0", "@aws-sdk/client-s3": "^3.577.0", "@hyperlane-xyz/registry": "1.3.0", - "@hyperlane-xyz/sdk": "3.15.1", - "@hyperlane-xyz/utils": "3.15.1", + "@hyperlane-xyz/sdk": "3.16.0", + "@hyperlane-xyz/utils": "3.16.0", "@inquirer/prompts": "^3.0.0", "asn1.js": "^5.4.1", "bignumber.js": "^9.1.1", diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index 871417df17..d244ae5296 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '3.15.1'; +export const VERSION = '3.16.0'; diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index 7b62ae8f62..e4fa352ebf 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,14 @@ # @hyperlane-xyz/helloworld +## 3.16.0 + +### Patch Changes + +- Updated dependencies [f9bbdde76] +- Updated dependencies [5cc64eb09] + - @hyperlane-xyz/sdk@3.16.0 + - @hyperlane-xyz/core@3.16.0 + ## 3.15.1 ### Patch Changes diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index f039a6893b..c1ccf26cb0 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/helloworld", "description": "A basic skeleton of an Hyperlane app", - "version": "3.15.1", + "version": "3.16.0", "dependencies": { - "@hyperlane-xyz/core": "3.15.1", + "@hyperlane-xyz/core": "3.16.0", "@hyperlane-xyz/registry": "1.3.0", - "@hyperlane-xyz/sdk": "3.15.1", + "@hyperlane-xyz/sdk": "3.16.0", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" }, diff --git a/typescript/infra/CHANGELOG.md b/typescript/infra/CHANGELOG.md index 8d4e38701c..b21d74c4ff 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,22 @@ # @hyperlane-xyz/infra +## 3.16.0 + +### Minor Changes + +- 5cc64eb09: Add support for new chains: linea, fraxtal, sei. + Support osmosis remote. + Drive-by fix to always fetch explorer API keys when running deploy script. + +### Patch Changes + +- 5cc64eb09: Allow selecting a specific chain to govern in check-deploy script +- Updated dependencies [f9bbdde76] +- Updated dependencies [5cc64eb09] + - @hyperlane-xyz/sdk@3.16.0 + - @hyperlane-xyz/helloworld@3.16.0 + - @hyperlane-xyz/utils@3.16.0 + ## 3.15.1 ### Patch Changes diff --git a/typescript/infra/package.json b/typescript/infra/package.json index 33b1706766..9bba689adb 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/infra", "description": "Infrastructure utilities for the Hyperlane Network", - "version": "3.15.1", + "version": "3.16.0", "dependencies": { "@arbitrum/sdk": "^3.0.0", "@aws-sdk/client-iam": "^3.74.0", @@ -13,10 +13,10 @@ "@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "3.15.1", + "@hyperlane-xyz/helloworld": "3.16.0", "@hyperlane-xyz/registry": "1.3.0", - "@hyperlane-xyz/sdk": "3.15.1", - "@hyperlane-xyz/utils": "3.15.1", + "@hyperlane-xyz/sdk": "3.16.0", + "@hyperlane-xyz/utils": "3.16.0", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@solana/web3.js": "^1.78.0", "asn1.js": "5.4.1", diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index d999027776..59a76d8e5c 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,18 @@ # @hyperlane-xyz/sdk +## 3.16.0 + +### Minor Changes + +- 5cc64eb09: Add validator addresses for linea, fraxtal, sei. + Estimate gas and add 10% buffer inside HyperlaneIsmFactory as well. + +### Patch Changes + +- f9bbdde76: Fix initial total supply of synthetic token deployments to 0 + - @hyperlane-xyz/core@3.16.0 + - @hyperlane-xyz/utils@3.16.0 + ## 3.15.1 ### Patch Changes diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index ba63cab439..326415d705 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,13 +1,13 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "3.15.1", + "version": "3.16.0", "dependencies": { "@aws-sdk/client-s3": "^3.74.0", "@cosmjs/cosmwasm-stargate": "^0.31.3", "@cosmjs/stargate": "^0.31.3", - "@hyperlane-xyz/core": "3.15.1", - "@hyperlane-xyz/utils": "3.15.1", + "@hyperlane-xyz/core": "3.16.0", + "@hyperlane-xyz/utils": "3.16.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@solana/spl-token": "^0.3.8", diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index a11397181a..62d15f3783 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/utils +## 3.16.0 + ## 3.15.1 ## 3.15.0 diff --git a/typescript/utils/package.json b/typescript/utils/package.json index e02d1c1df6..e924add190 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/utils", "description": "General utilities and types for the Hyperlane network", - "version": "3.15.1", + "version": "3.16.0", "dependencies": { "@cosmjs/encoding": "^0.31.3", "@solana/web3.js": "^1.78.0", diff --git a/yarn.lock b/yarn.lock index 529e0c6672..23694b4cb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5684,8 +5684,8 @@ __metadata: "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" "@hyperlane-xyz/registry": "npm:1.3.0" - "@hyperlane-xyz/sdk": "npm:3.15.1" - "@hyperlane-xyz/utils": "npm:3.15.1" + "@hyperlane-xyz/sdk": "npm:3.16.0" + "@hyperlane-xyz/utils": "npm:3.16.0" "@inquirer/prompts": "npm:^3.0.0" "@types/mocha": "npm:^10.0.1" "@types/node": "npm:^18.14.5" @@ -5713,12 +5713,12 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:3.15.1, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:3.16.0, @hyperlane-xyz/core@workspace:solidity": version: 0.0.0-use.local resolution: "@hyperlane-xyz/core@workspace:solidity" dependencies: "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:3.15.1" + "@hyperlane-xyz/utils": "npm:3.16.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -5769,13 +5769,13 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/helloworld@npm:3.15.1, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:3.16.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: - "@hyperlane-xyz/core": "npm:3.15.1" + "@hyperlane-xyz/core": "npm:3.16.0" "@hyperlane-xyz/registry": "npm:1.3.0" - "@hyperlane-xyz/sdk": "npm:3.15.1" + "@hyperlane-xyz/sdk": "npm:3.16.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -5822,10 +5822,10 @@ __metadata: "@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/providers": "npm:^5.7.2" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:3.15.1" + "@hyperlane-xyz/helloworld": "npm:3.16.0" "@hyperlane-xyz/registry": "npm:1.3.0" - "@hyperlane-xyz/sdk": "npm:3.15.1" - "@hyperlane-xyz/utils": "npm:3.15.1" + "@hyperlane-xyz/sdk": "npm:3.16.0" + "@hyperlane-xyz/utils": "npm:3.16.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" @@ -5885,15 +5885,15 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:3.15.1, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:3.16.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: "@aws-sdk/client-s3": "npm:^3.74.0" "@cosmjs/cosmwasm-stargate": "npm:^0.31.3" "@cosmjs/stargate": "npm:^0.31.3" - "@hyperlane-xyz/core": "npm:3.15.1" - "@hyperlane-xyz/utils": "npm:3.15.1" + "@hyperlane-xyz/core": "npm:3.16.0" + "@hyperlane-xyz/utils": "npm:3.16.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -5961,7 +5961,7 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/utils@npm:3.15.1, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:3.16.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: From c6ba381e4470eb804319a9f07c2e97125e7062a9 Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Thu, 20 Jun 2024 11:46:38 -0400 Subject: [PATCH 15/35] chore: add more multisigs (#3974) ### Description Add multisig owners for linea, mode and blast. Expected violations are mailbox,proxyadmin, and ism violations (since the routing ism expected owner is now different) --------- Co-authored-by: Yorke Rhodes --- .../config/environments/mainnet3/owners.ts | 3 +++ typescript/infra/scripts/check-deploy.ts | 18 ++++++++++++------ .../infra/src/govern/HyperlaneAppGovernor.ts | 3 +-- .../sdk/src/core/HyperlaneCoreChecker.ts | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/owners.ts b/typescript/infra/config/environments/mainnet3/owners.ts index bf1239efc3..63494751f2 100644 --- a/typescript/infra/config/environments/mainnet3/owners.ts +++ b/typescript/infra/config/environments/mainnet3/owners.ts @@ -39,6 +39,9 @@ export const safes: ChainMap
= { polygonzkevm: '0x1610f578D4d77Fc4ae7ce2DD9AA0b98A5Cd0a9b2', // injective: 'inj1632x8j35kenryam3mkrsez064sqg2y2fr0frzt', // solana: 'EzppBFV2taxWw8kEjxNYvby6q7W1biJEqwP3iC7YgRe3', + blast: '0xaCD1865B262C89Fb0b50dcc8fB095330ae8F35b5', + linea: '0xaCD1865B262C89Fb0b50dcc8fB095330ae8F35b5', + mode: '0xaCD1865B262C89Fb0b50dcc8fB095330ae8F35b5', }; export const DEPLOYER = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; diff --git a/typescript/infra/scripts/check-deploy.ts b/typescript/infra/scripts/check-deploy.ts index d09a20749a..bc14e0aeed 100644 --- a/typescript/infra/scripts/check-deploy.ts +++ b/typescript/infra/scripts/check-deploy.ts @@ -14,6 +14,7 @@ import { } from '@hyperlane-xyz/sdk'; import { Contexts } from '../config/contexts.js'; +import { DEPLOYER } from '../config/environments/mainnet3/owners.js'; import { getWarpConfig } from '../config/warp.js'; import { HyperlaneAppGovernor } from '../src/govern/HyperlaneAppGovernor.js'; import { HyperlaneCoreGovernor } from '../src/govern/HyperlaneCoreGovernor.js'; @@ -35,13 +36,16 @@ import { getHelloWorldApp } from './helloworld/utils.js'; function getArgs() { return withChain(withModuleAndFork(withContext(getRootArgs()))) + .boolean('asdeployer') + .default('asdeployer', false) .boolean('govern') .default('govern', false) .alias('g', 'govern').argv; } async function check() { - const { fork, govern, module, environment, context, chain } = await getArgs(); + const { fork, govern, module, environment, context, chain, asdeployer } = + await getArgs(); const envConfig = getEnvironmentConfig(environment); let multiProvider = await envConfig.getMultiProvider(); @@ -54,11 +58,13 @@ async function check() { [fork]: { blocks: { confirmations: 0 } }, }); - const owner = await resolveOrDeployAccountOwner( - multiProvider, - fork, - envConfig.core[fork].owner, - ); + const owner = asdeployer + ? DEPLOYER + : await resolveOrDeployAccountOwner( + multiProvider, + fork, + envConfig.core[fork].owner, + ); const signer = await impersonateAccount(owner, 1e18); multiProvider.setSigner(fork, signer); diff --git a/typescript/infra/src/govern/HyperlaneAppGovernor.ts b/typescript/infra/src/govern/HyperlaneAppGovernor.ts index 3bbefbce16..7225bfb46c 100644 --- a/typescript/infra/src/govern/HyperlaneAppGovernor.ts +++ b/typescript/infra/src/govern/HyperlaneAppGovernor.ts @@ -62,7 +62,6 @@ export abstract class HyperlaneAppGovernor< async govern(confirm = true, chain?: ChainName) { if (this.checker.violations.length === 0) return; - // 1. Produce calls from checker violations. await this.mapViolationsToCalls(); @@ -93,7 +92,6 @@ export abstract class HyperlaneAppGovernor< calls.map((c) => console.log(`> > ${c.description} (to: ${c.to} data: ${c.data})`), ); - if (!requestConfirmation) return true; const { value: confirmed } = await prompts({ @@ -102,6 +100,7 @@ export abstract class HyperlaneAppGovernor< message: 'Can you confirm?', initial: false, }); + return !!confirmed; } return false; diff --git a/typescript/sdk/src/core/HyperlaneCoreChecker.ts b/typescript/sdk/src/core/HyperlaneCoreChecker.ts index d91a218d3d..16a1a91ff8 100644 --- a/typescript/sdk/src/core/HyperlaneCoreChecker.ts +++ b/typescript/sdk/src/core/HyperlaneCoreChecker.ts @@ -39,7 +39,6 @@ export class HyperlaneCoreChecker extends HyperlaneAppChecker< return; } - await this.checkDomainOwnership(chain); await this.checkProxiedContracts(chain); await this.checkMailbox(chain); await this.checkBytecodes(chain); @@ -47,6 +46,7 @@ export class HyperlaneCoreChecker extends HyperlaneAppChecker< if (config.upgrade) { await this.checkUpgrade(chain, config.upgrade); } + await this.checkDomainOwnership(chain); } async checkDomainOwnership(chain: ChainName): Promise { From c84a1dc73bce613582e6fcb1d735c244992f9c05 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 20 Jun 2024 17:28:26 +0100 Subject: [PATCH 16/35] feat: address blacklisting in the relayer (#4000) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description See context here https://discord.com/channels/935678348330434570/1236041564673806427/1252918894755319920 and https://discord.com/channels/935678348330434570/1252953507833708605/1252954456400592997 This is a rudimentary first step toward blacklisting addresses. Future options are outlined in https://discord.com/channels/935678348330434570/1236041564673806427/1252918894755319920. Eventually we can also fetch these addresses directly within the agent from an updated list that we cache and re-fetch occasionally. For now, this just relies on configured addresses. The approach is: - Allow hex addresses to be configured. These are intentionally treated as a Vec instead of an H160 / H256. This is because treating them as H160 is a leak of Ethereum-specific logic into non-chain-specific code in the relayer, and treating them as H256 would pad Ethereum addresses with a bunch of zeroes which would diminish the accuracy of our heuristic implemented in this. The subsequence stuff is a bit unfortunate because it's O(n^2) but 🤷‍♂️ - The heuristic is as follows - if any of the configured addresses are found as a subsequence in the message sender, recipient, or body, it's thrown out by the message processor, and the message will never make its way to the op_submitter. This heuristic for the body is to prevent warp route transfers that include that address. We could maybe convert Vec to H256 for the sender and recipient, I'm open to this - I just went with the substring approach bc it felt easiest tbh. ### Drive-by changes ### Related issues - Fixes https://github.com/hyperlane-xyz/issues/issues/1285 ### Backward compatibility ### Testing --- rust/agents/relayer/src/msg/blacklist.rs | 123 ++++++++++++++++++ rust/agents/relayer/src/msg/mod.rs | 1 + rust/agents/relayer/src/msg/processor.rs | 46 +++++-- rust/agents/relayer/src/relayer.rs | 33 +++-- rust/agents/relayer/src/settings/mod.rs | 64 +++++++++ .../cursors/sequence_aware/forward.rs | 8 +- .../config/environments/mainnet3/agent.ts | 2 +- typescript/infra/src/config/agent/relayer.ts | 53 +++++++- typescript/sdk/src/metadata/agentConfig.ts | 4 + 9 files changed, 302 insertions(+), 32 deletions(-) create mode 100644 rust/agents/relayer/src/msg/blacklist.rs diff --git a/rust/agents/relayer/src/msg/blacklist.rs b/rust/agents/relayer/src/msg/blacklist.rs new file mode 100644 index 0000000000..1e9202086a --- /dev/null +++ b/rust/agents/relayer/src/msg/blacklist.rs @@ -0,0 +1,123 @@ +use hyperlane_core::HyperlaneMessage; + +#[derive(Debug, Clone, Default)] +pub struct AddressBlacklist { + // A list of addresses that are blocked from being relayed. + // Addresses are any length to support different address types. + pub blacklist: Vec>, +} + +impl AddressBlacklist { + pub fn new(blacklist: Vec>) -> Self { + Self { blacklist } + } + + /// Returns true if the message is blocked by the blacklist. + /// At the moment, this only checks if the sender, recipient, or body of the + /// message contains any of the blocked addresses. + pub fn find_blacklisted_address(&self, message: &HyperlaneMessage) -> Option> { + self.blacklist.iter().find_map(|address| { + if is_subsequence(message.sender.as_bytes(), address) + || is_subsequence(message.recipient.as_bytes(), address) + || is_subsequence(&message.body, address) + { + // Return the blocked address that was found. + Some(address.clone()) + } else { + None + } + }) + } +} + +/// Returns true if `needle` is a subsequence of `haystack`. +fn is_subsequence(mut haystack: &[T], needle: &[T]) -> bool { + if needle.is_empty() { + return true; + } + + while !haystack.is_empty() { + if needle.len() > haystack.len() { + return false; + } + if haystack.starts_with(needle) { + return true; + } + haystack = &haystack[1..]; + } + false +} + +#[cfg(test)] +mod test { + use hyperlane_core::H256; + + use super::*; + + #[test] + fn test_is_subsequence() { + assert!(is_subsequence(b"hello", b"hello")); + assert!(is_subsequence(b"hello", b"he")); + assert!(is_subsequence(b"hello", b"lo")); + assert!(is_subsequence(b"hello", b"")); + assert!(is_subsequence(b"hello", b"o")); + + assert!(!is_subsequence(b"hello", b"hello world")); + assert!(!is_subsequence(b"hello", b"world")); + assert!(!is_subsequence(b"hello", b"world hello")); + } + + #[test] + fn test_is_blocked() { + let blocked = b"blocked"; + let blocklist = AddressBlacklist::new(vec![blocked.to_vec()]); + + let bytes_with_subsequence = |subsequence: &[u8], index: usize, len: usize| { + let mut bytes = vec![0; len]; + bytes[index..index + subsequence.len()].copy_from_slice(subsequence); + bytes + }; + + let h256_with_subsequence = |subsequence: &[u8], index: usize| { + let bytes = bytes_with_subsequence(subsequence, index, H256::len_bytes()); + H256::from_slice(&bytes) + }; + + // Blocked - sender includes the blocked address + let message = HyperlaneMessage { + sender: h256_with_subsequence(blocked, 0), + ..Default::default() + }; + assert_eq!( + blocklist.find_blacklisted_address(&message), + Some(blocked.to_vec()) + ); + + // Blocked - recipient includes the blocked address + let message = HyperlaneMessage { + recipient: h256_with_subsequence(blocked, 20), + ..Default::default() + }; + assert_eq!( + blocklist.find_blacklisted_address(&message), + Some(blocked.to_vec()) + ); + + // Blocked - body includes the blocked address + let message = HyperlaneMessage { + body: bytes_with_subsequence(blocked, 100 - blocked.len(), 100), + ..Default::default() + }; + assert_eq!( + blocklist.find_blacklisted_address(&message), + Some(blocked.to_vec()) + ); + + // Not blocked - sender, recipient, and body do not include the blocked address + let message = HyperlaneMessage { + body: vec![1; 100], + ..Default::default() + }; + assert!(blocklist.find_blacklisted_address(&message).is_none()); + } +} diff --git a/rust/agents/relayer/src/msg/mod.rs b/rust/agents/relayer/src/msg/mod.rs index dd7bac22bb..abf00ec05e 100644 --- a/rust/agents/relayer/src/msg/mod.rs +++ b/rust/agents/relayer/src/msg/mod.rs @@ -25,6 +25,7 @@ //! - FallbackProviderSubmitter (Serialized, but if some RPC provider sucks, //! switch everyone to new one) +pub(crate) mod blacklist; pub(crate) mod gas_payment; pub(crate) mod metadata; pub(crate) mod op_queue; diff --git a/rust/agents/relayer/src/msg/processor.rs b/rust/agents/relayer/src/msg/processor.rs index 664c1dc640..40808ad3d5 100644 --- a/rust/agents/relayer/src/msg/processor.rs +++ b/rust/agents/relayer/src/msg/processor.rs @@ -8,6 +8,7 @@ use std::{ use async_trait::async_trait; use derive_new::new; +use ethers::utils::hex; use eyre::Result; use hyperlane_base::{ db::{HyperlaneRocksDB, ProcessMessage}, @@ -18,15 +19,19 @@ use prometheus::IntGauge; use tokio::sync::mpsc::UnboundedSender; use tracing::{debug, instrument, trace}; -use super::{metadata::AppContextClassifier, pending_message::*}; +use super::{blacklist::AddressBlacklist, metadata::AppContextClassifier, pending_message::*}; use crate::{processor::ProcessorExt, settings::matching_list::MatchingList}; /// Finds unprocessed messages from an origin and submits then through a channel /// for to the appropriate destination. #[allow(clippy::too_many_arguments)] pub struct MessageProcessor { - whitelist: Arc, - blacklist: Arc, + /// A matching list of messages that should be whitelisted. + message_whitelist: Arc, + /// A matching list of messages that should be blacklisted. + message_blacklist: Arc, + /// Addresses that messages may not interact with. + address_blacklist: Arc, metrics: MessageProcessorMetrics, /// channel for each destination chain to send operations (i.e. message /// submissions) to @@ -217,8 +222,8 @@ impl Debug for MessageProcessor { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, - "MessageProcessor {{ whitelist: {:?}, blacklist: {:?}, nonce_iterator: {:?}}}", - self.whitelist, self.blacklist, self.nonce_iterator + "MessageProcessor {{ message_whitelist: {:?}, message_blacklist: {:?}, address_blacklist: {:?}, nonce_iterator: {:?}}}", + self.message_whitelist, self.message_blacklist, self.address_blacklist, self.nonce_iterator ) } } @@ -247,14 +252,25 @@ impl ProcessorExt for MessageProcessor { let destination = msg.destination; // Skip if not whitelisted. - if !self.whitelist.msg_matches(&msg, true) { - debug!(?msg, whitelist=?self.whitelist, "Message not whitelisted, skipping"); + if !self.message_whitelist.msg_matches(&msg, true) { + debug!(?msg, whitelist=?self.message_whitelist, "Message not whitelisted, skipping"); return Ok(()); } // Skip if the message is blacklisted - if self.blacklist.msg_matches(&msg, false) { - debug!(?msg, blacklist=?self.blacklist, "Message blacklisted, skipping"); + if self.message_whitelist.msg_matches(&msg, false) { + debug!(?msg, blacklist=?self.message_whitelist, "Message blacklisted, skipping"); + return Ok(()); + } + + // Skip if the message involves a blacklisted address + if let Some(blacklisted_address) = self.address_blacklist.find_blacklisted_address(&msg) + { + debug!( + ?msg, + blacklisted_address = hex::encode(blacklisted_address), + "Message involves blacklisted address, skipping" + ); return Ok(()); } @@ -291,18 +307,21 @@ impl ProcessorExt for MessageProcessor { } impl MessageProcessor { + #[allow(clippy::too_many_arguments)] pub fn new( db: HyperlaneRocksDB, - whitelist: Arc, - blacklist: Arc, + message_whitelist: Arc, + message_blacklist: Arc, + address_blacklist: Arc, metrics: MessageProcessorMetrics, send_channels: HashMap>, destination_ctxs: HashMap>, metric_app_contexts: Vec<(MatchingList, String)>, ) -> Self { Self { - whitelist, - blacklist, + message_whitelist, + message_blacklist, + address_blacklist, metrics, send_channels, destination_ctxs, @@ -477,6 +496,7 @@ mod test { db.clone(), Default::default(), Default::default(), + Default::default(), dummy_processor_metrics(origin_domain.id()), HashMap::from([(destination_domain.id(), send_channel)]), HashMap::from([(destination_domain.id(), message_context)]), diff --git a/rust/agents/relayer/src/relayer.rs b/rust/agents/relayer/src/relayer.rs index 3be0f1e590..e8b9031531 100644 --- a/rust/agents/relayer/src/relayer.rs +++ b/rust/agents/relayer/src/relayer.rs @@ -33,6 +33,7 @@ use tracing::{error, info, info_span, instrument::Instrumented, warn, Instrument use crate::{ merkle_tree::builder::MerkleTreeBuilder, msg::{ + blacklist::AddressBlacklist, gas_payment::GasPaymentEnforcer, metadata::{BaseMetadataBuilder, IsmAwareAppContextClassifier}, op_submitter::{SerialSubmitter, SerialSubmitterMetrics}, @@ -70,8 +71,9 @@ pub struct Relayer { prover_syncs: HashMap>>, merkle_tree_hook_syncs: HashMap>>, dbs: HashMap, - whitelist: Arc, - blacklist: Arc, + message_whitelist: Arc, + message_blacklist: Arc, + address_blacklist: Arc, transaction_gas_limit: Option, skip_transaction_gas_limit_for: HashSet, allow_local_checkpoint_syncers: bool, @@ -89,11 +91,12 @@ impl Debug for Relayer { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, - "Relayer {{ origin_chains: {:?}, destination_chains: {:?}, whitelist: {:?}, blacklist: {:?}, transaction_gas_limit: {:?}, skip_transaction_gas_limit_for: {:?}, allow_local_checkpoint_syncers: {:?} }}", + "Relayer {{ origin_chains: {:?}, destination_chains: {:?}, message_whitelist: {:?}, message_blacklist: {:?}, address_blacklist: {:?}, transaction_gas_limit: {:?}, skip_transaction_gas_limit_for: {:?}, allow_local_checkpoint_syncers: {:?} }}", self.origin_chains, self.destination_chains, - self.whitelist, - self.blacklist, + self.message_whitelist, + self.message_blacklist, + self.address_blacklist, self.transaction_gas_limit, self.skip_transaction_gas_limit_for, self.allow_local_checkpoint_syncers @@ -177,14 +180,16 @@ impl BaseAgent for Relayer { .map(|(k, v)| (k, v as _)) .collect(); - let whitelist = Arc::new(settings.whitelist); - let blacklist = Arc::new(settings.blacklist); + let message_whitelist = Arc::new(settings.whitelist); + let message_blacklist = Arc::new(settings.blacklist); + let address_blacklist = Arc::new(AddressBlacklist::new(settings.address_blacklist)); let skip_transaction_gas_limit_for = settings.skip_transaction_gas_limit_for; let transaction_gas_limit = settings.transaction_gas_limit; info!( - %whitelist, - %blacklist, + %message_whitelist, + %message_blacklist, + ?address_blacklist, ?transaction_gas_limit, ?skip_transaction_gas_limit_for, "Whitelist configuration" @@ -275,8 +280,9 @@ impl BaseAgent for Relayer { interchain_gas_payment_syncs, prover_syncs, merkle_tree_hook_syncs, - whitelist, - blacklist, + message_whitelist, + message_blacklist, + address_blacklist, transaction_gas_limit, skip_transaction_gas_limit_for, allow_local_checkpoint_syncers: settings.allow_local_checkpoint_syncers, @@ -487,8 +493,9 @@ impl Relayer { let message_processor = MessageProcessor::new( self.dbs.get(origin).unwrap().clone(), - self.whitelist.clone(), - self.blacklist.clone(), + self.message_whitelist.clone(), + self.message_blacklist.clone(), + self.address_blacklist.clone(), metrics, send_channels, destination_ctxs, diff --git a/rust/agents/relayer/src/settings/mod.rs b/rust/agents/relayer/src/settings/mod.rs index 2e6b005731..dc4c1e543e 100644 --- a/rust/agents/relayer/src/settings/mod.rs +++ b/rust/agents/relayer/src/settings/mod.rs @@ -8,6 +8,7 @@ use std::{collections::HashSet, path::PathBuf}; use convert_case::Case; use derive_more::{AsMut, AsRef, Deref, DerefMut}; +use ethers::utils::hex; use eyre::{eyre, Context}; use hyperlane_base::{ impl_loadable_from_settings, @@ -46,6 +47,10 @@ pub struct RelayerSettings { pub whitelist: MatchingList, /// Filter for what messages to block. pub blacklist: MatchingList, + /// Filter for what addresses to block interactions with. + /// This is intentionally not an H256 to allow for addresses of any length without + /// adding any padding. + pub address_blacklist: Vec>, /// This is optional. If not specified, any amount of gas will be valid, otherwise this /// is the max allowed gas in wei to relay a transaction. pub transaction_gas_limit: Option, @@ -191,6 +196,14 @@ impl FromRawConf for RelayerSettings { .and_then(parse_matching_list) .unwrap_or_default(); + let address_blacklist = p + .chain(&mut err) + .get_opt_key("addressBlacklist") + .parse_string() + .end() + .map(|str| parse_address_list(str, &mut err, || &p.cwp + "address_blacklist")) + .unwrap_or_default(); + let transaction_gas_limit = p .chain(&mut err) .get_opt_key("transactionGasLimit") @@ -268,6 +281,7 @@ impl FromRawConf for RelayerSettings { gas_payment_enforcement, whitelist, blacklist, + address_blacklist, transaction_gas_limit, skip_transaction_gas_limit_for, allow_local_checkpoint_syncers, @@ -311,3 +325,53 @@ fn parse_matching_list(p: ValueParser) -> ConfigResult { err.into_result(ml) } + +fn parse_address_list( + str: &str, + err: &mut ConfigParsingError, + err_path: impl Fn() -> ConfigPath, +) -> Vec> { + str.split(',') + .filter_map(|s| { + let mut s = s.trim().to_owned(); + if let Some(stripped) = s.strip_prefix("0x") { + s = stripped.to_owned(); + } + hex::decode(s).take_err(err, &err_path) + }) + .collect_vec() +} + +#[cfg(test)] +mod test { + use super::*; + use hyperlane_core::H160; + + #[test] + fn test_parse_address_blacklist() { + let valid_address1 = b"valid".to_vec(); + let valid_address2 = H160::random().as_bytes().to_vec(); + + // Successful parsing + let input = format!( + "0x{}, {}", + hex::encode(&valid_address1), + hex::encode(&valid_address2) + ); + let mut err = ConfigParsingError::default(); + let res = parse_address_list(&input, &mut err, ConfigPath::default); + assert_eq!(res, vec![valid_address1.clone(), valid_address2.clone()]); + assert!(err.is_ok()); + + // An error in the final address provided + let input = format!( + "0x{}, {}, 0xaazz", + hex::encode(&valid_address1), + hex::encode(&valid_address2) + ); + let mut err = ConfigParsingError::default(); + let res = parse_address_list(&input, &mut err, ConfigPath::default); + assert_eq!(res, vec![valid_address1, valid_address2]); + assert!(!err.is_ok()); + } +} diff --git a/rust/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs b/rust/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs index 7314e2a004..ae6629e958 100644 --- a/rust/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs +++ b/rust/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs @@ -546,10 +546,10 @@ pub(crate) mod test { pub sequence: u32, } - impl Into> for MockSequencedData { - fn into(self) -> Indexed { - let sequence = self.sequence; - Indexed::new(self).with_sequence(sequence) + impl From for Indexed { + fn from(val: MockSequencedData) -> Self { + let sequence = val.sequence; + Indexed::new(val).with_sequence(sequence) } } diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 5669865883..32c5831e48 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -223,7 +223,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '3bb9d0a-20240619-130157', + tag: '3fddaeb-20240619-163111', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContexts, diff --git a/typescript/infra/src/config/agent/relayer.ts b/typescript/infra/src/config/agent/relayer.ts index 3d88c16ff5..f9d4bac735 100644 --- a/typescript/infra/src/config/agent/relayer.ts +++ b/typescript/infra/src/config/agent/relayer.ts @@ -1,4 +1,6 @@ import { BigNumberish } from 'ethers'; +import { Logger } from 'pino'; +import { z } from 'zod'; import { AgentConfig, @@ -10,7 +12,13 @@ import { MatchingList, RelayerConfig as RelayerAgentConfig, } from '@hyperlane-xyz/sdk'; -import { Address, ProtocolType, addressToBytes32 } from '@hyperlane-xyz/utils'; +import { + Address, + ProtocolType, + addressToBytes32, + isValidAddressEvm, + rootLogger, +} from '@hyperlane-xyz/utils'; import { getChain, getDomainId } from '../../../config/registry.js'; import { AgentAwsUser } from '../../agents/aws/user.js'; @@ -34,6 +42,7 @@ export interface BaseRelayerConfig { gasPaymentEnforcement: GasPaymentEnforcement[]; whitelist?: MatchingList; blacklist?: MatchingList; + addressBlacklist?: string; transactionGasLimit?: BigNumberish; skipTransactionGasLimitFor?: string[]; metricAppContexts?: MetricAppContext[]; @@ -58,12 +67,15 @@ export interface HelmRelayerChainValues { export class RelayerConfigHelper extends AgentConfigHelper { readonly #relayerConfig: BaseRelayerConfig; + readonly logger: Logger; constructor(agentConfig: RootAgentConfig) { if (!agentConfig.relayer) throw Error('Relayer is not defined for this context'); super(agentConfig, agentConfig.relayer); + this.#relayerConfig = agentConfig.relayer; + this.logger = rootLogger.child({ module: 'RelayerConfigHelper' }); } async buildConfig(): Promise { @@ -80,6 +92,11 @@ export class RelayerConfigHelper extends AgentConfigHelper { if (baseConfig.blacklist) { relayerConfig.blacklist = JSON.stringify(baseConfig.blacklist); } + + relayerConfig.addressBlacklist = (await this.getSanctionedAddresses()).join( + ',', + ); + if (baseConfig.transactionGasLimit) { relayerConfig.transactionGasLimit = baseConfig.transactionGasLimit.toString(); @@ -130,6 +147,40 @@ export class RelayerConfigHelper extends AgentConfigHelper { return chainSigners; } + async getSanctionedAddresses() { + // All Ethereum-style addresses from https://github.com/0xB10C/ofac-sanctioned-digital-currency-addresses/tree/lists + const currencies = ['ARB', 'ETC', 'ETH', 'USDC', 'USDT']; + + const schema = z.array(z.string()); + + const allSanctionedAddresses = await Promise.all( + currencies.map(async (currency) => { + const rawUrl = `https://raw.githubusercontent.com/0xB10C/ofac-sanctioned-digital-currency-addresses/lists/sanctioned_addresses_${currency}.json`; + this.logger.debug( + { + currency, + rawUrl, + }, + 'Fetching sanctioned addresses', + ); + const json = await fetch(rawUrl); + const sanctionedAddresses = schema.parse(await json.json()); + return sanctionedAddresses; + }), + ); + + return allSanctionedAddresses.flat().filter((address) => { + if (!isValidAddressEvm(address)) { + this.logger.debug( + { address }, + 'Invalid sanctioned address, throwing out', + ); + return false; + } + return true; + }); + } + // Returns whether the relayer requires AWS credentials get requiresAwsCredentials(): boolean { // If AWS is present on the agentConfig, we are using AWS keys and need credentials regardless. diff --git a/typescript/sdk/src/metadata/agentConfig.ts b/typescript/sdk/src/metadata/agentConfig.ts index 49f05e883a..ae20d551b4 100644 --- a/typescript/sdk/src/metadata/agentConfig.ts +++ b/typescript/sdk/src/metadata/agentConfig.ts @@ -314,6 +314,10 @@ export const RelayerAgentConfigSchema = AgentConfigSchema.extend({ .describe( 'If no blacklist is provided ALL will be considered to not be on the blacklist.', ), + addressBlacklist: z + .string() + .optional() + .describe('Comma separated list of addresses to blacklist.'), transactionGasLimit: ZUWei.optional().describe( 'This is optional. If not specified, any amount of gas will be valid, otherwise this is the max allowed gas in wei to relay a transaction.', ), From 0d12ff31cdf1b66c64e653b7e0679d26a8a7633f Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Thu, 20 Jun 2024 17:58:43 +0100 Subject: [PATCH 17/35] feat(ci): rust caching in `test` workflow (#4015) - draft: improve rust target caching in ci - separate caches for e2e-cosmwasm, e2e-noncosmwasm, cli-e2e test - drive-by adding `restore-keys` test expectation: - 1st commit of rust changes will take the full required time as it'll have to do a fresh build and then cache - subsequent builds of a particular rust change will be faster because it'll pickup the rust cache from before --------- Signed-off-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- .github/workflows/rust.yml | 6 +-- .github/workflows/test.yml | 86 ++++++++++++++++++++++++++++++-------- typescript/cli/ci-test.sh | 6 +-- 3 files changed, 74 insertions(+), 24 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 4f52f82bb9..27dc0403ea 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -39,8 +39,7 @@ jobs: - name: rust cache uses: Swatinem/rust-cache@v2 with: - prefix-key: "v2-rust" - shared-key: "test" + prefix-key: "v3-rust" workspaces: | ./rust - name: Free disk space @@ -69,8 +68,7 @@ jobs: - name: rust cache uses: Swatinem/rust-cache@v2 with: - prefix-key: "v2-rust" - shared-key: "lint" + prefix-key: "v3-rust" workspaces: | ./rust - name: Free disk space diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e01741aab6..ae258f6011 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -254,6 +254,14 @@ jobs: toolchain: stable profile: minimal + - name: rust cache + uses: Swatinem/rust-cache@v2 + with: + prefix-key: "v1-${{ runner.os }}-rust-cache" + shared-key: ${{ matrix.e2e-type }} + workspaces: | + ./rust + - name: Free disk space run: | # Based on https://github.com/actions/runner-images/issues/2840#issuecomment-790492173 @@ -296,22 +304,15 @@ jobs: key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} fail-on-cache-miss: true - - name: cargo-cache - uses: actions/cache@v4 - with: - path: | - ~/.cargo - key: ${{ runner.os }}-cargo-cache-${{ hashFiles('./rust/Cargo.lock') }} - - name: agent tests with CosmWasm - run: cargo test --release --package run-locally --bin run-locally --features cosmos -- cosmos::test --nocapture + run: cargo test --release --package run-locally --bin run-locally --features cosmos test-utils -- cosmos::test --nocapture if: matrix.e2e-type == 'cosmwasm' working-directory: ./rust env: RUST_BACKTRACE: 'full' - name: agent tests excluding CosmWasm - run: cargo run --release --bin run-locally + run: cargo run --release --bin run-locally --features test-utils if: matrix.e2e-type == 'non-cosmwasm' working-directory: ./rust env: @@ -330,10 +331,60 @@ jobs: echo "All e2e-matrix jobs have completed." # You can add additional commands here to report the result as needed + prebuild-cli-e2e: + runs-on: larger-runner + if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.base_ref == 'main') || github.event_name == 'merge_group' + needs: [checkout-registry] + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} + submodules: recursive + + - name: setup rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + + - name: rust cache + uses: Swatinem/rust-cache@v2 + with: + prefix-key: "v1-${{ runner.os }}-rust-cache" + shared-key: "cli-e2e" + workspaces: | + ./rust + + - name: Free disk space + run: | + # Based on https://github.com/actions/runner-images/issues/2840#issuecomment-790492173 + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + + - name: Install mold linker + uses: rui314/setup-mold@v1 + with: + mold-version: 2.0.0 + make-default: true + + - name: Build validator + run: cargo build --bin validator --features test-utils + working-directory: ./rust + env: + RUST_BACKTRACE: 'full' + + - name: Build relayer + run: cargo build --bin relayer --features test-utils + working-directory: ./rust + env: + RUST_BACKTRACE: 'full' + cli-e2e: runs-on: larger-runner if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.base_ref == 'main') || github.event_name == 'merge_group' - needs: [yarn-build, checkout-registry] + needs: [yarn-build, prebuild-cli-e2e] strategy: matrix: include: @@ -359,6 +410,14 @@ jobs: toolchain: stable profile: minimal + - name: rust cache + uses: Swatinem/rust-cache@v2 + with: + prefix-key: "v1-${{ runner.os }}-rust-cache" + shared-key: "cli-e2e" + workspaces: | + ./rust + - name: Free disk space run: | # Based on https://github.com/actions/runner-images/issues/2840#issuecomment-790492173 @@ -401,13 +460,6 @@ jobs: key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} fail-on-cache-miss: true - - name: cargo-cache - uses: actions/cache@v4 - with: - path: | - ~/.cargo - key: ${{ runner.os }}-cargo-cache-${{ hashFiles('./rust/Cargo.lock') }} - - name: cli e2e tests run: ./typescript/cli/ci-test.sh ${{ matrix.test-type }} diff --git a/typescript/cli/ci-test.sh b/typescript/cli/ci-test.sh index f2b12371e3..7fbeea04b7 100755 --- a/typescript/cli/ci-test.sh +++ b/typescript/cli/ci-test.sh @@ -254,7 +254,7 @@ run_hyperlane_send_message() { run_validator() { echo -e "\nPre-building validator with cargo" - cargo build --bin validator + cargo build --bin validator --features test-utils # set some default agent env vars, used by both validators and relayer export HYP_CHAINS_${CHAIN1_CAPS}_BLOCKS_REORGPERIOD=0 @@ -290,7 +290,7 @@ run_validator() { echo "Validator running, sleeping to let it sync" # This needs to be long to allow time for the cargo build to finish - sleep 15 + sleep 20 echo "Done sleeping" for CHAIN in ${CHAIN1} ${CHAIN2} @@ -308,7 +308,7 @@ run_validator() { run_relayer() { echo -e "\nPre-building relayer with cargo" - cargo build --bin relayer + cargo build --bin relayer --features test-utils echo "Running relayer" export CONFIG_FILES=/tmp/agent-config.json From 9aca29260b9ead0564a66cf063c3b16914c2194e Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 21 Jun 2024 10:39:14 +0100 Subject: [PATCH 18/35] chore: deploy relayer with new image and ezETH metrics (#3993) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../config/environments/mainnet3/agent.ts | 7 ++++- .../mainnet3/warp/renzo-ezETH-addresses.json | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses.json diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 32c5831e48..1d24baa48a 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -27,6 +27,7 @@ import inevmEthereumUsdcAddresses from './warp/inevm-USDC-addresses.json'; import inevmEthereumUsdtAddresses from './warp/inevm-USDT-addresses.json'; import injectiveInevmInjAddresses from './warp/injective-inevm-addresses.json'; import mantaTIAAddresses from './warp/manta-TIA-addresses.json'; +import renzoEzEthAddresses from './warp/renzo-ezETH-addresses.json'; import victionEthereumEthAddresses from './warp/viction-ETH-addresses.json'; import victionEthereumUsdcAddresses from './warp/viction-USDC-addresses.json'; import victionEthereumUsdtAddresses from './warp/viction-USDT-addresses.json'; @@ -212,6 +213,10 @@ const metricAppContexts = [ name: 'ancient8_ethereum_usdc', matchingList: routerMatchingList(ancient8EthereumUsdcAddresses), }, + { + name: 'renzo_ezeth', + matchingList: routerMatchingList(renzoEzEthAddresses), + }, ]; const hyperlane: RootAgentConfig = { @@ -223,7 +228,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '3fddaeb-20240619-163111', + tag: '0d12ff3-20240620-173353', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContexts, diff --git a/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses.json b/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses.json new file mode 100644 index 0000000000..37f4fd1b14 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses.json @@ -0,0 +1,26 @@ +{ + "bsc": { + "router": "0x6266e803057fa68C35018C3FB0B59db7129C23BB" + }, + "arbitrum": { + "router": "0xC8F280d3eC30746f77c28695827d309d16939BF1" + }, + "optimism": { + "router": "0x1d1a210E71398c17FD7987eDF1dc347539bB541F" + }, + "base": { + "router": "0x584BA77ec804f8B6A559D196661C0242C6844F49" + }, + "blast": { + "router": "0x8C603c6BDf8a9d548fC5D2995750Cc25eF59183b" + }, + "mode": { + "router": "0xcd95B8dF351400BF4cbAb340b6EfF2454aDB299E" + }, + "linea": { + "router": "0xcd95B8dF351400BF4cbAb340b6EfF2454aDB299E" + }, + "ethereum": { + "router": "0xdFf621F952c23972dFD3A9E5d7B9f6339e9c078B" + } +} From 23ad36ab98da4bd708a9d15d5b46ba4f3f390dbb Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Fri, 21 Jun 2024 12:09:40 +0100 Subject: [PATCH 19/35] feat(infra): allow specifying chains to deploy validators for in infra (#4014) - allow someone to provide a specific set of chains to deploy validators for deploying validator: ![image](https://github.com/hyperlane-xyz/hyperlane-monorepo/assets/10051819/906c3c45-27e1-43ca-ac21-176ade91a500) deploying relayer: ![image](https://github.com/hyperlane-xyz/hyperlane-monorepo/assets/10051819/a5c6af09-1f6a-4c1a-8652-05fbb10ced30) --------- Signed-off-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- typescript/infra/scripts/agents/utils.ts | 28 +++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/typescript/infra/scripts/agents/utils.ts b/typescript/infra/scripts/agents/utils.ts index f80f435a07..c7b8c8a5d6 100644 --- a/typescript/infra/scripts/agents/utils.ts +++ b/typescript/infra/scripts/agents/utils.ts @@ -22,6 +22,7 @@ export class AgentCli { agentConfig!: RootAgentConfig; initialized = false; dryRun = false; + chains?: string[]; public async runHelmCommand(command: HelmCommand) { await this.init(); @@ -30,12 +31,19 @@ export class AgentCli { // make all the managers first to ensure config validity for (const role of this.roles) { switch (role) { - case Role.Validator: - for (const chain of this.agentConfig.contextChainNames[role]) { + case Role.Validator: { + const contextChainNames = this.agentConfig.contextChainNames[role]; + const validatorChains = !this.chains + ? contextChainNames + : contextChainNames.filter((chain: string) => + this.chains!.includes(chain), + ); + for (const chain of validatorChains) { const key = `${role}-${chain}`; managers[key] = new ValidatorHelmManager(this.agentConfig, chain); } break; + } case Role.Relayer: managers[role] = new RelayerHelmManager(this.agentConfig); break; @@ -63,7 +71,20 @@ export class AgentCli { if (this.initialized) return; const argv = await withAgentRole(withContext(getArgs())) .describe('dry-run', 'Run through the steps without making any changes') - .boolean('dry-run').argv; + .boolean('dry-run') + .describe('chains', 'Specific chains to perform validator actions on.') + .array('chains') + // Ensure chains are unique + .coerce('chains', (chains: string[]) => Array.from(new Set(chains))) + .alias('c', 'chains').argv; + + if ( + argv.chains && + argv.chains.length > 0 && + !argv.role.includes(Role.Validator) + ) { + console.warn('Chain argument applies to validator role only. Ignoring.'); + } const { envConfig, agentConfig } = await getConfigsBasedOnArgs(argv); await assertCorrectKubeContext(envConfig); @@ -72,5 +93,6 @@ export class AgentCli { this.agentConfig = agentConfig; this.dryRun = argv.dryRun || false; this.initialized = true; + this.chains = argv.chains; } } From 832351d0d022c38ad32fcb05b68cdf95f5b1d7e6 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 21 Jun 2024 13:10:42 +0100 Subject: [PATCH 20/35] chore: set agent and environment specific resource requests (#4027) ### Description - based off https://abacusworks.grafana.net/d/FSR9YWr7k, updated resource requests for all agents. Because mainnet3 sees so many more messages and more chains, the resource needs there are higher - allows for resources to be defined in infra - previously we'd just use the default value in the values.yaml of the helm charts. Also makes the resources specific to the type of agent, which is nice because relayers require much higher spec than validators - I haven't deployed this yet, will do so when I get a review ### Drive-by changes ### Related issues - Fixes https://github.com/hyperlane-xyz/issues/issues/1288 ### Backward compatibility ### Testing --- .../config/environments/mainnet3/agent.ts | 38 +++++++++++++--- .../config/environments/testnet4/agent.ts | 37 +++++++++++++--- typescript/infra/src/agents/index.ts | 12 +++++- typescript/infra/src/config/agent/agent.ts | 43 +++++++++++-------- typescript/infra/src/config/infrastructure.ts | 3 ++ 5 files changed, 103 insertions(+), 30 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 1d24baa48a..8df43bdb6f 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -219,6 +219,28 @@ const metricAppContexts = [ }, ]; +// Resource requests are based on observed usage found in https://abacusworks.grafana.net/d/FSR9YWr7k +const relayerResources = { + requests: { + cpu: '3000m', + memory: '8Gi', + }, +}; + +const validatorResources = { + requests: { + cpu: '250m', + memory: '256Mi', + }, +}; + +const scraperResources = { + requests: { + cpu: '100m', + memory: '4Gi', + }, +}; + const hyperlane: RootAgentConfig = { ...contextBase, context: Contexts.Hyperlane, @@ -232,21 +254,24 @@ const hyperlane: RootAgentConfig = { }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContexts, + resources: relayerResources, }, validators: { docker: { repo, - tag: '3bb9d0a-20240619-130157', + tag: '0d12ff3-20240620-173353', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), + resources: validatorResources, }, scraper: { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '59451d6-20240612-171611', + tag: '0d12ff3-20240620-173353', }, + resources: scraperResources, }, }; @@ -259,21 +284,23 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '3bb9d0a-20240619-130157', + tag: '0d12ff3-20240620-173353', }, // We're temporarily (ab)using the RC relayer as a way to increase // message throughput. // whitelist: releaseCandidateHelloworldMatchingList, gasPaymentEnforcement, metricAppContexts, + resources: relayerResources, }, validators: { docker: { repo, - tag: '3bb9d0a-20240619-130157', + tag: '0d12ff3-20240620-173353', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.ReleaseCandidate), + resources: validatorResources, }, }; @@ -290,7 +317,7 @@ const neutron: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'c9c5d37-20240510-014327', + tag: '0d12ff3-20240620-173353', }, gasPaymentEnforcement: [ { @@ -317,6 +344,7 @@ const neutron: RootAgentConfig = { matchingList: routerMatchingList(arbitrumNeutronEclipAddresses), }, ], + resources: relayerResources, }, }; diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index c21678f4df..77a23f3b82 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -89,6 +89,28 @@ const gasPaymentEnforcement: GasPaymentEnforcement[] = [ }, ]; +// Resource requests are based on observed usage found in https://abacusworks.grafana.net/d/FSR9YWr7k +const relayerResources = { + requests: { + cpu: '1000m', + memory: '4Gi', + }, +}; + +const validatorResources = { + requests: { + cpu: '250m', + memory: '256Mi', + }, +}; + +const scraperResources = { + requests: { + cpu: '100m', + memory: '1Gi', + }, +}; + const hyperlane: RootAgentConfig = { ...contextBase, contextChainNames: hyperlaneContextAgentChainNames, @@ -98,7 +120,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '3bb9d0a-20240619-130157', + tag: '0d12ff3-20240620-173353', }, blacklist: [ ...releaseCandidateHelloworldMatchingList, @@ -122,21 +144,24 @@ const hyperlane: RootAgentConfig = { matchingList: routerMatchingList(plumetestnetSepoliaAddresses), }, ], + resources: relayerResources, }, validators: { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '3bb9d0a-20240619-130157', + tag: '0d12ff3-20240620-173353', }, chains: validatorChainConfig(Contexts.Hyperlane), + resources: validatorResources, }, scraper: { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'c9c5d37-20240510-014327', + tag: '0d12ff3-20240620-173353', }, + resources: scraperResources, }, }; @@ -149,19 +174,21 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '3bb9d0a-20240619-130157', + tag: '0d12ff3-20240620-173353', }, whitelist: [...releaseCandidateHelloworldMatchingList], gasPaymentEnforcement, transactionGasLimit: 750000, + resources: relayerResources, }, validators: { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '3bb9d0a-20240619-130157', + tag: '0d12ff3-20240620-173353', }, chains: validatorChainConfig(Contexts.ReleaseCandidate), + resources: validatorResources, }, }; diff --git a/typescript/infra/src/agents/index.ts b/typescript/infra/src/agents/index.ts index c959bca650..c1486e83a3 100644 --- a/typescript/infra/src/agents/index.ts +++ b/typescript/infra/src/agents/index.ts @@ -10,6 +10,7 @@ import { AgentContextConfig, DockerConfig, HelmRootAgentValues, + KubernetesResources, RootAgentConfig, } from '../config/agent/agent.js'; import { RelayerConfigHelper } from '../config/agent/relayer.js'; @@ -151,7 +152,7 @@ export abstract class AgentHelmManager { return RpcConsensusType.Single; } - return this.config.rpcConsensusType; + return this.config.agentRoleConfig.rpcConsensusType; } async doesAgentReleaseExist() { @@ -169,7 +170,11 @@ export abstract class AgentHelmManager { } dockerImage(): DockerConfig { - return this.config.docker; + return this.config.agentRoleConfig.docker; + } + + kubernetesResources(): KubernetesResources | undefined { + return this.config.agentRoleConfig.resources; } } @@ -216,6 +221,7 @@ export class RelayerHelmManager extends OmniscientAgentHelmManager { enabled: true, aws: this.config.requiresAwsCredentials, config: await this.config.buildConfig(), + resources: this.kubernetesResources(), }; const signers = await this.config.signers(); @@ -244,6 +250,7 @@ export class ScraperHelmManager extends OmniscientAgentHelmManager { values.hyperlane.scraper = { enabled: true, config: await this.config.buildConfig(), + resources: this.kubernetesResources(), }; // scraper never requires aws credentials values.hyperlane.aws = false; @@ -279,6 +286,7 @@ export class ValidatorHelmManager extends MultichainAgentHelmManager { originChainName: cfg.originChainName, interval: cfg.interval, })), + resources: this.kubernetesResources(), }; // The name of the helm release for agents is `hyperlane-agent`. diff --git a/typescript/infra/src/config/agent/agent.ts b/typescript/infra/src/config/agent/agent.ts index 1ccd1d45b8..f21bcb19f1 100644 --- a/typescript/infra/src/config/agent/agent.ts +++ b/typescript/infra/src/config/agent/agent.ts @@ -89,8 +89,12 @@ export interface AgentContextConfig extends AgentEnvConfig { // incomplete common agent configuration for a role interface AgentRoleConfig { + // K8s-specific docker: DockerConfig; chainDockerOverrides?: Record>; + resources?: KubernetesResources; + + // Agent-specific rpcConsensusType: RpcConsensusType; index?: IndexingConfig; } @@ -119,6 +123,16 @@ export interface DockerConfig { tag: string; } +export interface KubernetesResources { + requests?: KubernetesComputeResources; + limits?: KubernetesComputeResources; +} + +export interface KubernetesComputeResources { + cpu: string; + memory: string; +} + export class RootAgentConfigHelper implements AgentContextConfig { readonly rawConfig: RootAgentConfig; @@ -154,21 +168,14 @@ export class RootAgentConfigHelper implements AgentContextConfig { } } -export abstract class AgentConfigHelper - extends RootAgentConfigHelper - implements AgentRoleConfig -{ - rpcConsensusType: RpcConsensusType; - docker: DockerConfig; - chainDockerOverrides?: Record>; - index?: IndexingConfig; - - protected constructor(root: RootAgentConfig, agent: AgentRoleConfig) { +export abstract class AgentConfigHelper< + R = unknown, +> extends RootAgentConfigHelper { + protected constructor( + root: RootAgentConfig, + readonly agentRoleConfig: AgentRoleConfig, + ) { super(root); - this.rpcConsensusType = agent.rpcConsensusType; - this.docker = agent.docker; - this.chainDockerOverrides = agent.chainDockerOverrides; - this.index = agent.index; } // role this config is for @@ -178,13 +185,13 @@ export abstract class AgentConfigHelper // If the provided chain has an override, return the override, otherwise return the default. dockerImageForChain(chainName: ChainName): DockerConfig { - if (this.chainDockerOverrides?.[chainName]) { + if (this.agentRoleConfig.chainDockerOverrides?.[chainName]) { return { - ...this.docker, - ...this.chainDockerOverrides[chainName], + ...this.agentRoleConfig.docker, + ...this.agentRoleConfig.chainDockerOverrides[chainName], }; } - return this.docker; + return this.agentRoleConfig.docker; } } diff --git a/typescript/infra/src/config/infrastructure.ts b/typescript/infra/src/config/infrastructure.ts index 23b898f438..9fe1d461fd 100644 --- a/typescript/infra/src/config/infrastructure.ts +++ b/typescript/infra/src/config/infrastructure.ts @@ -1,3 +1,5 @@ +import { KubernetesResources } from './agent/agent.js'; + export interface HelmImageValues { repository: string; tag: string; @@ -6,6 +8,7 @@ export interface HelmImageValues { // This encompasses things like storage and resources for stateful sets. export interface HelmStatefulSetValues { enabled: boolean; + resources?: KubernetesResources; } interface KubernetesConfig { From c5a5e264b89b4e629dda2003c0000a10eee1bf71 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Fri, 21 Jun 2024 13:49:59 +0100 Subject: [PATCH 21/35] chore: enable `osmosis` on relayer (#4028) - chore: enable `osmosis` on relayer - drive-by add default chain signer/key/type to agent config - `signer.key` is copied from `neutron` --------- Signed-off-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- rust/config/mainnet_config.json | 5 +++++ typescript/infra/config/environments/mainnet3/agent.ts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/rust/config/mainnet_config.json b/rust/config/mainnet_config.json index e801d0ead9..351e3c878b 100644 --- a/rust/config/mainnet_config.json +++ b/rust/config/mainnet_config.json @@ -1155,6 +1155,11 @@ "http": "https://osmosis-rpc.publicnode.com" } ], + "signer": { + "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26", + "prefix": "osmo", + "type": "cosmosKey" + }, "slip44": 118, "validatorAnnounce": "0xaf867da5b09a20ee49161d57f99477c0c42d100f34eb53da0d2eb7fc6c257235" }, diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 8df43bdb6f..3025f4e77b 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -93,7 +93,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = { // At the moment, we only relay between Neutron and Manta Pacific on the neutron context. neutron: false, optimism: true, - osmosis: false, + osmosis: true, polygon: true, polygonzkevm: true, redstone: true, @@ -123,6 +123,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = { // Cannot scrape non-EVM chains neutron: false, optimism: true, + // Cannot scrape non-EVM chains osmosis: false, polygon: true, polygonzkevm: true, From 18056aafdd0c74cba732366288893c509adc88ee Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Fri, 21 Jun 2024 14:19:00 +0100 Subject: [PATCH 22/35] chore(ci): fix ci workflow filters on main (#4022) chore(ci): fix ci workflow filters on main generally copying the path/filters for `pull_request` into `push` so that we correctly run the right workflows --------- Signed-off-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- .github/workflows/rust-skipped.yml | 3 +++ .github/workflows/rust.yml | 6 ++++++ .github/workflows/test-skipped.yml | 3 +++ .github/workflows/test.yml | 2 ++ 4 files changed, 14 insertions(+) diff --git a/.github/workflows/rust-skipped.yml b/.github/workflows/rust-skipped.yml index a854837a08..e4d00219af 100644 --- a/.github/workflows/rust-skipped.yml +++ b/.github/workflows/rust-skipped.yml @@ -4,6 +4,9 @@ name: rust on: push: branches: [main] + paths-ignore: + - 'rust/**' + - .github/workflows/rust.yml pull_request: branches: [main] paths-ignore: diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 27dc0403ea..768e790906 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -1,6 +1,12 @@ name: rust on: + push: + branches: [main] + paths: + - 'rust/**' + - .github/workflows/rust.yml + - '!*.md' pull_request: branches: [main] paths: diff --git a/.github/workflows/test-skipped.yml b/.github/workflows/test-skipped.yml index 3cff777846..2c73ab5c5b 100644 --- a/.github/workflows/test-skipped.yml +++ b/.github/workflows/test-skipped.yml @@ -3,6 +3,9 @@ name: test on: push: branches: [main] + paths: + - '*.md' + - '!**/*' pull_request: branches: - '*' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ae258f6011..fe6d780046 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,6 +4,8 @@ on: # Triggers the workflow on push or pull request against main push: branches: [main] + paths-ignore: + - '*.md' pull_request: branches: - '*' # run against all branches From f1fe882e3b73b108538ae30fab3cb86469335772 Mon Sep 17 00:00:00 2001 From: Snoppy Date: Sat, 22 Jun 2024 03:16:39 +0800 Subject: [PATCH 23/35] chore: fix typos (#3645) fix minor typos Signed-off-by: snoppy Co-authored-by: Paul Balaji --- rust/chains/hyperlane-cosmos/src/providers/grpc.rs | 2 +- rust/sealevel/libraries/account-utils/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 3c15889e36..4c0ee7c10e 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -277,7 +277,7 @@ impl WasmGrpcProvider { let raw_tx = TxRaw { body_bytes: sign_doc.body_bytes, auth_info_bytes: sign_doc.auth_info_bytes, - // The poorly documented trick to simuluating a tx without a valid signature is to just pass + // The poorly documented trick to simulating a tx without a valid signature is to just pass // in a single empty signature. Taken from cosmjs: // https://github.com/cosmos/cosmjs/blob/44893af824f0712d1f406a8daa9fcae335422235/packages/stargate/src/modules/tx/queries.ts#L67 signatures: vec![vec![]], diff --git a/rust/sealevel/libraries/account-utils/src/lib.rs b/rust/sealevel/libraries/account-utils/src/lib.rs index 78af429748..c312ab1e7d 100644 --- a/rust/sealevel/libraries/account-utils/src/lib.rs +++ b/rust/sealevel/libraries/account-utils/src/lib.rs @@ -93,7 +93,7 @@ where Ok(Self::from(Self::fetch_data(buf)?.unwrap_or_default())) } - // Optimisically write then realloc on failure. + // Optimistically write then realloc on failure. // If we serialize and calculate len before realloc we will waste heap space as there is no // free(). Tradeoff between heap usage and compute budget. pub fn store( From b54c14cd31be541c06ca42a50ec2ef32e983653f Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Fri, 21 Jun 2024 21:07:59 +0100 Subject: [PATCH 24/35] chore: re-enforce a whitelist policy in the RC relayer (#4032) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/agent.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 3025f4e77b..e224587e5f 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -287,9 +287,7 @@ const releaseCandidate: RootAgentConfig = { repo, tag: '0d12ff3-20240620-173353', }, - // We're temporarily (ab)using the RC relayer as a way to increase - // message throughput. - // whitelist: releaseCandidateHelloworldMatchingList, + whitelist: releaseCandidateHelloworldMatchingList, gasPaymentEnforcement, metricAppContexts, resources: relayerResources, From 6398aab7275ea57cc69e3f1581328ed5cf4b1dff Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Sat, 22 Jun 2024 01:53:16 +0100 Subject: [PATCH 25/35] chore: Upgrade registry to 2.1.1 (#4033) ### Description To pickup fix in https://github.com/hyperlane-xyz/hyperlane-registry/pull/71 ### Backward compatibility Yes --- .changeset/clean-numbers-know.md | 7 +++++++ typescript/cli/package.json | 2 +- typescript/helloworld/package.json | 2 +- typescript/infra/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 .changeset/clean-numbers-know.md diff --git a/.changeset/clean-numbers-know.md b/.changeset/clean-numbers-know.md new file mode 100644 index 0000000000..b48a6d3036 --- /dev/null +++ b/.changeset/clean-numbers-know.md @@ -0,0 +1,7 @@ +--- +'@hyperlane-xyz/helloworld': minor +'@hyperlane-xyz/infra': minor +'@hyperlane-xyz/cli': minor +--- + +Upgrade registry to 2.1.1 diff --git a/typescript/cli/package.json b/typescript/cli/package.json index d88b1fe6c1..1cf7e607cb 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -5,7 +5,7 @@ "dependencies": { "@aws-sdk/client-kms": "^3.577.0", "@aws-sdk/client-s3": "^3.577.0", - "@hyperlane-xyz/registry": "1.3.0", + "@hyperlane-xyz/registry": "2.1.1", "@hyperlane-xyz/sdk": "3.16.0", "@hyperlane-xyz/utils": "3.16.0", "@inquirer/prompts": "^3.0.0", diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index c1ccf26cb0..7d8520976c 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -4,7 +4,7 @@ "version": "3.16.0", "dependencies": { "@hyperlane-xyz/core": "3.16.0", - "@hyperlane-xyz/registry": "1.3.0", + "@hyperlane-xyz/registry": "2.1.1", "@hyperlane-xyz/sdk": "3.16.0", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" diff --git a/typescript/infra/package.json b/typescript/infra/package.json index 9bba689adb..6b6188e63c 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -14,7 +14,7 @@ "@ethersproject/providers": "^5.7.2", "@google-cloud/secret-manager": "^5.5.0", "@hyperlane-xyz/helloworld": "3.16.0", - "@hyperlane-xyz/registry": "1.3.0", + "@hyperlane-xyz/registry": "2.1.1", "@hyperlane-xyz/sdk": "3.16.0", "@hyperlane-xyz/utils": "3.16.0", "@nomiclabs/hardhat-etherscan": "^3.0.3", diff --git a/yarn.lock b/yarn.lock index 23694b4cb1..547bea2890 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5683,7 +5683,7 @@ __metadata: "@aws-sdk/client-s3": "npm:^3.577.0" "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" - "@hyperlane-xyz/registry": "npm:1.3.0" + "@hyperlane-xyz/registry": "npm:2.1.1" "@hyperlane-xyz/sdk": "npm:3.16.0" "@hyperlane-xyz/utils": "npm:3.16.0" "@inquirer/prompts": "npm:^3.0.0" @@ -5774,7 +5774,7 @@ __metadata: resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: "@hyperlane-xyz/core": "npm:3.16.0" - "@hyperlane-xyz/registry": "npm:1.3.0" + "@hyperlane-xyz/registry": "npm:2.1.1" "@hyperlane-xyz/sdk": "npm:3.16.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" @@ -5823,7 +5823,7 @@ __metadata: "@ethersproject/providers": "npm:^5.7.2" "@google-cloud/secret-manager": "npm:^5.5.0" "@hyperlane-xyz/helloworld": "npm:3.16.0" - "@hyperlane-xyz/registry": "npm:1.3.0" + "@hyperlane-xyz/registry": "npm:2.1.1" "@hyperlane-xyz/sdk": "npm:3.16.0" "@hyperlane-xyz/utils": "npm:3.16.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -5875,13 +5875,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/registry@npm:1.3.0": - version: 1.3.0 - resolution: "@hyperlane-xyz/registry@npm:1.3.0" +"@hyperlane-xyz/registry@npm:2.1.1": + version: 2.1.1 + resolution: "@hyperlane-xyz/registry@npm:2.1.1" dependencies: yaml: "npm:^2" zod: "npm:^3.21.2" - checksum: 2cbdfd9e8958d0babde7104dfb0c98def7edb5f87f5f4679b09467a6a9b531884f187fcbc16fd85b00e304ef8fa3beb0a0779555b2c3edc1936541a0e878a73d + checksum: e0e1f36b9bc43dfb1e4f7c512091b31c6f1b4046687d076fc16c91fd9204af1bdbe7898c8c29ada3c6830f6961bb5aa0933357b73d500595689171f99b992922 languageName: node linkType: hard From 1876f68127328353f1f181eae2f963d69eae68b4 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Mon, 24 Jun 2024 11:18:08 +0100 Subject: [PATCH 26/35] feat: pin monorepo to a specific registry version (#4031) feat: pin monorepo to a specific registry version - introducing a `.registryrc`, which can be a commit hash, branch or tag - introduce a new action just for checking out a registry - remove registry caching because it's quicker now to just checkout the specified version --------- Signed-off-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- .github/actions/checkout-registry/action.yml | 28 +++++ .github/workflows/monorepo-docker.yml | 12 ++- .github/workflows/test-skipped.yml | 6 -- .github/workflows/test.yml | 101 +++---------------- .registryrc | 1 + Dockerfile | 9 +- 6 files changed, 57 insertions(+), 100 deletions(-) create mode 100644 .github/actions/checkout-registry/action.yml create mode 100644 .registryrc diff --git a/.github/actions/checkout-registry/action.yml b/.github/actions/checkout-registry/action.yml new file mode 100644 index 0000000000..929ea75399 --- /dev/null +++ b/.github/actions/checkout-registry/action.yml @@ -0,0 +1,28 @@ +name: 'Checkout Registry' +description: 'Checkout the hyperlane-registry repository and move it to the parent directory' +inputs: + registry_version: + description: 'Override the version of the hyperlane-registry to checkout' +runs: + using: 'composite' + steps: + - name: Read .registryrc if registry_version not provided + shell: bash + run: | + if [ -z "${{ inputs.registry_version }}" ]; then + REGISTRY_VERSION=$(cat .registryrc) + echo "REGISTRY_VERSION=$REGISTRY_VERSION" >> $GITHUB_ENV + else + echo "REGISTRY_VERSION=${{ inputs.registry_version }}" >> $GITHUB_ENV + fi + + - name: Checkout hyperlane-registry + uses: actions/checkout@v4 + with: + repository: hyperlane-xyz/hyperlane-registry + ref: ${{ env.REGISTRY_VERSION }} + path: ./hyperlane-registry + + - name: Move hyperlane-registry to parent directory + shell: bash + run: mv ./hyperlane-registry ../ diff --git a/.github/workflows/monorepo-docker.yml b/.github/workflows/monorepo-docker.yml index 629e08acbb..67d4f554ff 100644 --- a/.github/workflows/monorepo-docker.yml +++ b/.github/workflows/monorepo-docker.yml @@ -10,9 +10,11 @@ on: - 'typescript/infra/**' - 'Dockerfile' - '.dockerignore' + concurrency: group: build-push-monorepo-${{ github.ref }} cancel-in-progress: true + jobs: check-env: runs-on: ubuntu-latest @@ -66,6 +68,13 @@ jobs: registry: gcr.io username: _json_key password: ${{ secrets.GCLOUD_SERVICE_KEY }} + + - name: Read .registryrc + shell: bash + run: | + REGISTRY_VERSION=$(cat .registryrc) + echo "REGISTRY_VERSION=$REGISTRY_VERSION" >> $GITHUB_ENV + - name: Build and push uses: docker/build-push-action@v5 with: @@ -76,6 +85,5 @@ jobs: labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max - # To always fetch the latest registry, we use the date as the cache key build-args: | - REGISTRY_CACHE=${{ steps.taggen.outputs.TAG_DATE }} + REGISTRY_COMMIT=${{ env.REGISTRY_VERSION }} diff --git a/.github/workflows/test-skipped.yml b/.github/workflows/test-skipped.yml index 2c73ab5c5b..7b4091321f 100644 --- a/.github/workflows/test-skipped.yml +++ b/.github/workflows/test-skipped.yml @@ -31,12 +31,6 @@ jobs: - name: Instant pass run: echo "yarn-build job passed" - checkout-registry: - runs-on: ubuntu-latest - steps: - - name: Instant pass - run: echo "checkout-registry job passed" - lint-prettier: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fe6d780046..8584a60f2a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,8 +25,6 @@ env: LOG_FORMAT: PRETTY CARGO_TERM_COLOR: always RUST_BACKTRACE: full - # Alongside the monorepo in the directory above the $GITHUB_WORKSPACE. - REGISTRY_URI: ${{ github.workspace }}/../hyperlane-registry jobs: yarn-install: @@ -88,31 +86,6 @@ jobs: - name: build run: yarn build - checkout-registry: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - 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@v4 - 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] @@ -145,7 +118,7 @@ jobs: yarn-test: runs-on: ubuntu-latest - needs: [yarn-build, checkout-registry] + needs: [yarn-build] steps: - uses: actions/checkout@v4 with: @@ -164,24 +137,15 @@ 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@v4 - with: - path: | - ${{ env.REGISTRY_URI_ABSOLUTE }} - key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} - fail-on-cache-miss: true + - name: Checkout registry + uses: ./.github/actions/checkout-registry - name: Unit Tests run: yarn test:ci agent-configs: runs-on: ubuntu-latest - needs: [yarn-build, checkout-registry] + needs: [yarn-build] strategy: fail-fast: false matrix: @@ -208,17 +172,8 @@ 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@v4 - with: - path: | - ${{ env.REGISTRY_URI_ABSOLUTE }} - key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} - fail-on-cache-miss: true + - name: Checkout registry + uses: ./.github/actions/checkout-registry - name: Generate ${{ matrix.environment }} agent config run: | @@ -233,7 +188,7 @@ jobs: e2e-matrix: runs-on: larger-runner if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.base_ref == 'main') || github.event_name == 'merge_group' - needs: [yarn-build, checkout-registry] + needs: [yarn-build] strategy: matrix: e2e-type: [cosmwasm, non-cosmwasm] @@ -294,17 +249,8 @@ 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@v4 - with: - path: | - ${{ env.REGISTRY_URI_ABSOLUTE }} - key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} - fail-on-cache-miss: true + - name: Checkout registry + uses: ./.github/actions/checkout-registry - name: agent tests with CosmWasm run: cargo test --release --package run-locally --bin run-locally --features cosmos test-utils -- cosmos::test --nocapture @@ -336,7 +282,6 @@ jobs: prebuild-cli-e2e: runs-on: larger-runner if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.base_ref == 'main') || github.event_name == 'merge_group' - needs: [checkout-registry] steps: - uses: actions/checkout@v4 with: @@ -450,24 +395,15 @@ 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@v4 - with: - path: | - ${{ env.REGISTRY_URI_ABSOLUTE }} - key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} - fail-on-cache-miss: true + - name: Checkout registry + uses: ./.github/actions/checkout-registry - name: cli e2e tests run: ./typescript/cli/ci-test.sh ${{ matrix.test-type }} env-test: runs-on: ubuntu-latest - needs: [yarn-build, checkout-registry] + needs: [yarn-build] strategy: fail-fast: false matrix: @@ -495,17 +431,8 @@ 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@v4 - with: - path: | - ${{ env.REGISTRY_URI_ABSOLUTE }} - key: hyperlane-registry-${{ github.event.pull_request.head.sha || github.sha }} - fail-on-cache-miss: true + - name: Checkout registry + uses: ./.github/actions/checkout-registry - name: Fork test ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} deployment run: cd typescript/infra && ./fork.sh ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} diff --git a/.registryrc b/.registryrc new file mode 100644 index 0000000000..826e142463 --- /dev/null +++ b/.registryrc @@ -0,0 +1 @@ +v2.1.1 diff --git a/Dockerfile b/Dockerfile index 763e1186f9..1a03f74d84 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,8 +29,7 @@ COPY solidity ./solidity RUN yarn build ENV REGISTRY_URI="/hyperlane-registry" -# To allow us to avoid caching the registry clone, we use a build-time arg to force -# the below steps to be re-run if this arg is changed. -ARG REGISTRY_CACHE="default" - -RUN git clone https://github.com/hyperlane-xyz/hyperlane-registry.git "$REGISTRY_URI" +ARG REGISTRY_COMMIT="main" +RUN git clone https://github.com/hyperlane-xyz/hyperlane-registry.git "$REGISTRY_URI" \ + && cd "$REGISTRY_URI" \ + && git checkout "$REGISTRY_COMMIT" From 7adbd276349ba5fd6ccc47e3e4895e857b4ba147 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Mon, 24 Jun 2024 14:19:52 +0100 Subject: [PATCH 27/35] feat(infra): deploy to a set of specific chains (#4040) - feat(infra): deploy to a set of specific chains - allows users to specify more than 1 target chain to deploy to - provides suggestions of available chains to deploy (given local registry) ![image](https://github.com/hyperlane-xyz/hyperlane-monorepo/assets/10051819/020939a9-220d-47dc-b434-e9342ea2ff0f) --------- Signed-off-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- typescript/infra/scripts/agent-utils.ts | 12 ++++++++ typescript/infra/scripts/agents/utils.ts | 10 ++---- typescript/infra/scripts/deploy.ts | 25 +++++++++------ typescript/infra/src/deployment/deploy.ts | 37 +++++++++++++++-------- 4 files changed, 55 insertions(+), 29 deletions(-) diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index a0f0669983..2046d48213 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -116,6 +116,18 @@ export function withChain(args: Argv) { .alias('c', 'chain'); } +export function withChains(args: Argv) { + return ( + args + .describe('chains', 'Set of chains to perform actions on.') + .array('chains') + .choices('chains', getChains()) + // Ensure chains are unique + .coerce('chains', (chains: string[]) => Array.from(new Set(chains))) + .alias('c', 'chains') + ); +} + export function withProtocol(args: Argv) { return args .describe('protocol', 'protocol type') diff --git a/typescript/infra/scripts/agents/utils.ts b/typescript/infra/scripts/agents/utils.ts index c7b8c8a5d6..84fe60f597 100644 --- a/typescript/infra/scripts/agents/utils.ts +++ b/typescript/infra/scripts/agents/utils.ts @@ -12,6 +12,7 @@ import { assertCorrectKubeContext, getArgs, withAgentRole, + withChains, withContext, } from '../agent-utils.js'; import { getConfigsBasedOnArgs } from '../core-utils.js'; @@ -69,14 +70,9 @@ export class AgentCli { protected async init() { if (this.initialized) return; - const argv = await withAgentRole(withContext(getArgs())) + const argv = await withChains(withAgentRole(withContext(getArgs()))) .describe('dry-run', 'Run through the steps without making any changes') - .boolean('dry-run') - .describe('chains', 'Specific chains to perform validator actions on.') - .array('chains') - // Ensure chains are unique - .coerce('chains', (chains: string[]) => Array.from(new Set(chains))) - .alias('c', 'chains').argv; + .boolean('dry-run').argv; if ( argv.chains && diff --git a/typescript/infra/scripts/deploy.ts b/typescript/infra/scripts/deploy.ts index e7ef139661..7c30053cc3 100644 --- a/typescript/infra/scripts/deploy.ts +++ b/typescript/infra/scripts/deploy.ts @@ -22,7 +22,7 @@ import { LiquidityLayerDeployer, TestRecipientDeployer, } from '@hyperlane-xyz/sdk'; -import { objMap } from '@hyperlane-xyz/utils'; +import { objFilter, objMap } from '@hyperlane-xyz/utils'; import { Contexts } from '../config/contexts.js'; import { core as coreConfig } from '../config/environments/mainnet3/core.js'; @@ -44,7 +44,7 @@ import { getArgs, getModuleDirectory, withBuildArtifactPath, - withChain, + withChains, withConcurrentDeploy, withContext, withModuleAndFork, @@ -57,12 +57,12 @@ async function main() { module, fork, environment, - chain, buildArtifactPath, + chains, concurrentDeploy, } = await withContext( withConcurrentDeploy( - withChain(withModuleAndFork(withBuildArtifactPath(getArgs()))), + withChains(withModuleAndFork(withBuildArtifactPath(getArgs()))), ), ).argv; const envConfig = getEnvironmentConfig(environment); @@ -231,7 +231,12 @@ async function main() { // prompt for confirmation in production environments if (environment !== 'test' && !fork) { - const confirmConfig = chain ? config[chain] : config; + const confirmConfig = + chains && chains.length > 0 + ? objFilter(config, (chain, _): _ is unknown => + (chains ?? []).includes(chain), + ) + : config; console.log(JSON.stringify(confirmConfig, null, 2)); const { value: confirmed } = await prompts({ type: 'confirm', @@ -244,13 +249,15 @@ async function main() { } } - await deployWithArtifacts( - config, + await deployWithArtifacts({ + configMap: config as ChainMap, // TODO: fix this typing deployer, cache, - chain ?? fork, + // Use chains if provided, otherwise deploy to all chains + // If fork is provided, deploy to fork only + targetNetworks: chains ?? !fork ? [] : [fork], agentConfig, - ); + }); } main() diff --git a/typescript/infra/src/deployment/deploy.ts b/typescript/infra/src/deployment/deploy.ts index 55d713fd9d..120f8955f7 100644 --- a/typescript/infra/src/deployment/deploy.ts +++ b/typescript/infra/src/deployment/deploy.ts @@ -11,6 +11,7 @@ import { } from '@hyperlane-xyz/sdk'; import { ProtocolType, + objFilter, objMap, objMerge, promiseObjAll, @@ -35,22 +36,28 @@ import { writeMergedJSONAtPath, } from '../utils/utils.js'; -export async function deployWithArtifacts( - configMap: ChainMap, - deployer: HyperlaneDeployer, +export async function deployWithArtifacts({ + configMap, + deployer, + cache, + targetNetworks, + agentConfig, +}: { + configMap: ChainMap; + deployer: HyperlaneDeployer; cache: { verification: string; read: boolean; write: boolean; environment: DeployEnvironment; module: Modules; - }, - targetNetwork?: ChainName, + }; + targetNetworks: ChainName[]; agentConfig?: { multiProvider: MultiProvider; environment: DeployEnvironment; - }, -) { + }; +}) { if (cache.read) { const addressesMap = getAddresses(cache.environment, cache.module); deployer.cacheAddressesMap(addressesMap); @@ -64,13 +71,17 @@ export async function deployWithArtifacts( process.exit(0); // Exit the process }); + // Filter the config map to only deploy the target networks + let targetConfigMap = configMap; + if (targetNetworks.length > 0) { + targetConfigMap = objFilter(configMap, (chain, _): _ is Config => + targetNetworks.includes(chain), + ); + } + + // Deploy the contracts try { - if (targetNetwork) { - deployer.deployedContracts[targetNetwork] = - await deployer.deployContracts(targetNetwork, configMap[targetNetwork]); - } else { - await deployer.deploy(configMap); - } + await deployer.deploy(targetConfigMap); } catch (e) { console.error('Failed to deploy contracts', e); } From a109937f962ea60384e0845e11c678f08a1a8b66 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 24 Jun 2024 14:57:53 +0100 Subject: [PATCH 28/35] chore: some throughput tweaks (#4036) ### Description Context: https://discord.com/channels/935678348330434570/1254036693217054794 ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/Cargo.lock | 1 + rust/Cargo.toml | 1 + rust/agents/relayer/Cargo.toml | 3 ++- rust/agents/relayer/src/msg/pending_message.rs | 13 +++++++++++-- rust/hyperlane-base/Cargo.toml | 6 +++--- .../infra/config/environments/mainnet3/agent.ts | 12 +++++++----- typescript/infra/src/agents/index.ts | 2 +- 7 files changed, 26 insertions(+), 12 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index f1c4f79b2d..a68d609bb3 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -7037,6 +7037,7 @@ dependencies = [ "num-traits", "once_cell", "prometheus", + "rand 0.8.5", "regex", "reqwest", "serde", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 5909e10bc1..fd1c2c5a65 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -119,6 +119,7 @@ pretty_env_logger = "0.5.0" primitive-types = "=0.12.1" prometheus = "0.13" protobuf = "*" +rand = "0.8.5" regex = "1.5" reqwest = "0.11" ripemd = "0.1.3" diff --git a/rust/agents/relayer/Cargo.toml b/rust/agents/relayer/Cargo.toml index cf35092f7a..bbfe17e4ba 100644 --- a/rust/agents/relayer/Cargo.toml +++ b/rust/agents/relayer/Cargo.toml @@ -26,6 +26,7 @@ itertools.workspace = true num-derive.workspace = true num-traits.workspace = true prometheus.workspace = true +rand.workspace = true regex.workspace = true reqwest = { workspace = true, features = ["json"] } serde.workspace = true @@ -43,7 +44,7 @@ hyperlane-ethereum = { path = "../../chains/hyperlane-ethereum" } [dev-dependencies] once_cell.workspace = true -mockall.worksapce = true +mockall.workspace = true tokio-test.workspace = true hyperlane-test = { path = "../../hyperlane-test" } hyperlane-base = { path = "../../hyperlane-base", features = ["test-utils"] } diff --git a/rust/agents/relayer/src/msg/pending_message.rs b/rust/agents/relayer/src/msg/pending_message.rs index a0c373adce..212b004414 100644 --- a/rust/agents/relayer/src/msg/pending_message.rs +++ b/rust/agents/relayer/src/msg/pending_message.rs @@ -484,8 +484,17 @@ impl PendingMessage { i if (24..36).contains(&i) => 60 * 30, // wait 60min for the next 12 attempts i if (36..48).contains(&i) => 60 * 60, - // wait 3h for the next 12 attempts, - _ => 60 * 60 * 3, + // linearly increase the backoff time after 48 attempts, + // adding 1h for each additional attempt + _ => { + let hour: u64 = 60 * 60; + // To be extra safe, `max` to make sure it's at least 1 hour. + let target = hour.max((num_retries - 47) as u64 * hour); + // Schedule it at some random point in the next hour to + // avoid scheduling messages with the same # of retries + // at the exact same time. + target + (rand::random::() % hour) + } })) } } diff --git a/rust/hyperlane-base/Cargo.toml b/rust/hyperlane-base/Cargo.toml index 9f401b399f..36a8432bb6 100644 --- a/rust/hyperlane-base/Cargo.toml +++ b/rust/hyperlane-base/Cargo.toml @@ -23,17 +23,17 @@ ed25519-dalek.workspace = true ethers.workspace = true eyre.workspace = true fuels.workspace = true -futures.worksapce = true +futures.workspace = true futures-util.workspace = true itertools.workspace = true maplit.workspace = true -mockall.worksapce = true +mockall.workspace = true paste.workspace = true prometheus.workspace = true rocksdb.workspace = true serde.workspace = true serde_json.workspace = true -solana-sdk.worksapce = true +solana-sdk.workspace = true static_assertions.workspace = true tempfile = { workspace = true, optional = true } thiserror.workspace = true diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index e224587e5f..2baa1cc225 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -223,8 +223,8 @@ const metricAppContexts = [ // Resource requests are based on observed usage found in https://abacusworks.grafana.net/d/FSR9YWr7k const relayerResources = { requests: { - cpu: '3000m', - memory: '8Gi', + cpu: '14000m', + memory: '12Gi', }, }; @@ -251,7 +251,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '0d12ff3-20240620-173353', + tag: '9535087-20240623-174819', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContexts, @@ -285,9 +285,11 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '0d12ff3-20240620-173353', + tag: '9535087-20240623-174819', }, - whitelist: releaseCandidateHelloworldMatchingList, + // We're temporarily (ab)using the RC relayer as a way to increase + // message throughput. + // whitelist: releaseCandidateHelloworldMatchingList, gasPaymentEnforcement, metricAppContexts, resources: relayerResources, diff --git a/typescript/infra/src/agents/index.ts b/typescript/infra/src/agents/index.ts index c1486e83a3..87873de133 100644 --- a/typescript/infra/src/agents/index.ts +++ b/typescript/infra/src/agents/index.ts @@ -139,7 +139,7 @@ export abstract class AgentHelmManager { rpcConsensusType: this.rpcConsensusType(chain), protocol: metadata.protocol, blocks: { reorgPeriod }, - maxBatchSize: 4, + maxBatchSize: 32, }; }), }, From 7c7e0dd5ed4700e224e5eba2666df7ac43dcacd7 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Mon, 24 Jun 2024 10:45:55 -0400 Subject: [PATCH 29/35] docs: add docstrings for multisig signature ordering (#4042) ### Description Update `MultisigISM.verify` docs with clarity around signature ordering --- solidity/contracts/interfaces/isms/IMultisigIsm.sol | 1 + solidity/contracts/isms/multisig/AbstractMultisigIsm.sol | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/solidity/contracts/interfaces/isms/IMultisigIsm.sol b/solidity/contracts/interfaces/isms/IMultisigIsm.sol index fa4767ff72..0e5ee37a38 100644 --- a/solidity/contracts/interfaces/isms/IMultisigIsm.sol +++ b/solidity/contracts/interfaces/isms/IMultisigIsm.sol @@ -8,6 +8,7 @@ interface IMultisigIsm is IInterchainSecurityModule { * @notice Returns the set of validators responsible for verifying _message * and the number of signatures required * @dev Can change based on the content of _message + * @dev Signatures provided to `verify` must be consistent with validator ordering * @param _message Hyperlane formatted interchain message * @return validators The array of validator addresses * @return threshold The number of validator signatures needed diff --git a/solidity/contracts/isms/multisig/AbstractMultisigIsm.sol b/solidity/contracts/isms/multisig/AbstractMultisigIsm.sol index 34907c32b7..1c03fc9b85 100644 --- a/solidity/contracts/isms/multisig/AbstractMultisigIsm.sol +++ b/solidity/contracts/isms/multisig/AbstractMultisigIsm.sol @@ -26,6 +26,7 @@ abstract contract AbstractMultisigIsm is IMultisigIsm { * @notice Returns the set of validators responsible for verifying _message * and the number of signatures required * @dev Can change based on the content of _message + * @dev Signatures provided to `verify` must be consistent with validator ordering * @param _message Hyperlane formatted interchain message * @return validators The array of validator addresses * @return threshold The number of validator signatures needed @@ -60,7 +61,9 @@ abstract contract AbstractMultisigIsm is IMultisigIsm { /** * @notice Requires that m-of-n validators verify a merkle root, - * and verifies a me∑rkle proof of `_message` against that root. + * and verifies a merkle proof of `_message` against that root. + * @dev Optimization relies on the caller sorting signatures in the same order as validators. + * @dev Employs https://www.geeksforgeeks.org/two-pointers-technique/ to minimize gas usage. * @param _metadata ABI encoded module metadata * @param _message Formatted Hyperlane message (see Message.sol). */ From 718d2c27da0d01060e28421cefce653edef02caa Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:59:52 +0100 Subject: [PATCH 30/35] chore: don't reset retry count when processing retry API reqs (#4037) ### Description When messages are retried due to the Message Retry API, we bring messages to the front of the queue (by changing their `next_attempt_after`), but also reset their retry count. For messages that are unprocessable due to various reasons (and hence have very high `next_attempt_after`), resetting the retry count will cause the relayer to waste time instead of trying to process newer messages. This PR makes it such that the retry API will cause messages to be retried immediately once, but won't boost their priority in the queue afterwards (because `num_retries` isn't changed). ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/agents/relayer/src/msg/pending_message.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/agents/relayer/src/msg/pending_message.rs b/rust/agents/relayer/src/msg/pending_message.rs index 212b004414..5d661411b0 100644 --- a/rust/agents/relayer/src/msg/pending_message.rs +++ b/rust/agents/relayer/src/msg/pending_message.rs @@ -443,7 +443,6 @@ impl PendingMessage { } fn reset_attempts(&mut self) { - self.set_retries(0); self.next_attempt_after = None; self.last_attempted_at = Instant::now(); } From e6b9d0e1bf0b6dd722096c8bba8e99d187cbbdad Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 25 Jun 2024 10:58:07 +0100 Subject: [PATCH 31/35] chore: bump arb costs (#4018) ### Description Big gas spike on arb rn, see https://discord.com/channels/935678348330434570/1253313812652888154 for context ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../infra/config/environments/mainnet3/gasPrices.json | 6 +++--- typescript/infra/scripts/deploy.ts | 6 +++++- typescript/infra/src/config/gas-oracle.ts | 2 ++ typescript/sdk/src/gas/HyperlaneIgpDeployer.ts | 2 ++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index cb689e2970..6d2aff2211 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -1,6 +1,6 @@ { "arbitrum": { - "amount": "0.01", + "amount": "0.5", "decimals": 9 }, "ancient8": { @@ -16,7 +16,7 @@ "decimals": 9 }, "blast": { - "amount": "0.01649352", + "amount": "0.5", "decimals": 9 }, "bsc": { @@ -68,7 +68,7 @@ "decimals": 1 }, "optimism": { - "amount": "0.061126811", + "amount": "0.25", "decimals": 9 }, "osmosis": { diff --git a/typescript/infra/scripts/deploy.ts b/typescript/infra/scripts/deploy.ts index 7c30053cc3..16a4c30176 100644 --- a/typescript/infra/scripts/deploy.ts +++ b/typescript/infra/scripts/deploy.ts @@ -130,7 +130,11 @@ async function main() { ); } else if (module === Modules.INTERCHAIN_GAS_PAYMASTER) { config = envConfig.igp; - deployer = new HyperlaneIgpDeployer(multiProvider, contractVerifier); + deployer = new HyperlaneIgpDeployer( + multiProvider, + contractVerifier, + concurrentDeploy, + ); } else if (module === Modules.INTERCHAIN_ACCOUNTS) { const { core } = await getHyperlaneCore(environment, multiProvider); config = core.getRouterConfig(envConfig.owners); diff --git a/typescript/infra/src/config/gas-oracle.ts b/typescript/infra/src/config/gas-oracle.ts index 1994e91ce5..97d0a3f2b3 100644 --- a/typescript/infra/src/config/gas-oracle.ts +++ b/typescript/infra/src/config/gas-oracle.ts @@ -141,6 +141,8 @@ function getMinUsdCost(local: ChainName, remote: ChainName): number { ancient8: 0.5, base: 0.5, blast: 0.5, + fraxtal: 0.5, + linea: 0.5, mantapacific: 0.5, mode: 0.5, optimism: 0.5, diff --git a/typescript/sdk/src/gas/HyperlaneIgpDeployer.ts b/typescript/sdk/src/gas/HyperlaneIgpDeployer.ts index dc6efc37c5..0c0cbfc34c 100644 --- a/typescript/sdk/src/gas/HyperlaneIgpDeployer.ts +++ b/typescript/sdk/src/gas/HyperlaneIgpDeployer.ts @@ -25,10 +25,12 @@ export class HyperlaneIgpDeployer extends HyperlaneDeployer< constructor( multiProvider: MultiProvider, contractVerifier?: ContractVerifier, + concurrentDeploy: boolean = false, ) { super(multiProvider, igpFactories, { logger: rootLogger.child({ module: 'IgpDeployer' }), contractVerifier, + concurrentDeploy, }); } From d213e323418c46f43cf531ebf8edf00b9886a2e5 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:21:21 +0100 Subject: [PATCH 32/35] feat: relayer queue operation labels (#4003) ### Description - adds status labels to operations in the relayer queues. In practice, the most useful ones are those for when a message is retried due to an error. Labels are defined as enums to keep the cardinality finite, the size of prometheus metrics could get very large - whenever a message is pushed to a queue, the interface requires specifying the new status as a `Option`. If `None`, the status is left as before (such as in the case when an operation isn't ready to be retried). - a limitation is that labels aren't stored in the DB, so messages are loaded with the `FirstPrepareAttempt` label. I just triggered retries for destinations I wanted to get labels for, but we could persist to the db in a follow-up PR - Example prep queue labels for inevm: Screenshot 2024-06-21 at 18 05 58 ### Drive-by changes - removes `make_op_try` as it doesn't really add anything that couldn't be done with regular Rust - bumps the `strum` version because there was a bug in the previous one, preventing inner enum fields from being converted to strings ### Related issues ### Backward compatibility ### Backward compatibility Yes ### Testing Unit tests encoding of `PendingOperationStatus`, need to manually tests e2e --- rust/Cargo.lock | 43 +++++++------ rust/agents/relayer/src/msg/op_queue.rs | 4 ++ rust/agents/relayer/src/msg/op_submitter.rs | 11 +++- .../agents/relayer/src/msg/pending_message.rs | 17 +++++ rust/hyperlane-base/Cargo.toml | 2 - .../src/db/rocks/hyperlane_db.rs | 10 ++- rust/hyperlane-base/src/lib.rs | 6 +- rust/hyperlane-base/src/settings/mod.rs | 3 - .../src/traits/pending_operation.rs | 62 +++++++++++++++++-- 9 files changed, 123 insertions(+), 35 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index a68d609bb3..94449ecd55 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1094,13 +1094,13 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading 0.8.1", + "libloading 0.8.4", ] [[package]] @@ -3908,6 +3908,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -4244,7 +4250,8 @@ dependencies = [ "serde_json", "sha3 0.10.8", "solana-sdk", - "strum 0.25.0", + "strum 0.26.3", + "strum_macros 0.26.4", "thiserror", "tiny-keccak 2.0.2", "tokio", @@ -5175,12 +5182,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-targets 0.52.0", ] [[package]] @@ -5266,9 +5273,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.14" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050" +checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" dependencies = [ "cc", "pkg-config", @@ -6462,9 +6469,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +checksum = "8d3928fb5db768cb86f891ff014f0144589297e3c6a1aba6ed7cecfdace270c7" dependencies = [ "proc-macro2 1.0.76", "syn 2.0.48", @@ -7042,7 +7049,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "strum 0.25.0", + "strum 0.26.3", "thiserror", "tokio", "tokio-metrics", @@ -9518,11 +9525,11 @@ dependencies = [ [[package]] name = "strum" -version = "0.25.0" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.25.3", + "strum_macros 0.26.4", ] [[package]] @@ -9552,11 +9559,11 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2 1.0.76", "quote 1.0.35", "rustversion", diff --git a/rust/agents/relayer/src/msg/op_queue.rs b/rust/agents/relayer/src/msg/op_queue.rs index 07869b0de1..41adc685f3 100644 --- a/rust/agents/relayer/src/msg/op_queue.rs +++ b/rust/agents/relayer/src/msg/op_queue.rs @@ -166,6 +166,10 @@ mod test { todo!() } + fn retrieve_status_from_db(&self) -> Option { + todo!() + } + fn get_operation_labels(&self) -> (String, String) { Default::default() } diff --git a/rust/agents/relayer/src/msg/op_submitter.rs b/rust/agents/relayer/src/msg/op_submitter.rs index 014070dc1b..ec345be722 100644 --- a/rust/agents/relayer/src/msg/op_submitter.rs +++ b/rust/agents/relayer/src/msg/op_submitter.rs @@ -186,9 +186,14 @@ async fn receive_task( // make sure things are getting wired up correctly; if this works in testing it // should also be valid in production. debug_assert_eq!(*op.destination_domain(), domain); - prepare_queue - .push(op, Some(PendingOperationStatus::FirstPrepareAttempt)) - .await; + let status = op.retrieve_status_from_db().unwrap_or_else(|| { + trace!( + ?op, + "No status found for message, defaulting to FirstPrepareAttempt" + ); + PendingOperationStatus::FirstPrepareAttempt + }); + prepare_queue.push(op, Some(status)).await; } } diff --git a/rust/agents/relayer/src/msg/pending_message.rs b/rust/agents/relayer/src/msg/pending_message.rs index 4887e192c0..760a791cbc 100644 --- a/rust/agents/relayer/src/msg/pending_message.rs +++ b/rust/agents/relayer/src/msg/pending_message.rs @@ -127,6 +127,13 @@ impl PendingOperation for PendingMessage { } fn set_status(&mut self, status: PendingOperationStatus) { + if let Err(e) = self + .ctx + .origin_db + .store_status_by_message_id(&self.message.id(), &self.status) + { + warn!(message_id = ?self.message.id(), err = %e, status = %self.status, "Persisting `status` failed for message"); + } self.status = status; } @@ -142,6 +149,16 @@ impl PendingOperation for PendingMessage { self.ctx.destination_mailbox.domain() } + fn retrieve_status_from_db(&self) -> Option { + match self.ctx.origin_db.retrieve_status_by_message_id(&self.id()) { + Ok(status) => status, + Err(e) => { + warn!(error=?e, "Failed to retrieve status for message"); + None + } + } + } + fn app_context(&self) -> Option { self.app_context.clone() } diff --git a/rust/hyperlane-base/Cargo.toml b/rust/hyperlane-base/Cargo.toml index 36a8432bb6..0564c06a7e 100644 --- a/rust/hyperlane-base/Cargo.toml +++ b/rust/hyperlane-base/Cargo.toml @@ -46,7 +46,6 @@ url.workspace = true warp.workspace = true ya-gcp.workspace = true - backtrace = { workspace = true, optional = true } backtrace-oneline = { path = "../utils/backtrace-oneline", optional = true } @@ -58,7 +57,6 @@ hyperlane-sealevel = { path = "../chains/hyperlane-sealevel" } hyperlane-cosmos = { path = "../chains/hyperlane-cosmos"} hyperlane-test = { path = "../hyperlane-test" } - # dependency version is determined by etheres rusoto_core = "*" rusoto_kms = "*" diff --git a/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs b/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs index b4323613ad..6b83e051ad 100644 --- a/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs +++ b/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs @@ -7,7 +7,7 @@ use hyperlane_core::{ GasPaymentKey, HyperlaneDomain, HyperlaneLogStore, HyperlaneMessage, HyperlaneSequenceAwareIndexerStoreReader, HyperlaneWatermarkedLogStore, Indexed, InterchainGasExpenditure, InterchainGasPayment, InterchainGasPaymentMeta, LogMeta, - MerkleTreeInsertion, H256, + MerkleTreeInsertion, PendingOperationStatus, H256, }; use super::{ @@ -27,6 +27,7 @@ const HIGHEST_SEEN_MESSAGE_NONCE: &str = "highest_seen_message_nonce_"; const GAS_PAYMENT_FOR_MESSAGE_ID: &str = "gas_payment_sequence_for_message_id_v2_"; const GAS_PAYMENT_META_PROCESSED: &str = "gas_payment_meta_processed_v3_"; const GAS_EXPENDITURE_FOR_MESSAGE_ID: &str = "gas_expenditure_for_message_id_v2_"; +const STATUS_BY_MESSAGE_ID: &str = "status_by_message_id_"; const PENDING_MESSAGE_RETRY_COUNT_FOR_MESSAGE_ID: &str = "pending_message_retry_count_for_message_id_"; const MERKLE_TREE_INSERTION: &str = "merkle_tree_insertion_"; @@ -501,6 +502,13 @@ make_store_and_retrieve!(pub(self), dispatched_block_number_by_nonce, MESSAGE_DI make_store_and_retrieve!(pub, processed_by_nonce, NONCE_PROCESSED, u32, bool); make_store_and_retrieve!(pub(self), processed_by_gas_payment_meta, GAS_PAYMENT_META_PROCESSED, InterchainGasPaymentMeta, bool); make_store_and_retrieve!(pub(self), interchain_gas_expenditure_data_by_message_id, GAS_EXPENDITURE_FOR_MESSAGE_ID, H256, InterchainGasExpenditureData); +make_store_and_retrieve!( + pub, + status_by_message_id, + STATUS_BY_MESSAGE_ID, + H256, + PendingOperationStatus +); make_store_and_retrieve!(pub(self), interchain_gas_payment_data_by_gas_payment_key, GAS_PAYMENT_FOR_MESSAGE_ID, GasPaymentKey, InterchainGasPaymentData); make_store_and_retrieve!(pub(self), gas_payment_by_sequence, GAS_PAYMENT_BY_SEQUENCE, u32, InterchainGasPayment); make_store_and_retrieve!(pub(self), gas_payment_block_by_sequence, GAS_PAYMENT_BY_SEQUENCE, u32, u64); diff --git a/rust/hyperlane-base/src/lib.rs b/rust/hyperlane-base/src/lib.rs index ce6843e583..7ff1fc2352 100644 --- a/rust/hyperlane-base/src/lib.rs +++ b/rust/hyperlane-base/src/lib.rs @@ -12,6 +12,9 @@ pub mod settings; mod agent; pub use agent::*; +/// The local database used by agents +pub mod db; + pub mod metrics; pub use metrics::*; @@ -28,8 +31,5 @@ pub use traits::*; mod types; pub use types::*; -/// Hyperlane database utils -pub mod db; - #[cfg(feature = "oneline-eyre")] pub mod oneline_eyre; diff --git a/rust/hyperlane-base/src/settings/mod.rs b/rust/hyperlane-base/src/settings/mod.rs index aa7bee5341..6eb1279534 100644 --- a/rust/hyperlane-base/src/settings/mod.rs +++ b/rust/hyperlane-base/src/settings/mod.rs @@ -65,9 +65,6 @@ pub use base::*; pub use chains::*; pub use checkpoint_syncer::*; -/// Export this so they don't need to import paste. -#[doc(hidden)] -pub use paste; pub use signers::*; pub use trace::*; diff --git a/rust/hyperlane-core/src/traits/pending_operation.rs b/rust/hyperlane-core/src/traits/pending_operation.rs index 476ec9e4be..ed6148bb8e 100644 --- a/rust/hyperlane-core/src/traits/pending_operation.rs +++ b/rust/hyperlane-core/src/traits/pending_operation.rs @@ -1,12 +1,14 @@ +use serde::{Deserialize, Serialize}; use std::{ cmp::Ordering, fmt::{Debug, Display}, + io::Write, time::{Duration, Instant}, }; use crate::{ - ChainResult, FixedPointNumber, HyperlaneDomain, HyperlaneMessage, TryBatchAs, TxOutcome, H256, - U256, + ChainResult, Decode, Encode, FixedPointNumber, HyperlaneDomain, HyperlaneMessage, + HyperlaneProtocolError, TryBatchAs, TxOutcome, H256, U256, }; use async_trait::async_trait; use num::CheckedDiv; @@ -50,6 +52,9 @@ pub trait PendingOperation: Send + Sync + Debug + TryBatchAs { /// The domain this originates from. fn origin_domain_id(&self) -> u32; + /// Get the operation status from the local db, if there is one + fn retrieve_status_from_db(&self) -> Option; + /// The domain this operation will take place on. fn destination_domain(&self) -> &HyperlaneDomain; @@ -114,8 +119,10 @@ pub trait PendingOperation: Send + Sync + Debug + TryBatchAs { fn set_retries(&mut self, retries: u32); } -#[derive(Debug, Display, Clone)] +#[derive(Debug, Display, Clone, Serialize, Deserialize, PartialEq)] /// Status of a pending operation +/// WARNING: This enum is serialized to JSON and stored in the database, so to keep backwards compatibility, we shouldn't remove or rename any variants. +/// Adding new variants is fine. pub enum PendingOperationStatus { /// The operation is ready to be prepared for the first time, or has just been loaded from storage FirstPrepareAttempt, @@ -129,8 +136,38 @@ pub enum PendingOperationStatus { Confirm(ConfirmReason), } -#[derive(Display, Debug, Clone)] +impl Encode for PendingOperationStatus { + fn write_to(&self, writer: &mut W) -> std::io::Result + where + W: Write, + { + // Serialize to JSON and write to the writer, to avoid having to implement the encoding manually + let serialized = serde_json::to_vec(self) + .map_err(|_| std::io::Error::new(std::io::ErrorKind::Other, "Failed to serialize"))?; + writer.write(&serialized) + } +} + +impl Decode for PendingOperationStatus { + fn read_from(reader: &mut R) -> Result + where + R: std::io::Read, + Self: Sized, + { + // Deserialize from JSON and read from the reader, to avoid having to implement the encoding / decoding manually + serde_json::from_reader(reader).map_err(|err| { + HyperlaneProtocolError::IoError(std::io::Error::new( + std::io::ErrorKind::Other, + format!("Failed to deserialize. Error: {}", err), + )) + }) + } +} + +#[derive(Display, Debug, Clone, Serialize, Deserialize, PartialEq)] /// Reasons for repreparing an operation +/// WARNING: This enum is serialized to JSON and stored in the database, so to keep backwards compatibility, we shouldn't remove or rename any variants. +/// Adding new variants is fine. pub enum ReprepareReason { #[strum(to_string = "Error checking message delivery status")] /// Error checking message delivery status @@ -167,8 +204,10 @@ pub enum ReprepareReason { RevertedOrReorged, } -#[derive(Display, Debug, Clone)] +#[derive(Display, Debug, Clone, Serialize, Deserialize, PartialEq)] /// Reasons for repreparing an operation +/// WARNING: This enum is serialized to JSON and stored in the database, so to keep backwards compatibility, we shouldn't remove or rename any variants. +/// Adding new variants is fine. pub enum ConfirmReason { #[strum(to_string = "Submitted by this relayer")] /// Operation was submitted by this relayer @@ -274,3 +313,16 @@ pub enum PendingOperationResult { /// Send this message straight to the confirm queue Confirm(ConfirmReason), } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_encoding_pending_operation_status() { + let status = PendingOperationStatus::Retry(ReprepareReason::CouldNotFetchMetadata); + let encoded = status.to_vec(); + let decoded = PendingOperationStatus::read_from(&mut &encoded[..]).unwrap(); + assert_eq!(status, decoded); + } +} From 44cc9bf6b33f5288462ecc027e9d624ae682d552 Mon Sep 17 00:00:00 2001 From: Mohammed Hussan Date: Wed, 26 Jun 2024 15:40:42 +0100 Subject: [PATCH 35/35] feat(cli): Add avs validator status command (#4056) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description - Command to check all operators on our AVS and show the chains that they are validating on - Already been reviewed here https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/4004, this PR was to merge it main instead of cli-2.0 Example usage: ``` yarn hyperlane avs check --chain ethereum --registry $REGISTRY Hyperlane CLI Checking AVS validator status for ethereum, this may take up to a minute to run... ❗️ MerkleTreeHook is not deployed on anvil8545 Operator name: Abacus Works AVS Operator Operator address: 0xFe114FcC7609578f525219a8eF77e2CCe27C5357 Validator address: 0x03c842db86A6A3E524D4a6615390c1Ea8E2b9541 Validating on... ethereum Storage location: s3://hyperlane-mainnet3-ethereum-validator-0/us-east-1 Latest merkle tree checkpoint index: 8219 Latest validator checkpoint index: 8219 ✅ Validator is signing latest checkpoint Operator name: Kelp by Kiln Operator address: 0x96fC0751e0febe7296d4625500f8e4535a002c7d Validator address: 0xEa5f21513182e97D0169a4d2E7aC71Ae8827F5bC Validating on... ethereum Storage location: s3://kiln-mainnet-hyperlane-validator-signatures/eu-west-1/ethereum Latest merkle tree checkpoint index: 8219 ❌ Failed to fetch latest signed checkpoint index The following warnings were encountered: ❗️ Failed to fetch latest signed checkpoint index of validator on ethereum, this is likely due to failing to read an S3 bucket ``` ### Drive-by changes ### Related issues - Fixes #3976 ### Backward compatibility No ### Testing Manual --- .changeset/brave-penguins-ring.md | 6 + .../avs/vendored/IDelegationManager.sol | 5 + typescript/cli/src/avs/check.ts | 449 ++++++++++++++++++ typescript/cli/src/avs/config.ts | 3 + typescript/cli/src/avs/stakeRegistry.ts | 2 +- typescript/cli/src/commands/avs.ts | 69 ++- typescript/cli/src/commands/options.ts | 17 + typescript/cli/src/logger.ts | 8 + typescript/cli/src/utils/files.ts | 8 + typescript/cli/src/validator/utils.ts | 69 +++ typescript/sdk/src/aws/s3.ts | 2 +- typescript/sdk/src/aws/validator.ts | 4 + 12 files changed, 627 insertions(+), 15 deletions(-) create mode 100644 .changeset/brave-penguins-ring.md create mode 100644 typescript/cli/src/avs/check.ts create mode 100644 typescript/cli/src/validator/utils.ts diff --git a/.changeset/brave-penguins-ring.md b/.changeset/brave-penguins-ring.md new file mode 100644 index 0000000000..8c04ddbc6d --- /dev/null +++ b/.changeset/brave-penguins-ring.md @@ -0,0 +1,6 @@ +--- +'@hyperlane-xyz/cli': minor +'@hyperlane-xyz/core': minor +--- + +Add CLI command to support AVS validator status check diff --git a/solidity/contracts/interfaces/avs/vendored/IDelegationManager.sol b/solidity/contracts/interfaces/avs/vendored/IDelegationManager.sol index 8af9f453a3..50fe9295a7 100644 --- a/solidity/contracts/interfaces/avs/vendored/IDelegationManager.sol +++ b/solidity/contracts/interfaces/avs/vendored/IDelegationManager.sol @@ -20,6 +20,11 @@ interface IDelegationManager { uint32 stakerOptOutWindowBlocks; } + event OperatorMetadataURIUpdated( + address indexed operator, + string metadataURI + ); + function registerAsOperator( OperatorDetails calldata registeringOperatorDetails, string calldata metadataURI diff --git a/typescript/cli/src/avs/check.ts b/typescript/cli/src/avs/check.ts new file mode 100644 index 0000000000..6730463e62 --- /dev/null +++ b/typescript/cli/src/avs/check.ts @@ -0,0 +1,449 @@ +import { Wallet } from 'ethers'; + +import { + ECDSAStakeRegistry__factory, + IDelegationManager__factory, + MerkleTreeHook__factory, + ValidatorAnnounce__factory, +} from '@hyperlane-xyz/core'; +import { ChainMap, ChainName, MultiProvider } from '@hyperlane-xyz/sdk'; +import { Address, ProtocolType, isObjEmpty } from '@hyperlane-xyz/utils'; + +import { CommandContext } from '../context/types.js'; +import { + errorRed, + log, + logBlue, + logBlueKeyValue, + logBoldBlue, + logDebug, + logGreen, + warnYellow, +} from '../logger.js'; +import { indentYamlOrJson } from '../utils/files.js'; +import { + getLatestMerkleTreeCheckpointIndex, + getLatestValidatorCheckpointIndexAndUrl, + getValidatorStorageLocations, + isValidatorSigningLatestCheckpoint, +} from '../validator/utils.js'; + +import { avsAddresses } from './config.js'; +import { readOperatorFromEncryptedJson } from './stakeRegistry.js'; + +interface ChainInfo { + storageLocation?: string; + latestMerkleTreeCheckpointIndex?: number; + latestValidatorCheckpointIndex?: number; + validatorSynced?: boolean; + warnings?: string[]; +} + +interface ValidatorInfo { + operatorAddress: Address; + operatorName?: string; + chains: ChainMap; +} + +export const checkValidatorAvsSetup = async ( + chain: string, + context: CommandContext, + operatorKeyPath?: string, + operatorAddress?: string, +) => { + logBlue( + `Checking AVS validator status for ${chain}, ${ + !operatorKeyPath ? 'this may take up to a minute to run' : '' + }...`, + ); + + const { multiProvider } = context; + + const topLevelErrors: string[] = []; + + let operatorWallet: Wallet | undefined; + if (operatorKeyPath) { + operatorWallet = await readOperatorFromEncryptedJson(operatorKeyPath); + } + + const avsOperatorRecord = await getAvsOperators( + chain, + multiProvider, + topLevelErrors, + operatorAddress ?? operatorWallet?.address, + ); + + await setOperatorName( + chain, + avsOperatorRecord, + multiProvider, + topLevelErrors, + ); + + if (!isObjEmpty(avsOperatorRecord)) { + await setValidatorInfo(context, avsOperatorRecord, topLevelErrors); + } + + logOutput(avsOperatorRecord, topLevelErrors); +}; + +const getAvsOperators = async ( + chain: string, + multiProvider: MultiProvider, + topLevelErrors: string[], + operatorKey?: string, +): Promise> => { + const avsOperators: Record = {}; + + const ecdsaStakeRegistryAddress = getEcdsaStakeRegistryAddress( + chain, + topLevelErrors, + ); + + if (!ecdsaStakeRegistryAddress) { + return avsOperators; + } + + const ecdsaStakeRegistry = ECDSAStakeRegistry__factory.connect( + ecdsaStakeRegistryAddress, + multiProvider.getProvider(chain), + ); + + if (operatorKey) { + // If operator key is provided, only fetch the operator's validator info + const signingKey = await ecdsaStakeRegistry.getLastestOperatorSigningKey( + operatorKey, + ); + avsOperators[signingKey] = { + operatorAddress: operatorKey, + chains: {}, + }; + + return avsOperators; + } + + const filter = ecdsaStakeRegistry.filters.SigningKeyUpdate(null, null); + const provider = multiProvider.getProvider(chain); + const latestBlock = await provider.getBlockNumber(); + const blockLimit = 50000; // 50k blocks per query + + let fromBlock = 1625972; // when ecdsaStakeRegistry was deployed + + while (fromBlock < latestBlock) { + const toBlock = Math.min(fromBlock + blockLimit, latestBlock); + const logs = await ecdsaStakeRegistry.queryFilter( + filter, + fromBlock, + toBlock, + ); + + logs.forEach((log) => { + const event = ecdsaStakeRegistry.interface.parseLog(log); + const operatorKey = event.args.operator; + const signingKey = event.args.newSigningKey; + + if (avsOperators[signingKey]) { + avsOperators[signingKey].operatorAddress = operatorKey; + } else { + avsOperators[signingKey] = { + operatorAddress: operatorKey, + chains: {}, + }; + } + }); + + fromBlock = toBlock + 1; + } + + return avsOperators; +}; + +const getAVSMetadataURI = async ( + chain: string, + operatorAddress: string, + multiProvider: MultiProvider, +): Promise => { + const delegationManagerAddress = avsAddresses[chain]['delegationManager']; + + const delegationManager = IDelegationManager__factory.connect( + delegationManagerAddress, + multiProvider.getProvider(chain), + ); + + const filter = delegationManager.filters.OperatorMetadataURIUpdated( + operatorAddress, + null, + ); + + const provider = multiProvider.getProvider(chain); + const latestBlock = await provider.getBlockNumber(); + const blockLimit = 50000; // 50k blocks per query + + let fromBlock = 17445563; + while (fromBlock < latestBlock) { + const toBlock = Math.min(fromBlock + blockLimit, latestBlock); + const logs = await delegationManager.queryFilter( + filter, + fromBlock, + toBlock, + ); + + if (logs.length > 0) { + const event = delegationManager.interface.parseLog(logs[0]); + return event.args.metadataURI; + } + + fromBlock = toBlock + 1; + } + + return undefined; +}; + +const setOperatorName = async ( + chain: string, + avsOperatorRecord: Record, + multiProvider: MultiProvider, + topLevelErrors: string[] = [], +) => { + for (const [_, validatorInfo] of Object.entries(avsOperatorRecord)) { + const metadataURI = await getAVSMetadataURI( + chain, + validatorInfo.operatorAddress, + multiProvider, + ); + + if (metadataURI) { + const operatorName = await fetchOperatorName(metadataURI); + if (operatorName) { + validatorInfo.operatorName = operatorName; + } else { + topLevelErrors.push( + `❗️ Failed to fetch operator name from metadataURI: ${metadataURI}`, + ); + } + } + } +}; + +const setValidatorInfo = async ( + context: CommandContext, + avsOperatorRecord: Record, + topLevelErrors: string[], +) => { + const { multiProvider, registry, chainMetadata } = context; + const failedToReadChains: string[] = []; + + const validatorAddresses = Object.keys(avsOperatorRecord); + + const chains = await registry.getChains(); + const addresses = await registry.getAddresses(); + + for (const chain of chains) { + // skip if chain is not an Ethereum chain + if (chainMetadata[chain].protocol !== ProtocolType.Ethereum) continue; + + const chainAddresses = addresses[chain]; + + // skip if no contract addresses are found for this chain + if (chainAddresses === undefined) continue; + + if (!chainAddresses.validatorAnnounce) { + topLevelErrors.push(`❗️ ValidatorAnnounce is not deployed on ${chain}`); + } + + if (!chainAddresses.merkleTreeHook) { + topLevelErrors.push(`❗️ MerkleTreeHook is not deployed on ${chain}`); + } + + if (!chainAddresses.validatorAnnounce || !chainAddresses.merkleTreeHook) { + continue; + } + + const validatorAnnounce = ValidatorAnnounce__factory.connect( + chainAddresses.validatorAnnounce, + multiProvider.getProvider(chain), + ); + + const merkleTreeHook = MerkleTreeHook__factory.connect( + chainAddresses.merkleTreeHook, + multiProvider.getProvider(chain), + ); + + const latestMerkleTreeCheckpointIndex = + await getLatestMerkleTreeCheckpointIndex(merkleTreeHook, chain); + + const validatorStorageLocations = await getValidatorStorageLocations( + validatorAnnounce, + validatorAddresses, + chain, + ); + + if (!validatorStorageLocations) { + failedToReadChains.push(chain); + continue; + } + + for (let i = 0; i < validatorAddresses.length; i++) { + const validatorAddress = validatorAddresses[i]; + const storageLocation = validatorStorageLocations[i]; + const warnings: string[] = []; + + // Skip if no storage location is found, address is not validating on this chain or if storage location string doesn't not start with s3:// + if ( + storageLocation.length === 0 || + !storageLocation[0].startsWith('s3://') + ) { + continue; + } + + const [latestValidatorCheckpointIndex, latestCheckpointUrl] = + (await getLatestValidatorCheckpointIndexAndUrl(storageLocation[0])) ?? [ + undefined, + undefined, + ]; + + if (!latestMerkleTreeCheckpointIndex) { + warnings.push( + `❗️ Failed to fetch latest checkpoint index of merkleTreeHook on ${chain}.`, + ); + } + + if (!latestValidatorCheckpointIndex) { + warnings.push( + `❗️ Failed to fetch latest signed checkpoint index of validator on ${chain}, this is likely due to failing to read an S3 bucket`, + ); + } + + let validatorSynced = undefined; + if (latestMerkleTreeCheckpointIndex && latestValidatorCheckpointIndex) { + validatorSynced = isValidatorSigningLatestCheckpoint( + latestValidatorCheckpointIndex, + latestMerkleTreeCheckpointIndex, + ); + } + + const chainInfo: ChainInfo = { + storageLocation: latestCheckpointUrl, + latestMerkleTreeCheckpointIndex, + latestValidatorCheckpointIndex, + validatorSynced, + warnings, + }; + + const validatorInfo = avsOperatorRecord[validatorAddress]; + if (validatorInfo) { + validatorInfo.chains[chain as ChainName] = chainInfo; + } + } + } + + if (failedToReadChains.length > 0) { + topLevelErrors.push( + `❗️ Failed to read storage locations onchain for ${failedToReadChains.join( + ', ', + )}`, + ); + } +}; + +const logOutput = ( + avsKeysRecord: Record, + topLevelErrors: string[], +) => { + if (topLevelErrors.length > 0) { + for (const error of topLevelErrors) { + errorRed(error); + } + } + + for (const [validatorAddress, data] of Object.entries(avsKeysRecord)) { + log('\n\n'); + if (data.operatorName) logBlueKeyValue('Operator name', data.operatorName); + logBlueKeyValue('Operator address', data.operatorAddress); + logBlueKeyValue('Validator address', validatorAddress); + + if (!isObjEmpty(data.chains)) { + logBoldBlue(indentYamlOrJson('Validating on...', 2)); + for (const [chain, chainInfo] of Object.entries(data.chains)) { + logBoldBlue(indentYamlOrJson(chain, 2)); + + if (chainInfo.storageLocation) { + logBlueKeyValue( + indentYamlOrJson('Storage location', 2), + chainInfo.storageLocation, + ); + } + + if (chainInfo.latestMerkleTreeCheckpointIndex) { + logBlueKeyValue( + indentYamlOrJson('Latest merkle tree checkpoint index', 2), + String(chainInfo.latestMerkleTreeCheckpointIndex), + ); + } + + if (chainInfo.latestValidatorCheckpointIndex) { + logBlueKeyValue( + indentYamlOrJson('Latest validator checkpoint index', 2), + String(chainInfo.latestValidatorCheckpointIndex), + ); + + if (chainInfo.validatorSynced) { + logGreen( + indentYamlOrJson('✅ Validator is signing latest checkpoint', 2), + ); + } else { + errorRed( + indentYamlOrJson( + '❌ Validator is not signing latest checkpoint', + 2, + ), + ); + } + } else { + errorRed( + indentYamlOrJson( + '❌ Failed to fetch latest signed checkpoint index', + 2, + ), + ); + } + + if (chainInfo.warnings && chainInfo.warnings.length > 0) { + warnYellow( + indentYamlOrJson('The following warnings were encountered:', 2), + ); + for (const warning of chainInfo.warnings) { + warnYellow(indentYamlOrJson(warning, 3)); + } + } + } + } else { + logBlue('Validator is not validating on any chain'); + } + } +}; + +const getEcdsaStakeRegistryAddress = ( + chain: string, + topLevelErrors: string[], +): Address | undefined => { + try { + return avsAddresses[chain]['ecdsaStakeRegistry']; + } catch (err) { + topLevelErrors.push( + `❗️ EcdsaStakeRegistry address not found for ${chain}`, + ); + return undefined; + } +}; + +const fetchOperatorName = async (metadataURI: string) => { + try { + const response = await fetch(metadataURI); + const data = await response.json(); + return data['name']; + } catch (err) { + logDebug(`Failed to fetch operator name from ${metadataURI}: ${err}`); + return undefined; + } +}; diff --git a/typescript/cli/src/avs/config.ts b/typescript/cli/src/avs/config.ts index 79715a6765..72b4f0dfce 100644 --- a/typescript/cli/src/avs/config.ts +++ b/typescript/cli/src/avs/config.ts @@ -3,6 +3,7 @@ import { Address } from '@hyperlane-xyz/utils'; interface AVSContracts { avsDirectory: Address; + delegationManager: Address; proxyAdmin: Address; ecdsaStakeRegistry: Address; hyperlaneServiceManager: Address; @@ -12,12 +13,14 @@ interface AVSContracts { export const avsAddresses: ChainMap = { holesky: { avsDirectory: '0x055733000064333CaDDbC92763c58BF0192fFeBf', + delegationManager: '0xA44151489861Fe9e3055d95adC98FbD462B948e7', proxyAdmin: '0x33dB966328Ea213b0f76eF96CA368AB37779F065', ecdsaStakeRegistry: '0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72', hyperlaneServiceManager: '0xc76E477437065093D353b7d56c81ff54D167B0Ab', }, ethereum: { avsDirectory: '0x135dda560e946695d6f155dacafc6f1f25c1f5af', + delegationManager: '0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A', proxyAdmin: '0x75EE15Ee1B4A75Fa3e2fDF5DF3253c25599cc659', ecdsaStakeRegistry: '0x272CF0BB70D3B4f79414E0823B426d2EaFd48910', hyperlaneServiceManager: '0xe8E59c6C8B56F2c178f63BCFC4ce5e5e2359c8fc', diff --git a/typescript/cli/src/avs/stakeRegistry.ts b/typescript/cli/src/avs/stakeRegistry.ts index d1bdd0716d..705d52da11 100644 --- a/typescript/cli/src/avs/stakeRegistry.ts +++ b/typescript/cli/src/avs/stakeRegistry.ts @@ -109,7 +109,7 @@ export async function deregisterOperator({ ); } -async function readOperatorFromEncryptedJson( +export async function readOperatorFromEncryptedJson( operatorKeyPath: string, ): Promise { const encryptedJson = readFileAtPath(resolvePath(operatorKeyPath)); diff --git a/typescript/cli/src/commands/avs.ts b/typescript/cli/src/commands/avs.ts index ce238df621..66b1a92647 100644 --- a/typescript/cli/src/commands/avs.ts +++ b/typescript/cli/src/commands/avs.ts @@ -1,14 +1,21 @@ import { CommandModule, Options } from 'yargs'; import { ChainName } from '@hyperlane-xyz/sdk'; -import { Address } from '@hyperlane-xyz/utils'; +import { Address, ProtocolType } from '@hyperlane-xyz/utils'; +import { checkValidatorAvsSetup } from '../avs/check.js'; import { deregisterOperator, registerOperatorWithSignature, } from '../avs/stakeRegistry.js'; import { CommandModuleWithWriteContext } from '../context/types.js'; -import { log } from '../logger.js'; +import { errorRed, log } from '../logger.js'; + +import { + avsChainCommandOption, + demandOption, + operatorKeyPathCommandOption, +} from './options.js'; /** * Parent command @@ -20,6 +27,7 @@ export const avsCommand: CommandModule = { yargs .command(registerCommand) .command(deregisterCommand) + .command(checkCommand) .version(false) .demandCommand(), handler: () => log('Command required'), @@ -29,17 +37,8 @@ export const avsCommand: CommandModule = { * Registration command */ export const registrationOptions: { [k: string]: Options } = { - chain: { - type: 'string', - description: 'Chain to interact with the AVS on', - demandOption: true, - choices: ['holesky', 'ethereum'], - }, - operatorKeyPath: { - type: 'string', - description: 'Path to the operator key file', - demandOption: true, - }, + chain: avsChainCommandOption, + operatorKeyPath: demandOption(operatorKeyPathCommandOption), avsSigningKeyAddress: { type: 'string', description: 'Address of the AVS signing key', @@ -87,3 +86,47 @@ const deregisterCommand: CommandModuleWithWriteContext<{ process.exit(0); }, }; + +const checkCommand: CommandModuleWithWriteContext<{ + chain: ChainName; + operatorKeyPath?: string; + operatorAddress?: string; +}> = { + command: 'check', + describe: 'Check AVS', + builder: { + chain: avsChainCommandOption, + operatorKeyPath: operatorKeyPathCommandOption, + operatorAddress: { + type: 'string', + description: 'Address of the operator to check', + }, + }, + handler: async ({ context, chain, operatorKeyPath, operatorAddress }) => { + const { multiProvider } = context; + + // validate chain + if (!multiProvider.hasChain(chain)) { + errorRed( + `❌ No metadata found for ${chain}. Ensure it is included in your configured registry.`, + ); + process.exit(1); + } + + const chainMetadata = multiProvider.getChainMetadata(chain); + + if (chainMetadata.protocol !== ProtocolType.Ethereum) { + errorRed(`\n❌ Validator AVS check only supports EVM chains. Exiting.`); + process.exit(1); + } + + await checkValidatorAvsSetup( + chain, + context, + operatorKeyPath, + operatorAddress, + ); + + process.exit(0); + }, +}; diff --git a/typescript/cli/src/commands/options.ts b/typescript/cli/src/commands/options.ts index 3774b43cb4..033fb7ba82 100644 --- a/typescript/cli/src/commands/options.ts +++ b/typescript/cli/src/commands/options.ts @@ -8,6 +8,11 @@ import { ENV } from '../utils/env.js'; /* Global options */ +export const demandOption = (option: Options): Options => ({ + ...option, + demandOption: true, +}); + export const logFormatCommandOption: Options = { type: 'string', description: 'Log output format', @@ -178,3 +183,15 @@ export const awsKeyIdCommandOption: Options = { type: 'string', describe: 'Key ID from AWS KMS', }; + +export const operatorKeyPathCommandOption: Options = { + type: 'string', + description: 'Path to the operator key file', +}; + +export const avsChainCommandOption: Options = { + type: 'string', + description: 'Chain to interact with the AVS on', + demandOption: true, + choices: ['holesky', 'ethereum'], +}; diff --git a/typescript/cli/src/logger.ts b/typescript/cli/src/logger.ts index b2a021d546..d5347c66d5 100644 --- a/typescript/cli/src/logger.ts +++ b/typescript/cli/src/logger.ts @@ -35,6 +35,9 @@ export function logColor( } } export const logBlue = (...args: any) => logColor('info', chalk.blue, ...args); +export const logBlueKeyValue = (key: string, value: string) => { + logBlue(`${chalk.bold(`${key}:`)} ${value}`); +}; export const logPink = (...args: any) => logColor('info', chalk.magentaBright, ...args); export const logGray = (...args: any) => logColor('info', chalk.gray, ...args); @@ -43,11 +46,16 @@ export const logGreen = (...args: any) => export const logRed = (...args: any) => logColor('info', chalk.red, ...args); export const logBoldUnderlinedRed = (...args: any) => logColor('info', chalk.red.bold.underline, ...args); +export const logBoldBlue = (...args: any) => + logColor('info', chalk.blue.bold, ...args); export const logTip = (...args: any) => logColor('info', chalk.bgYellow, ...args); export const warnYellow = (...args: any) => logColor('warn', chalk.yellow, ...args); export const errorRed = (...args: any) => logColor('error', chalk.red, ...args); +export const logDebug = (msg: string, ...args: any) => + logger.debug(msg, ...args); + // No support for table in pino so print directly to console export const logTable = (...args: any) => console.table(...args); diff --git a/typescript/cli/src/utils/files.ts b/typescript/cli/src/utils/files.ts index 844eb4b798..277850af60 100644 --- a/typescript/cli/src/utils/files.ts +++ b/typescript/cli/src/utils/files.ts @@ -210,3 +210,11 @@ export async function runFileSelectionStep( if (filename) return filename; else throw new Error(`No filepath entered ${description}`); } + +export function indentYamlOrJson(str: string, indentLevel: number): string { + const indent = ' '.repeat(indentLevel); + return str + .split('\n') + .map((line) => indent + line) + .join('\n'); +} diff --git a/typescript/cli/src/validator/utils.ts b/typescript/cli/src/validator/utils.ts new file mode 100644 index 0000000000..c96aa66125 --- /dev/null +++ b/typescript/cli/src/validator/utils.ts @@ -0,0 +1,69 @@ +import { MerkleTreeHook, ValidatorAnnounce } from '@hyperlane-xyz/core'; +import { S3Validator } from '@hyperlane-xyz/sdk'; + +import { logDebug } from '../logger.js'; + +export const getLatestMerkleTreeCheckpointIndex = async ( + merkleTreeHook: MerkleTreeHook, + chainName?: string, +): Promise => { + try { + const [_, latestCheckpointIndex] = await merkleTreeHook.latestCheckpoint(); + return latestCheckpointIndex; + } catch (err) { + const debugMessage = `Failed to get latest checkpoint index from merkleTreeHook contract ${ + chainName ? `on ${chainName}` : '' + } : ${err}`; + logDebug(debugMessage); + return undefined; + } +}; + +export const getValidatorStorageLocations = async ( + validatorAnnounce: ValidatorAnnounce, + validators: string[], + chainName?: string, +): Promise => { + try { + return await validatorAnnounce.getAnnouncedStorageLocations(validators); + } catch (err) { + const debugMessage = `Failed to get announced storage locations from validatorAnnounce contract ${ + chainName ? `on ${chainName}` : '' + } : ${err}`; + logDebug(debugMessage); + return undefined; + } +}; + +export const getLatestValidatorCheckpointIndexAndUrl = async ( + s3StorageLocation: string, +): Promise<[number, string] | undefined> => { + let s3Validator: S3Validator; + try { + s3Validator = await S3Validator.fromStorageLocation(s3StorageLocation); + } catch (err) { + logDebug( + `Failed to instantiate S3Validator at location ${s3StorageLocation}: ${err}`, + ); + return undefined; + } + try { + const latestCheckpointIndex = await s3Validator.getLatestCheckpointIndex(); + return [latestCheckpointIndex, s3Validator.getLatestCheckpointUrl()]; + } catch (err) { + logDebug( + `Failed to get latest checkpoint index from S3Validator at location ${s3StorageLocation}: ${err}`, + ); + return undefined; + } +}; + +export const isValidatorSigningLatestCheckpoint = ( + latestValidatorCheckpointIndex: number, + latestMerkleTreeCheckpointIndex: number, +): boolean => { + const diff = Math.abs( + latestValidatorCheckpointIndex - latestMerkleTreeCheckpointIndex, + ); + return diff < latestMerkleTreeCheckpointIndex / 100; +}; diff --git a/typescript/sdk/src/aws/s3.ts b/typescript/sdk/src/aws/s3.ts index a222617b35..462aa26fee 100644 --- a/typescript/sdk/src/aws/s3.ts +++ b/typescript/sdk/src/aws/s3.ts @@ -75,6 +75,6 @@ export class S3Wrapper { url(key: string): string { const Key = this.formatKey(key); - return `https://${this.config.bucket}.${this.config.region}.s3.amazonaws.com/${Key}`; + return `https://${this.config.bucket}.s3.${this.config.region}.amazonaws.com/${Key}`; } } diff --git a/typescript/sdk/src/aws/validator.ts b/typescript/sdk/src/aws/validator.ts index 11f91c576f..3bb142feb9 100644 --- a/typescript/sdk/src/aws/validator.ts +++ b/typescript/sdk/src/aws/validator.ts @@ -103,4 +103,8 @@ export class S3Validator extends BaseValidator { storageLocation(): string { return `${LOCATION_PREFIX}/${this.s3Bucket.config.bucket}/${this.s3Bucket.config.region}`; } + + getLatestCheckpointUrl(): string { + return this.s3Bucket.url(LATEST_KEY); + } }