diff --git a/.changeset/big-squids-serve.md b/.changeset/big-squids-serve.md deleted file mode 100644 index 18883a8e60..0000000000 --- a/.changeset/big-squids-serve.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@hyperlane-xyz/helloworld': patch -'@hyperlane-xyz/widgets': patch -'@hyperlane-xyz/cli': patch -'@hyperlane-xyz/sdk': patch ---- - -Bump registry version to v6.3.0. diff --git a/.changeset/chilly-balloons-rule.md b/.changeset/chilly-balloons-rule.md deleted file mode 100644 index b339b75699..0000000000 --- a/.changeset/chilly-balloons-rule.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/utils': minor ---- - -Added `isPrivateKeyEvm` function for validating EVM private keys diff --git a/.changeset/cold-cows-grow.md b/.changeset/cold-cows-grow.md new file mode 100644 index 0000000000..f0f601414a --- /dev/null +++ b/.changeset/cold-cows-grow.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/infra': minor +--- + +Add USDC between Ink and Ethereum diff --git a/.changeset/dull-pianos-kiss.md b/.changeset/dull-pianos-kiss.md deleted file mode 100644 index 333a748904..0000000000 --- a/.changeset/dull-pianos-kiss.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@hyperlane-xyz/helloworld': minor -'@hyperlane-xyz/widgets': minor -'@hyperlane-xyz/infra': minor -'@hyperlane-xyz/cli': minor -'@hyperlane-xyz/sdk': minor ---- - -Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 diff --git a/.changeset/eleven-carrots-shave.md b/.changeset/eleven-carrots-shave.md new file mode 100644 index 0000000000..ef5f577bdb --- /dev/null +++ b/.changeset/eleven-carrots-shave.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': patch +--- + +Fix the return type of multisig and aggregation ISMs for zksync-stack chains. diff --git a/.changeset/empty-lemons-explode.md b/.changeset/empty-lemons-explode.md deleted file mode 100644 index 1116888e23..0000000000 --- a/.changeset/empty-lemons-explode.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Add support for deploying Hooks using a HookConfig within a WarpConfig diff --git a/.changeset/fresh-fishes-bake.md b/.changeset/fresh-fishes-bake.md deleted file mode 100644 index 92b4dfdd2d..0000000000 --- a/.changeset/fresh-fishes-bake.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperlane-xyz/sdk': major ---- - -Rename TokenConfig related types and utilities for clarity. E.g. `CollateralConfig` to `CollateralTokenConfig`. -Export more config types and zod schemas diff --git a/.changeset/hot-spies-share.md b/.changeset/hot-spies-share.md deleted file mode 100644 index 4a215ae53c..0000000000 --- a/.changeset/hot-spies-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -fix signer strategy init for broken cli commands diff --git a/.changeset/long-llamas-fly.md b/.changeset/long-llamas-fly.md deleted file mode 100644 index c0d6d01e9b..0000000000 --- a/.changeset/long-llamas-fly.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperlane-xyz/cli": patch ---- - -Suppress help on CLI failures diff --git a/.changeset/nine-eyes-smile.md b/.changeset/nine-eyes-smile.md deleted file mode 100644 index e0ae7027b5..0000000000 --- a/.changeset/nine-eyes-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/core': minor ---- - -Made releaseValueToRecipient internal diff --git a/.changeset/rare-windows-deny.md b/.changeset/rare-windows-deny.md new file mode 100644 index 0000000000..c744963c9c --- /dev/null +++ b/.changeset/rare-windows-deny.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/infra': minor +--- + +Add rstETH/ethereum-zircuit warp config diff --git a/.changeset/serious-kangaroos-chew.md b/.changeset/serious-kangaroos-chew.md new file mode 100644 index 0000000000..87d5b072f9 --- /dev/null +++ b/.changeset/serious-kangaroos-chew.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Deploy to new chains: artela, guru, hemi, nero, xpla. diff --git a/.changeset/smooth-rocks-hammer.md b/.changeset/smooth-rocks-hammer.md deleted file mode 100644 index 8cc170aac9..0000000000 --- a/.changeset/smooth-rocks-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': patch ---- - -Update default validator sets for alephzeroevmmainnet, appchain, lisk, lumiaprism, swell, treasure, vana, zklink. diff --git a/.changeset/spicy-gifts-hear.md b/.changeset/spicy-gifts-hear.md deleted file mode 100644 index 37d4efa28d..0000000000 --- a/.changeset/spicy-gifts-hear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management diff --git a/.changeset/tall-starfishes-hunt.md b/.changeset/tall-starfishes-hunt.md new file mode 100644 index 0000000000..4419db9d2e --- /dev/null +++ b/.changeset/tall-starfishes-hunt.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Fix hyperlane warp send where --origin and --destination are out of order diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 98426a76a6..7f491f8f11 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -126,10 +126,16 @@ jobs: fail-fast: false matrix: test: + # Core Commands - core-apply + - core-check - core-deploy + - core-init - core-read + # Other commands - relay + # Warp Commands + - warp-init - warp-read - warp-apply - warp-deploy @@ -301,7 +307,7 @@ jobs: fail-fast: false matrix: environment: [mainnet3] - chain: [ethereum, arbitrum, optimism, inevm, viction] + chain: [ethereum, arbitrum, optimism, inevm] module: [core, igp] include: - environment: testnet4 diff --git a/.registryrc b/.registryrc index 15e15930d3..4b56572aa1 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -bde63f7c32e8d169d7e3163b14b5bb25bd3d5042 +2184e5e3064ddec2734aa53c1aff6d9f7d958bdf diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000000..feb0260b65 --- /dev/null +++ b/config.yaml @@ -0,0 +1,12 @@ +ethereum: + type: collateral + token: "0x7a4EffD87C2f3C55CA251080b1343b605f327E3a" + owner: "0xDA0d054265bB30F4f32C92066428FE57513E7ee1" + mailbox: "0xc005dc82818d67AF737725bD4bf75435d065D239" + interchainSecurityModule: "0x0000000000000000000000000000000000000000" +zircuit: + type: synthetic + owner: "0xA1895dF8AE7b7678E82E76b167A24c82Fb83ec9A" + mailbox: "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c" + interchainSecurityModule: "0x0000000000000000000000000000000000000000" + diff --git a/rust/README.md b/rust/README.md index 35050b1e79..2e4577deac 100644 --- a/rust/README.md +++ b/rust/README.md @@ -119,11 +119,10 @@ cargo test --release --package run-locally --bin run-locally --features cosmos - ### Building Agent Docker Images There exists a docker build for the agent binaries. These docker images are used for deploying the agents in a -production environment. +production environment. You should run this at the top level of the repo. ```bash -cd rust -./build.sh +./rust/build.sh ``` ### Deploy Procedure diff --git a/rust/build.sh b/rust/build.sh index 65214900b5..16af4721ba 100755 --- a/rust/build.sh +++ b/rust/build.sh @@ -19,4 +19,4 @@ if [[ -z $TAG ]]; then fi fi -DOCKER_BUILDKIT=1 docker build $PLATFORM -t gcr.io/abacus-labs-dev/hyperlane-agent:$TAG . +DOCKER_BUILDKIT=1 docker build -f rust/Dockerfile $PLATFORM -t gcr.io/abacus-labs-dev/hyperlane-agent:$TAG . diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index e29131af94..aea92da917 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -464,6 +464,12 @@ dependencies = [ "critical-section", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -511,13 +517,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.3.4", "bitflags 1.3.2", "bytes", "futures-util", "http 0.2.12", - "http-body", - "hyper", + "http-body 0.4.6", + "hyper 0.14.30", "itoa", "matchit", "memchr", @@ -529,9 +535,36 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "tokio", - "tower", + "tower 0.4.13", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core 0.4.5", + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper 1.0.2", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -546,13 +579,33 @@ dependencies = [ "bytes", "futures-util", "http 0.2.12", - "http-body", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", "tower-service", ] +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.71" @@ -1391,7 +1444,7 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml", + "toml 0.5.11", "yaml-rust", ] @@ -1536,6 +1589,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1544,30 +1607,30 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cosmos-sdk-proto" -version = "0.19.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c9d2043a9e617b0d602fbc0a0ecd621568edbf3a9774890a6d562389bd8e1c" +checksum = "8b2f63ab112b8c8e7b8a29c891adc48f43145beb21c0bfbf562957072c1e0beb" dependencies = [ - "prost 0.11.9", - "prost-types 0.11.9", - "tendermint-proto 0.32.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tonic 0.9.2", + "prost 0.13.4", + "prost-types 0.13.4", + "tendermint-proto", + "tonic 0.12.3", ] [[package]] name = "cosmrs" -version = "0.14.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af13955d6f356272e6def9ff5e2450a7650df536d8934f47052a20c76513d2f6" +checksum = "9f21bb63ec6a903510a3d01f44735dd4914724e5eccbe409e6da6833d17c7829" dependencies = [ "cosmos-sdk-proto", "ecdsa 0.16.9", "eyre", - "getrandom 0.2.15", "k256 0.13.4", "rand_core 0.6.4", "serde", "serde_json", + "signature 2.2.0", "subtle-encoding", "tendermint", "tendermint-rpc", @@ -1855,23 +1918,14 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array 0.14.7", "subtle", ] -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct 0.6.1", -] - [[package]] name = "ctr" version = "0.9.2" @@ -2901,7 +2955,7 @@ dependencies = [ [[package]] name = "ethers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-addressbook", "ethers-contract", @@ -2915,7 +2969,7 @@ dependencies = [ [[package]] name = "ethers-addressbook" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-core", "once_cell", @@ -2926,7 +2980,7 @@ dependencies = [ [[package]] name = "ethers-contract" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -2944,7 +2998,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "Inflector", "cfg-if", @@ -2960,7 +3014,7 @@ dependencies = [ "serde", "serde_json", "syn 1.0.109", - "toml", + "toml 0.5.11", "url", "walkdir", ] @@ -2968,7 +3022,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -2982,7 +3036,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "arrayvec", "bytes", @@ -3012,7 +3066,7 @@ dependencies = [ [[package]] name = "ethers-etherscan" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-core", "getrandom 0.2.15", @@ -3028,7 +3082,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "auto_impl 0.5.0", @@ -3047,6 +3101,7 @@ dependencies = [ "tokio", "tracing", "tracing-futures", + "tracing-test", "url", ] @@ -3076,7 +3131,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "auto_impl 1.2.0", @@ -3112,7 +3167,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-10#d9f822ef9dd3d63b88cae74973540ef9e6773015" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "coins-bip32 0.7.0", @@ -3149,9 +3204,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c80c6714d1a380314fcb11a22eeff022e1e1c9642f0bb54e15dc9cb29f37b29" dependencies = [ "futures", - "hyper", - "hyper-rustls 0.24.2", - "hyper-timeout", + "hyper 0.14.30", + "hyper-rustls", + "hyper-timeout 0.4.1", "log", "pin-project", "rand 0.8.5", @@ -3387,7 +3442,7 @@ dependencies = [ "fuel-core-types", "futures", "hex 0.4.3", - "hyper-rustls 0.24.2", + "hyper-rustls", "itertools 0.12.1", "reqwest", "schemafy_lib", @@ -3998,6 +4053,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.2.0", + "indexmap 2.5.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hash32" version = "0.2.1" @@ -4206,7 +4280,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.11.1", + "crypto-mac 0.11.0", "digest 0.9.0", ] @@ -4252,9 +4326,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -4272,6 +4346,29 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.2.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "pin-project-lite", +] + [[package]] name = "httparse" version = "1.9.4" @@ -4310,9 +4407,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -4325,40 +4422,24 @@ dependencies = [ ] [[package]] -name = "hyper-proxy" -version = "0.9.1" +name = "hyper" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", - "futures", - "headers", - "http 0.2.12", - "hyper", - "hyper-rustls 0.22.1", - "rustls-native-certs 0.5.0", - "tokio", - "tokio-rustls 0.22.0", - "tower-service", - "webpki 0.21.4", -] - -[[package]] -name = "hyper-rustls" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" -dependencies = [ - "ct-logs", + "futures-channel", "futures-util", - "hyper", - "log", - "rustls 0.19.1", - "rustls-native-certs 0.5.0", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", "tokio", - "tokio-rustls 0.22.0", - "webpki 0.21.4", - "webpki-roots 0.21.1", + "want", ] [[package]] @@ -4369,7 +4450,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper", + "hyper 0.14.30", "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", @@ -4384,12 +4465,25 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.30", "pin-project-lite", "tokio", "tokio-io-timeout", ] +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.5.2", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -4397,19 +4491,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.30", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.5.2", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "hyperlane-base" version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "axum", + "axum 0.6.20", "backtrace", "backtrace-oneline", "bs58 0.5.1", @@ -4517,8 +4630,8 @@ dependencies = [ "derive-new", "futures", "hex 0.4.3", - "http 0.2.12", - "hyper", + "http 1.2.0", + "hyper 0.14.30", "hyper-tls", "hyperlane-core", "hyperlane-cosmwasm-interface", @@ -4537,7 +4650,7 @@ dependencies = [ "thiserror", "time", "tokio", - "tonic 0.9.2", + "tonic 0.12.3", "tracing", "tracing-futures", "url", @@ -4975,20 +5088,31 @@ dependencies = [ [[package]] name = "injective-std" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7a5b52d19dca05823c7e4b481d41b49c04a0e56f66a5c92396a6fdd3314710" +version = "1.13.2-hyperlane-2025-01-09-11-28" +source = "git+https://github.com/hyperlane-xyz/cw-injective.git?tag=1.13.2-hyperlane-2025-01-09-11-28#d3e5bf33f8374026e696749dd54b041a69887cbd" dependencies = [ "chrono", - "cosmwasm-std 1.5.7", - "osmosis-std-derive", - "prost 0.11.9", - "prost-types 0.11.9", + "cosmwasm-std 2.1.3", + "injective-std-derive", + "prost 0.13.4", + "prost-types 0.13.4", "schemars", "serde", "serde-cw-value", ] +[[package]] +name = "injective-std-derive" +version = "1.13.0" +source = "git+https://github.com/hyperlane-xyz/cw-injective.git?tag=1.13.2-hyperlane-2025-01-09-11-28#d3e5bf33f8374026e696749dd54b041a69887cbd" +dependencies = [ + "cosmwasm-std 2.1.3", + "itertools 0.10.5", + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 1.0.109", +] + [[package]] name = "inout" version = "0.1.3" @@ -5527,7 +5651,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -5953,18 +6077,6 @@ version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" -[[package]] -name = "osmosis-std-derive" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4d482a16be198ee04e0f94e10dd9b8d02332dcf33bc5ea4b255e7e25eedc5df" -dependencies = [ - "itertools 0.10.5", - "proc-macro2 1.0.86", - "quote 1.0.37", - "syn 1.0.109", -] - [[package]] name = "ouroboros" version = "0.15.6" @@ -6148,9 +6260,9 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "peg" -version = "0.7.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" dependencies = [ "peg-macros", "peg-runtime", @@ -6158,9 +6270,9 @@ dependencies = [ [[package]] name = "peg-macros" -version = "0.7.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" dependencies = [ "peg-runtime", "proc-macro2 1.0.86", @@ -6169,9 +6281,9 @@ dependencies = [ [[package]] name = "peg-runtime" -version = "0.7.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" [[package]] name = "pem" @@ -6438,7 +6550,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -6449,7 +6561,7 @@ checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ "once_cell", "thiserror", - "toml", + "toml 0.5.11", ] [[package]] @@ -6543,42 +6655,42 @@ dependencies = [ [[package]] name = "prost" -version = "0.11.9" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.11.9", + "prost-derive 0.12.6", ] [[package]] name = "prost" -version = "0.12.6" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ "bytes", - "prost-derive 0.12.6", + "prost-derive 0.13.4", ] [[package]] name = "prost-derive" -version = "0.11.9" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] name = "prost-derive" -version = "0.12.6" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", "itertools 0.12.1", @@ -6589,20 +6701,20 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.11.9" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ - "prost 0.11.9", + "prost 0.12.6", ] [[package]] name = "prost-types" -version = "0.12.6" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" dependencies = [ - "prost 0.12.6", + "prost 0.13.4", ] [[package]] @@ -6694,7 +6806,7 @@ dependencies = [ "thiserror", "tokio", "tracing", - "webpki 0.22.4", + "webpki", ] [[package]] @@ -6714,7 +6826,7 @@ dependencies = [ "thiserror", "tinyvec", "tracing", - "webpki 0.22.4", + "webpki", ] [[package]] @@ -6979,7 +7091,7 @@ name = "relayer" version = "0.1.0" dependencies = [ "async-trait", - "axum", + "axum 0.6.20", "config", "console-subscriber", "convert_case 0.6.0", @@ -7040,11 +7152,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", - "hyper", - "hyper-rustls 0.24.2", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-rustls", "hyper-tls", "ipnet", "js-sys", @@ -7055,11 +7167,12 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.12", + "rustls-native-certs 0.6.3", "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", @@ -7273,7 +7386,7 @@ dependencies = [ "crc32fast", "futures", "http 0.2.12", - "hyper", + "hyper 0.14.30", "hyper-tls", "lazy_static", "log", @@ -7296,7 +7409,7 @@ dependencies = [ "chrono", "dirs-next", "futures", - "hyper", + "hyper 0.14.30", "serde", "serde_json", "shlex", @@ -7345,7 +7458,7 @@ dependencies = [ "hex 0.4.3", "hmac 0.11.0", "http 0.2.12", - "hyper", + "hyper 0.14.30", "log", "md-5 0.9.1", "percent-encoding", @@ -7449,63 +7562,65 @@ dependencies = [ [[package]] name = "rustls" -version = "0.19.1" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ - "base64 0.13.1", "log", "ring 0.16.20", - "sct 0.6.1", - "webpki 0.21.4", + "sct", + "webpki", ] [[package]] name = "rustls" -version = "0.20.9" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.16.20", - "sct 0.7.1", - "webpki 0.22.4", + "ring 0.17.8", + "rustls-webpki 0.101.7", + "sct", ] [[package]] name = "rustls" -version = "0.21.12" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "log", + "once_cell", "ring 0.17.8", - "rustls-webpki", - "sct 0.7.1", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.5.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls 0.19.1", + "rustls-pemfile 1.0.4", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.4", + "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.2.0", ] [[package]] @@ -7526,6 +7641,21 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -7536,6 +7666,17 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -7703,16 +7844,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "sct" version = "0.7.1" @@ -7955,7 +8086,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -7963,9 +8107,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -8096,6 +8240,15 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -9272,9 +9425,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "subtle-encoding" @@ -9342,6 +9495,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + [[package]] name = "synstructure" version = "0.12.6" @@ -9372,7 +9531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -9434,8 +9593,9 @@ dependencies = [ [[package]] name = "tendermint" -version = "0.32.2" -source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d9d6ffeb83b1de47c307c6e0d2dff56c6256989299010ad03cd80a8491e97" dependencies = [ "bytes", "digest 0.10.7", @@ -9446,8 +9606,8 @@ dependencies = [ "k256 0.13.4", "num-traits", "once_cell", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.13.4", + "prost-types 0.13.4", "ripemd", "serde", "serde_bytes", @@ -9457,53 +9617,35 @@ dependencies = [ "signature 2.2.0", "subtle", "subtle-encoding", - "tendermint-proto 0.32.2 (git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork)", + "tendermint-proto", "time", "zeroize", ] [[package]] name = "tendermint-config" -version = "0.32.2" -source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de111ea653b2adaef627ac2452b463c77aa615c256eaaddf279ec5a1cf9775f" dependencies = [ "flex-error", "serde", "serde_json", "tendermint", - "toml", + "toml 0.8.19", "url", ] [[package]] name = "tendermint-proto" -version = "0.32.2" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" -dependencies = [ - "bytes", - "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", - "serde", - "serde_bytes", - "subtle-encoding", - "time", -] - -[[package]] -name = "tendermint-proto" -version = "0.32.2" -source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" +checksum = "8ed14abe3b0502a3afe21ca74ca5cdd6c7e8d326d982c26f98a394445eb31d6e" dependencies = [ "bytes", "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.13.4", + "prost-types 0.13.4", "serde", "serde_bytes", "subtle-encoding", @@ -9512,20 +9654,19 @@ dependencies = [ [[package]] name = "tendermint-rpc" -version = "0.32.2" -source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02f96a2b8a0d3d0b59e4024b1a6bdc1589efc6af4709d08a480a20cc4ba90f63" dependencies = [ "async-trait", "bytes", "flex-error", "futures", "getrandom 0.2.15", - "http 0.2.12", - "hyper", - "hyper-proxy", - "hyper-rustls 0.22.1", "peg", "pin-project", + "rand 0.8.5", + "reqwest", "semver", "serde", "serde_bytes", @@ -9534,13 +9675,13 @@ dependencies = [ "subtle-encoding", "tendermint", "tendermint-config", - "tendermint-proto 0.32.2 (git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork)", + "tendermint-proto", "thiserror", "time", "tokio", "tracing", "url", - "uuid 0.8.2", + "uuid 1.10.0", "walkdir", ] @@ -9697,9 +9838,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -9758,41 +9899,40 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.22.0" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.19.1", + "rustls 0.20.9", "tokio", - "webpki 0.21.4", + "webpki", ] [[package]] name = "tokio-rustls" -version = "0.23.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.20.9", + "rustls 0.21.12", "tokio", - "webpki 0.22.4", ] [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.21.12", + "rustls 0.23.20", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -9824,7 +9964,7 @@ dependencies = [ "tokio", "tokio-rustls 0.23.4", "tungstenite 0.17.3", - "webpki 0.22.4", + "webpki", "webpki-roots 0.22.6", ] @@ -9862,11 +10002,26 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.20", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -9886,37 +10041,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ "indexmap 2.5.0", + "serde", + "serde_spanned", "toml_datetime", "winnow 0.6.18", ] [[package]] name = "tonic" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" dependencies = [ "async-stream", "async-trait", - "axum", + "axum 0.6.20", "base64 0.21.7", "bytes", - "futures-core", - "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", - "hyper", - "hyper-timeout", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-timeout 0.4.1", "percent-encoding", "pin-project", - "prost 0.11.9", + "prost 0.12.6", + "rustls 0.21.12", "rustls-native-certs 0.6.3", "rustls-pemfile 1.0.4", "tokio", "tokio-rustls 0.24.1", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -9924,30 +10080,32 @@ dependencies = [ [[package]] name = "tonic" -version = "0.10.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", - "axum", - "base64 0.21.7", + "axum 0.7.9", + "base64 0.22.1", "bytes", - "h2", - "http 0.2.12", - "http-body", - "hyper", - "hyper-timeout", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.2", + "hyper-timeout 0.5.2", + "hyper-util", "percent-encoding", "pin-project", - "prost 0.12.6", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "rustls-pemfile 1.0.4", + "prost 0.13.4", + "rustls-native-certs 0.8.1", + "rustls-pemfile 2.2.0", + "socket2 0.5.7", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls 0.26.1", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -9973,6 +10131,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -10125,7 +10297,7 @@ dependencies = [ "thiserror", "url", "utf-8", - "webpki 0.22.4", + "webpki", "webpki-roots 0.22.6", ] @@ -10138,7 +10310,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http 1.2.0", "httparse", "log", "rand 0.8.5", @@ -10374,7 +10546,7 @@ name = "validator" version = "0.1.0" dependencies = [ "async-trait", - "axum", + "axum 0.6.20", "chrono", "config", "console-subscriber", @@ -10474,7 +10646,7 @@ dependencies = [ "futures-util", "headers", "http 0.2.12", - "hyper", + "hyper 0.14.30", "log", "mime", "mime_guess", @@ -10602,16 +10774,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "webpki" version = "0.22.4" @@ -10622,22 +10784,13 @@ dependencies = [ "untrusted 0.9.0", ] -[[package]] -name = "webpki-roots" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" -dependencies = [ - "webpki 0.21.4", -] - [[package]] name = "webpki-roots" version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" dependencies = [ - "webpki 0.22.4", + "webpki", ] [[package]] @@ -10965,8 +11118,8 @@ dependencies = [ "futures", "http 0.2.12", "humantime-serde", - "hyper", - "hyper-rustls 0.24.2", + "hyper 0.14.30", + "hyper-rustls", "paste", "rand 0.8.5", "rustls 0.21.12", @@ -10976,7 +11129,7 @@ dependencies = [ "thiserror", "tokio", "tonic 0.10.2", - "tower", + "tower 0.4.13", "tracing", "yup-oauth2", ] @@ -11010,8 +11163,8 @@ dependencies = [ "base64 0.13.1", "futures", "http 0.2.12", - "hyper", - "hyper-rustls 0.24.2", + "hyper 0.14.30", + "hyper-rustls", "itertools 0.10.5", "log", "percent-encoding", diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index 72e3d6348d..832bee0c42 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -46,7 +46,7 @@ color-eyre = "0.6" config = "0.13.3" console-subscriber = "0.2.0" convert_case = "0.6" -cosmrs = { version = "0.14", default-features = false, features = [ +cosmrs = { version = "0.18.0", default-features = false, features = [ "cosmwasm", "rpc", "tokio", @@ -73,12 +73,12 @@ bech32 = "0.9.1" elliptic-curve = "0.13.8" getrandom = { version = "0.2", features = ["js"] } hex = "0.4.3" -http = "0.2.12" +http = "1.2.0" hyper = "0.14" hyper-tls = "0.5.0" hyperlane-cosmwasm-interface = "=0.0.6-rc6" injective-protobuf = "0.2.2" -injective-std = "=0.1.5" +injective-std = "1.13.2-hyperlane-2025-01-09-11-28" itertools = "*" jobserver = "=0.1.26" jsonrpc-core = "18.0" @@ -134,16 +134,16 @@ static_assertions = "1.1" strum = "0.26.2" strum_macros = "0.26.2" tempfile = "3.3" -tendermint = "0.32.2" -tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"] } +tendermint = "0.38.1" +tendermint-rpc = { version = "0.38.1", features = ["http-client", "tokio"] } thiserror = "1.0" time = "0.3" tiny-keccak = "2.0.2" -tokio = { version = "1.4", features = ["parking_lot", "tracing"] } +tokio = { version = "1.42.0", features = ["parking_lot", "tracing"] } tokio-metrics = { version = "0.3.1", default-features = false } tokio-test = "0.4" toml_edit = "0.19.14" -tonic = "0.9.2" +tonic = "0.12.3" tracing = { version = "0.1" } tracing-error = "0.2" tracing-futures = "0.2" @@ -198,27 +198,27 @@ overflow-checks = true [workspace.dependencies.ethers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-10" +tag = "2025-01-10" [workspace.dependencies.ethers-contract] features = ["legacy"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-10" +tag = "2025-01-10" [workspace.dependencies.ethers-core] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-10" +tag = "2025-01-10" [workspace.dependencies.ethers-providers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-10" +tag = "2025-01-10" [workspace.dependencies.ethers-signers] features = ["aws"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-10" +tag = "2025-01-10" [patch.crates-io.curve25519-dalek] branch = "v3.2.2-relax-zeroize" @@ -300,12 +300,7 @@ version = "=0.1.0" git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" -[patch.crates-io.tendermint] -branch = "trevor/0.32.2-fork" -git = "https://github.com/hyperlane-xyz/tendermint-rs.git" -version = "=0.32.2" - -[patch.crates-io.tendermint-rpc] -branch = "trevor/0.32.2-fork" -git = "https://github.com/hyperlane-xyz/tendermint-rs.git" -version = "=0.32.2" +[patch.crates-io.injective-std] +version = "1.13.2-hyperlane-2025-01-09-11-28" +git = "https://github.com/hyperlane-xyz/cw-injective.git" +tag = "1.13.2-hyperlane-2025-01-09-11-28" diff --git a/rust/main/agents/relayer/src/merkle_tree/processor.rs b/rust/main/agents/relayer/src/merkle_tree/processor.rs index 9ddcc2ee0c..e12a7fc343 100644 --- a/rust/main/agents/relayer/src/merkle_tree/processor.rs +++ b/rust/main/agents/relayer/src/merkle_tree/processor.rs @@ -7,7 +7,10 @@ use std::{ use async_trait::async_trait; use derive_new::new; use eyre::Result; -use hyperlane_base::db::{HyperlaneDb, HyperlaneRocksDB}; +use hyperlane_base::{ + db::{HyperlaneDb, HyperlaneRocksDB}, + CoreMetrics, +}; use hyperlane_core::{HyperlaneDomain, MerkleTreeInsertion}; use prometheus::IntGauge; use tokio::sync::RwLock; @@ -71,8 +74,9 @@ impl MerkleTreeProcessor { .retrieve_merkle_tree_insertion_by_leaf_index(&self.leaf_index)? { // Update the metrics + // we assume that leaves are inserted in order so this will be monotonically increasing self.metrics - .max_leaf_index_gauge + .latest_leaf_index_gauge .set(insertion.index() as i64); Some(insertion) } else { @@ -85,17 +89,15 @@ impl MerkleTreeProcessor { #[derive(Debug)] pub struct MerkleTreeProcessorMetrics { - max_leaf_index_gauge: IntGauge, + latest_leaf_index_gauge: IntGauge, } impl MerkleTreeProcessorMetrics { - pub fn new() -> Self { + pub fn new(metrics: &CoreMetrics, origin: &HyperlaneDomain) -> Self { Self { - max_leaf_index_gauge: IntGauge::new( - "max_leaf_index_gauge", - "The max merkle tree leaf index", - ) - .unwrap(), + latest_leaf_index_gauge: metrics + .latest_leaf_index() + .with_label_values(&[origin.name()]), } } } diff --git a/rust/main/agents/relayer/src/msg/metadata/aggregation.rs b/rust/main/agents/relayer/src/msg/metadata/aggregation.rs index 072ce62b65..1d4ecbc732 100644 --- a/rust/main/agents/relayer/src/msg/metadata/aggregation.rs +++ b/rust/main/agents/relayer/src/msg/metadata/aggregation.rs @@ -117,7 +117,7 @@ impl AggregationIsmMetadataBuilder { #[async_trait] impl MetadataBuilder for AggregationIsmMetadataBuilder { - #[instrument(err, skip(self), ret)] + #[instrument(err, skip(self, message), ret)] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn build( &self, diff --git a/rust/main/agents/relayer/src/msg/metadata/base.rs b/rust/main/agents/relayer/src/msg/metadata/base.rs index be10af6110..b2e4e5d185 100644 --- a/rust/main/agents/relayer/src/msg/metadata/base.rs +++ b/rust/main/agents/relayer/src/msg/metadata/base.rs @@ -189,7 +189,7 @@ impl Deref for MessageMetadataBuilder { #[async_trait] impl MetadataBuilder for MessageMetadataBuilder { - #[instrument(err, skip(self), fields(destination_domain=self.destination_domain().name()))] + #[instrument(err, skip(self, message), fields(destination_domain=self.destination_domain().name()))] async fn build( &self, ism_address: H256, @@ -228,7 +228,7 @@ impl MessageMetadataBuilder { } } - #[instrument(err, skip(self), fields(destination_domain=self.destination_domain().name()), ret)] + #[instrument(err, skip(self, message), fields(destination_domain=self.destination_domain().name()), ret)] pub async fn build_ism_and_metadata( &self, ism_address: H256, diff --git a/rust/main/agents/relayer/src/msg/metadata/ccip_read.rs b/rust/main/agents/relayer/src/msg/metadata/ccip_read.rs index 507271c123..49b15837df 100644 --- a/rust/main/agents/relayer/src/msg/metadata/ccip_read.rs +++ b/rust/main/agents/relayer/src/msg/metadata/ccip_read.rs @@ -27,7 +27,7 @@ pub struct CcipReadIsmMetadataBuilder { #[async_trait] impl MetadataBuilder for CcipReadIsmMetadataBuilder { - #[instrument(err, skip(self))] + #[instrument(err, skip(self, message))] async fn build( &self, ism_address: H256, diff --git a/rust/main/agents/relayer/src/msg/metadata/routing.rs b/rust/main/agents/relayer/src/msg/metadata/routing.rs index 0f319e8251..f8d5a145bc 100644 --- a/rust/main/agents/relayer/src/msg/metadata/routing.rs +++ b/rust/main/agents/relayer/src/msg/metadata/routing.rs @@ -14,7 +14,7 @@ pub struct RoutingIsmMetadataBuilder { #[async_trait] impl MetadataBuilder for RoutingIsmMetadataBuilder { - #[instrument(err, skip(self), ret)] + #[instrument(err, skip(self, message), ret)] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn build( &self, diff --git a/rust/main/agents/relayer/src/msg/op_queue.rs b/rust/main/agents/relayer/src/msg/op_queue.rs index 95025d391c..99c9dde39f 100644 --- a/rust/main/agents/relayer/src/msg/op_queue.rs +++ b/rust/main/agents/relayer/src/msg/op_queue.rs @@ -29,10 +29,8 @@ impl OpQueue { /// it's very likely that its status has just changed, so this forces the caller to consider the new status #[instrument(skip(self), ret, fields(queue_label=%self.queue_metrics_label), level = "trace")] pub async fn push(&self, mut op: QueueOperation, new_status: Option) { - op.set_status_and_update_metrics( - new_status, - Arc::new(self.get_operation_metric(op.as_ref())), - ); + let new_metric = Arc::new(self.get_new_operation_metric(op.as_ref(), new_status.clone())); + op.set_status_and_update_metrics(new_status, new_metric); self.queue.lock().await.push(Reverse(op)); } @@ -99,12 +97,17 @@ impl OpQueue { } /// Get the metric associated with this operation - fn get_operation_metric(&self, operation: &dyn PendingOperation) -> IntGauge { + fn get_new_operation_metric( + &self, + operation: &dyn PendingOperation, + new_status: Option, + ) -> IntGauge { let (destination, app_context) = operation.get_operation_labels(); + let new_metric_status = new_status.unwrap_or(operation.status()); self.metrics.with_label_values(&[ &destination, &self.queue_metrics_label, - &operation.status().to_string(), + &new_metric_status.to_string(), &app_context, ]) } diff --git a/rust/main/agents/relayer/src/msg/op_submitter.rs b/rust/main/agents/relayer/src/msg/op_submitter.rs index c1e295a24a..1f0a54234c 100644 --- a/rust/main/agents/relayer/src/msg/op_submitter.rs +++ b/rust/main/agents/relayer/src/msg/op_submitter.rs @@ -543,7 +543,7 @@ impl OperationBatch { }; if !excluded_ops.is_empty() { - warn!(excluded_ops=?excluded_ops, "Either the batch tx would revert, or the operations would revert in the batch. Falling back to serial submission."); + warn!(excluded_ops=?excluded_ops, "Either operations reverted in the batch or the txid wasn't included. Falling back to serial submission."); OperationBatch::new(excluded_ops, self.domain) .submit_serially(prepare_queue, confirm_queue, metrics) .await; diff --git a/rust/main/agents/relayer/src/msg/pending_message.rs b/rust/main/agents/relayer/src/msg/pending_message.rs index d63b7b03f3..92d279856d 100644 --- a/rust/main/agents/relayer/src/msg/pending_message.rs +++ b/rust/main/agents/relayer/src/msg/pending_message.rs @@ -32,7 +32,7 @@ pub const CONFIRM_DELAY: Duration = if cfg!(any(test, feature = "test-utils")) { // Wait 5 seconds after submitting the message before confirming in test mode Duration::from_secs(5) } else { - // Wait 1 min after submitting the message before confirming in normal/production mode + // Wait 10 min after submitting the message before confirming in normal/production mode Duration::from_secs(60 * 10) }; @@ -338,7 +338,7 @@ impl PendingOperation for PendingMessage { PendingOperationResult::Success } - #[instrument] + #[instrument(skip(self), fields(id=?self.id(), domain=%self.destination_domain()))] async fn submit(&mut self) -> PendingOperationResult { if self.submitted { // this message has already been submitted, possibly not by us diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index 6bd1a63a8d..b1f013b6ae 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -587,7 +587,7 @@ impl Relayer { origin: &HyperlaneDomain, task_monitor: TaskMonitor, ) -> Instrumented> { - let metrics = MerkleTreeProcessorMetrics::new(); + let metrics = MerkleTreeProcessorMetrics::new(&self.core.metrics, origin); let merkle_tree_processor = MerkleTreeProcessor::new( self.dbs.get(origin).unwrap().clone(), metrics, diff --git a/rust/main/chains/hyperlane-cosmos/Cargo.toml b/rust/main/chains/hyperlane-cosmos/Cargo.toml index ce936ec1f4..ecfccbcb7d 100644 --- a/rust/main/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/main/chains/hyperlane-cosmos/Cargo.toml @@ -42,7 +42,7 @@ tonic = { workspace = true, features = [ "transport", "tls", "tls-roots", - "tls-roots-common", + "tls-native-roots", ] } tracing = { workspace = true } tracing-futures = { workspace = true } diff --git a/rust/main/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/main/chains/hyperlane-cosmos/src/interchain_gas.rs index 1e1cb2b328..03b110e81e 100644 --- a/rust/main/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/main/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -122,76 +122,85 @@ impl CosmosInterchainGasPaymasterIndexer { let mut gas_payment = IncompleteInterchainGasPayment::default(); for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value.as_str(); - - match key { - CONTRACT_ADDRESS_ATTRIBUTE_KEY => { - contract_address = Some(value.to_string()); - } - v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { - contract_address = Some(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?); + match attr { + EventAttribute::V037(a) => { + let key = a.key.as_str(); + let value = a.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?); + } + + MESSAGE_ID_ATTRIBUTE_KEY => { + gas_payment.message_id = + Some(H256::from_slice(hex::decode(value)?.as_slice())); + } + v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { + gas_payment.message_id = Some(H256::from_slice( + hex::decode(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?)? + .as_slice(), + )); + } + + PAYMENT_ATTRIBUTE_KEY => { + gas_payment.payment = Some(U256::from_dec_str(value)?); + } + v if *PAYMENT_ATTRIBUTE_KEY_BASE64 == v => { + let dec_str = String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?; + // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. + gas_payment.payment = Some(U256::from_dec_str(dec_str.as_str())?); + } + + GAS_AMOUNT_ATTRIBUTE_KEY => { + gas_payment.gas_amount = Some(U256::from_dec_str(value)?); + } + v if *GAS_AMOUNT_ATTRIBUTE_KEY_BASE64 == v => { + let dec_str = String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?; + // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. + gas_payment.gas_amount = Some(U256::from_dec_str(dec_str.as_str())?); + } + + DESTINATION_ATTRIBUTE_KEY => { + gas_payment.destination = Some(value.parse::()?); + } + v if *DESTINATION_ATTRIBUTE_KEY_BASE64 == v => { + gas_payment.destination = Some( + String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )? + .parse()?, + ); + } + + _ => {} + } } - MESSAGE_ID_ATTRIBUTE_KEY => { - gas_payment.message_id = Some(H256::from_slice(hex::decode(value)?.as_slice())); + EventAttribute::V034(a) => { + unimplemented!(); } - v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { - gas_payment.message_id = Some(H256::from_slice( - hex::decode(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?)? - .as_slice(), - )); - } - - PAYMENT_ATTRIBUTE_KEY => { - gas_payment.payment = Some(U256::from_dec_str(value)?); - } - v if *PAYMENT_ATTRIBUTE_KEY_BASE64 == v => { - let dec_str = String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?; - // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. - gas_payment.payment = Some(U256::from_dec_str(dec_str.as_str())?); - } - - GAS_AMOUNT_ATTRIBUTE_KEY => { - gas_payment.gas_amount = Some(U256::from_dec_str(value)?); - } - v if *GAS_AMOUNT_ATTRIBUTE_KEY_BASE64 == v => { - let dec_str = String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?; - // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. - gas_payment.gas_amount = Some(U256::from_dec_str(dec_str.as_str())?); - } - - DESTINATION_ATTRIBUTE_KEY => { - gas_payment.destination = Some(value.parse::()?); - } - v if *DESTINATION_ATTRIBUTE_KEY_BASE64 == v => { - gas_payment.destination = Some( - String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )? - .parse()?, - ); - } - - _ => {} } } diff --git a/rust/main/chains/hyperlane-cosmos/src/mailbox/delivery_indexer.rs b/rust/main/chains/hyperlane-cosmos/src/mailbox/delivery_indexer.rs index ccc92df707..77ffbb85aa 100644 --- a/rust/main/chains/hyperlane-cosmos/src/mailbox/delivery_indexer.rs +++ b/rust/main/chains/hyperlane-cosmos/src/mailbox/delivery_indexer.rs @@ -60,34 +60,42 @@ impl CosmosMailboxDeliveryIndexer { let mut message_id: Option = None; for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value.as_str(); - - match key { - CONTRACT_ADDRESS_ATTRIBUTE_KEY => { - contract_address = Some(value.to_string()); - } - v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { - contract_address = Some(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?); + match attr { + EventAttribute::V037(a) => { + let key = a.key.as_str(); + let value = a.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?); + } + + MESSAGE_ID_ATTRIBUTE_KEY => { + message_id = Some(value.parse::()?); + } + v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { + let hex = String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?; + message_id = Some(hex.parse::()?); + } + + _ => {} + } } - MESSAGE_ID_ATTRIBUTE_KEY => { - message_id = Some(value.parse::()?); + EventAttribute::V034(a) => { + unimplemented!(); } - v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { - let hex = String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?; - message_id = Some(hex.parse::()?); - } - - _ => {} } } diff --git a/rust/main/chains/hyperlane-cosmos/src/mailbox/dispatch_indexer.rs b/rust/main/chains/hyperlane-cosmos/src/mailbox/dispatch_indexer.rs index 433ea661ed..75e1feeadf 100644 --- a/rust/main/chains/hyperlane-cosmos/src/mailbox/dispatch_indexer.rs +++ b/rust/main/chains/hyperlane-cosmos/src/mailbox/dispatch_indexer.rs @@ -63,39 +63,47 @@ impl CosmosMailboxDispatchIndexer { let mut message: Option = None; for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value.as_str(); - - match key { - CONTRACT_ADDRESS_ATTRIBUTE_KEY => { - contract_address = Some(value.to_string()); - } - v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { - contract_address = Some(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?); + match attr { + EventAttribute::V037(a) => { + let key = a.key.as_str(); + let value = a.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?); + } + + MESSAGE_ATTRIBUTE_KEY => { + // Intentionally using read_from to get a Result::Err if there's + // an issue with the message. + let mut reader = Cursor::new(hex::decode(value)?); + message = Some(HyperlaneMessage::read_from(&mut reader)?); + } + v if *MESSAGE_ATTRIBUTE_KEY_BASE64 == v => { + // Intentionally using read_from to get a Result::Err if there's + // an issue with the message. + let mut reader = Cursor::new(hex::decode(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?)?); + message = Some(HyperlaneMessage::read_from(&mut reader)?); + } + + _ => {} + } } - MESSAGE_ATTRIBUTE_KEY => { - // Intentionally using read_from to get a Result::Err if there's - // an issue with the message. - let mut reader = Cursor::new(hex::decode(value)?); - message = Some(HyperlaneMessage::read_from(&mut reader)?); + EventAttribute::V034(a) => { + unimplemented!(); } - v if *MESSAGE_ATTRIBUTE_KEY_BASE64 == v => { - // Intentionally using read_from to get a Result::Err if there's - // an issue with the message. - let mut reader = Cursor::new(hex::decode(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?)?); - message = Some(HyperlaneMessage::read_from(&mut reader)?); - } - - _ => {} } } diff --git a/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index b9acdd3571..85c2c7adcb 100644 --- a/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -4,7 +4,7 @@ use async_trait::async_trait; use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; use once_cell::sync::Lazy; use tendermint::abci::EventAttribute; -use tracing::instrument; +use tracing::{debug, info, instrument}; use hyperlane_core::accumulator::incremental::IncrementalMerkle; use hyperlane_core::{ @@ -223,61 +223,93 @@ impl CosmosMerkleTreeHookIndexer { fn merkle_tree_insertion_parser( attrs: &Vec, ) -> ChainResult> { + debug!( + ?attrs, + "parsing merkle tree insertion from event attributes", + ); + let mut contract_address: Option = None; let mut insertion = IncompleteMerkleTreeInsertion::default(); for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value.as_str(); - - match key { - CONTRACT_ADDRESS_ATTRIBUTE_KEY => { - contract_address = Some(value.to_string()); - } - v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { - contract_address = Some(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?); - } - - MESSAGE_ID_ATTRIBUTE_KEY => { - insertion.message_id = Some(H256::from_slice(hex::decode(value)?.as_slice())); - } - v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { - insertion.message_id = Some(H256::from_slice( - hex::decode(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?)? - .as_slice(), - )); + match attr { + EventAttribute::V037(a) => { + let key = a.key.as_str(); + let value = a.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + debug!(?contract_address, "parsed contract address from plain text"); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?); + debug!(?contract_address, "parsed contract address from base64"); + } + + MESSAGE_ID_ATTRIBUTE_KEY => { + insertion.message_id = + Some(H256::from_slice(hex::decode(value)?.as_slice())); + debug!(message_id = ?insertion.message_id, "parsed message_id from plain text"); + } + v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { + insertion.message_id = Some(H256::from_slice( + hex::decode(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?)? + .as_slice(), + )); + debug!(message_id = ?insertion.message_id, "parsed message_id from base64"); + } + + INDEX_ATTRIBUTE_KEY => { + insertion.leaf_index = Some(value.parse::()?); + debug!(leaf_index = ?insertion.leaf_index, "parsed leaf_index from plain text"); + } + v if *INDEX_ATTRIBUTE_KEY_BASE64 == v => { + insertion.leaf_index = Some( + String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )? + .parse()?, + ); + debug!(leaf_index = ?insertion.leaf_index, "parsed leaf_index from base64"); + } + + unknown => { + debug!(?unknown, "unknown attribute"); + } + } } - INDEX_ATTRIBUTE_KEY => { - insertion.leaf_index = Some(value.parse::()?); + EventAttribute::V034(a) => { + unimplemented!(); } - v if *INDEX_ATTRIBUTE_KEY_BASE64 == v => { - insertion.leaf_index = Some( - String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )? - .parse()?, - ); - } - - _ => {} } } let contract_address = contract_address .ok_or_else(|| ChainCommunicationError::from_other_str("missing contract_address"))?; - Ok(ParsedEvent::new(contract_address, insertion.try_into()?)) + debug!( + ?contract_address, + ?insertion, + "parsed contract address and insertion", + ); + + let event = ParsedEvent::new(contract_address, insertion.try_into()?); + + info!(?event, "parsed event"); + + Ok(event) } } @@ -331,7 +363,7 @@ impl SequenceAwareIndexer for CosmosMerkleTreeHookIndexer { } } -#[derive(Default)] +#[derive(Default, Debug)] struct IncompleteMerkleTreeInsertion { leaf_index: Option, message_id: Option, diff --git a/rust/main/chains/hyperlane-cosmos/src/payloads/general.rs b/rust/main/chains/hyperlane-cosmos/src/payloads/general.rs index bf0931220d..0652cd0340 100644 --- a/rust/main/chains/hyperlane-cosmos/src/payloads/general.rs +++ b/rust/main/chains/hyperlane-cosmos/src/payloads/general.rs @@ -1,4 +1,6 @@ use serde::{Deserialize, Serialize}; +use tendermint::abci::v0_34; +use tendermint::v0_37; #[derive(Serialize, Deserialize, Debug, Clone)] pub struct EmptyStruct {} @@ -30,10 +32,6 @@ pub struct EventAttribute { impl From for cosmrs::tendermint::abci::EventAttribute { fn from(val: EventAttribute) -> Self { - cosmrs::tendermint::abci::EventAttribute { - key: val.key, - value: val.value, - index: val.index, - } + cosmrs::tendermint::abci::EventAttribute::from((val.key, val.value, val.index)) } } diff --git a/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider.rs b/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider.rs index e498c22ed9..2ca98e3fb7 100644 --- a/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider.rs +++ b/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider.rs @@ -156,8 +156,8 @@ impl CosmosProvider { value: pk.value, }; - let proto = proto::cosmos::crypto::secp256k1::PubKey::from_any(&any) - .map_err(Into::::into)?; + let proto: proto::cosmos::crypto::secp256k1::PubKey = + any.to_msg().map_err(Into::::into)?; let decompressed = decompress_public_key(&proto.key) .map_err(|e| HyperlaneCosmosError::PublicKeyError(e.to_string()))?; @@ -250,8 +250,8 @@ impl CosmosProvider { let msg = "could not find contract execution message"; HyperlaneCosmosError::ParsingFailed(msg.to_owned()) })?; - let proto = - ProtoMsgExecuteContract::from_any(any).map_err(Into::::into)?; + let proto: proto::cosmwasm::wasm::v1::MsgExecuteContract = + any.to_msg().map_err(Into::::into)?; let msg = MsgExecuteContract::try_from(proto)?; let contract = H256::try_from(CosmosAccountId::new(&msg.contract))?; diff --git a/rust/main/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/main/chains/hyperlane-cosmos/src/providers/grpc.rs index c2e05acf45..d9719e942a 100644 --- a/rust/main/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/main/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -553,14 +553,13 @@ impl WasmProvider for WasmGrpcProvider { { let signer = self.get_signer()?; let contract_address = self.get_contract_address(); - let msgs = vec![MsgExecuteContract { + let msg = MsgExecuteContract { sender: signer.address.clone(), contract: contract_address.address(), msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], - } - .to_any() - .map_err(ChainCommunicationError::from_other)?]; + }; + let msgs = vec![Any::from_msg(&msg).map_err(ChainCommunicationError::from_other)?]; let gas_limit: Option = gas_limit.and_then(|limit| match limit.try_into() { Ok(limit) => Some(limit), Err(err) => { @@ -629,9 +628,9 @@ impl WasmProvider for WasmGrpcProvider { }; let response = self - .estimate_gas(vec![msg - .to_any() - .map_err(ChainCommunicationError::from_other)?]) + .estimate_gas(vec![ + Any::from_msg(&msg).map_err(ChainCommunicationError::from_other)? + ]) .await?; Ok(response) diff --git a/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs b/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs index 1e9bfaa041..85a709223b 100644 --- a/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs +++ b/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs @@ -496,7 +496,7 @@ where .into()) } - #[instrument(skip(self), fields(metadata=%bytes_to_hex(metadata)))] + #[instrument(skip(self, message, metadata), fields(metadata=%bytes_to_hex(metadata)))] async fn process( &self, message: &HyperlaneMessage, diff --git a/rust/main/chains/hyperlane-ethereum/src/contracts/validator_announce.rs b/rust/main/chains/hyperlane-ethereum/src/contracts/validator_announce.rs index f37c6edb85..d693b371ac 100644 --- a/rust/main/chains/hyperlane-ethereum/src/contracts/validator_announce.rs +++ b/rust/main/chains/hyperlane-ethereum/src/contracts/validator_announce.rs @@ -10,7 +10,7 @@ use hyperlane_core::{ Announcement, ChainResult, ContractLocator, HyperlaneAbi, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H160, H256, U256, }; -use tracing::{instrument, log::trace}; +use tracing::{instrument, trace}; use crate::{ interfaces::i_validator_announce::{ diff --git a/rust/main/chains/hyperlane-ethereum/src/ism/aggregation_ism.rs b/rust/main/chains/hyperlane-ethereum/src/ism/aggregation_ism.rs index 61b371f3b7..0d7bae757f 100644 --- a/rust/main/chains/hyperlane-ethereum/src/ism/aggregation_ism.rs +++ b/rust/main/chains/hyperlane-ethereum/src/ism/aggregation_ism.rs @@ -92,7 +92,7 @@ impl AggregationIsm for EthereumAggregationIsm where M: Middleware + 'static, { - #[instrument(err)] + #[instrument(err, skip(self, message))] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn modules_and_threshold( &self, diff --git a/rust/main/chains/hyperlane-ethereum/src/ism/multisig_ism.rs b/rust/main/chains/hyperlane-ethereum/src/ism/multisig_ism.rs index 2c71c900c5..b9acb2075d 100644 --- a/rust/main/chains/hyperlane-ethereum/src/ism/multisig_ism.rs +++ b/rust/main/chains/hyperlane-ethereum/src/ism/multisig_ism.rs @@ -98,7 +98,7 @@ impl MultisigIsm for EthereumMultisigIsm where M: Middleware + 'static, { - #[instrument(err)] + #[instrument(err, skip(self, message))] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn validators_and_threshold( &self, diff --git a/rust/main/chains/hyperlane-ethereum/src/ism/routing_ism.rs b/rust/main/chains/hyperlane-ethereum/src/ism/routing_ism.rs index 39aaf7ecdb..4a9e8204d2 100644 --- a/rust/main/chains/hyperlane-ethereum/src/ism/routing_ism.rs +++ b/rust/main/chains/hyperlane-ethereum/src/ism/routing_ism.rs @@ -89,7 +89,7 @@ impl RoutingIsm for EthereumRoutingIsm where M: Middleware + 'static, { - #[instrument(err)] + #[instrument(err, skip(self, message))] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn route(&self, message: &HyperlaneMessage) -> ChainResult { let ism = self diff --git a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/retrying.rs b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/retrying.rs index 7c57e61702..59baeec762 100644 --- a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/retrying.rs +++ b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/retrying.rs @@ -10,7 +10,7 @@ use serde::{de::DeserializeOwned, Serialize}; use serde_json::Value; use thiserror::Error; use tokio::time::sleep; -use tracing::{debug, error, instrument, trace, warn_span}; +use tracing::{error, instrument, trace, warn, warn_span}; /// An HTTP Provider with a simple naive exponential backoff built-in #[derive(Debug, Clone)] @@ -89,13 +89,16 @@ where { let params = serde_json::to_value(params).expect("valid"); - let mut last_err; + let mut last_err = None; let mut i = 1; loop { let mut rate_limited = false; let backoff_ms = self.base_retry_ms * 2u64.pow(i - 1); - trace!(params = %serde_json::to_string(¶ms).unwrap_or_default(), "Dispatching request with params"); - debug!(attempt = i, "Dispatching request"); + if let Some(ref last_err) = last_err { + // `last_err` is always expected to be `Some` if `i > 1` + warn!(attempt = i, ?last_err, "Dispatching request"); + } + trace!(attempt = i, params = %serde_json::to_string(¶ms).unwrap_or_default(), "Dispatching request"); let fut = match params { Value::Null => self.inner.request(method, ()), @@ -110,10 +113,10 @@ where return Err(RetryingProviderError::JsonRpcClientError(e)); } HandleMethod::Retry(e) => { - last_err = e; + last_err = Some(e); } HandleMethod::RateLimitedRetry(e) => { - last_err = e; + last_err = Some(e); rate_limited = true; } } @@ -128,7 +131,7 @@ where trace!(backoff_ms, rate_limited, "Retrying provider going to sleep"); sleep(Duration::from_millis(backoff_ms)).await; } else { - trace!( + warn!( requests_made = self.max_requests, "Retrying provider reached max requests" ); @@ -150,7 +153,7 @@ where JsonRpcClientError(P::Error), /// Hit max requests #[error("Hit max requests")] - MaxRequests(P::Error), + MaxRequests(Option), } impl

From> for ProviderError diff --git a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/trait_builder.rs b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/trait_builder.rs index 45ad0638d6..f6583f6ec6 100644 --- a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/trait_builder.rs +++ b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/trait_builder.rs @@ -304,8 +304,8 @@ where // (These are the default values from ethers doc comments) const COEFFICIENT: f64 = 1.125; const EVERY_SECS: u64 = 90u64; - // 550 gwei is the limit we also use for polygon, so we reuse for consistency - const MAX_GAS_PRICE: u128 = 550 * 10u128.pow(9); + // a 3k gwei limit is chosen to account for `treasure` chain, where the highest gas price observed is 1.2k gwei + const MAX_GAS_PRICE: u128 = 3_000 * 10u128.pow(9); let escalator = GeometricGasPrice::new(COEFFICIENT, EVERY_SECS, MAX_GAS_PRICE.into()); // Check the status of sent txs every eth block or so. The alternative is to subscribe to new blocks and check then, // which adds unnecessary load on the provider. diff --git a/rust/main/chains/hyperlane-ethereum/src/tx.rs b/rust/main/chains/hyperlane-ethereum/src/tx.rs index e989be11d6..d967b5f72c 100644 --- a/rust/main/chains/hyperlane-ethereum/src/tx.rs +++ b/rust/main/chains/hyperlane-ethereum/src/tx.rs @@ -1,6 +1,8 @@ +use std::str::FromStr; use std::sync::Arc; use std::time::Duration; +use ethers::types::transaction::eip2718::TypedTransaction; use ethers::{ abi::Detokenize, prelude::{NameOrAddress, TransactionReceipt}, @@ -8,6 +10,7 @@ use ethers::{ types::{Block, Eip1559TransactionRequest, TxHash}, }; use ethers_contract::builders::ContractCall; +use ethers_core::types::H160; use ethers_core::{ types::{BlockNumber, U256 as EthersU256}, utils::{ @@ -49,6 +52,7 @@ pub fn apply_gas_estimate_buffer(gas: U256, domain: &HyperlaneDomain) -> ChainRe } const PENDING_TRANSACTION_POLLING_INTERVAL: Duration = Duration::from_secs(2); +const EVM_RELAYER_ADDRESS: &str = "0x74cae0ecc47b02ed9b9d32e000fd70b9417970c5"; /// Dispatches a transaction, logs the tx id, and returns the result pub(crate) async fn report_tx(tx: ContractCall) -> ChainResult @@ -154,7 +158,7 @@ where } let Ok((base_fee, max_fee, max_priority_fee)) = - estimate_eip1559_fees(provider, None, &latest_block).await + estimate_eip1559_fees(provider, None, &latest_block, domain, &tx.tx).await else { // Is not EIP 1559 chain return Ok(tx.gas(gas_limit)); @@ -202,11 +206,85 @@ where type FeeEstimator = fn(EthersU256, Vec>) -> (EthersU256, EthersU256); +/// Use this to estimate EIP 1559 fees with some chain-specific logic. +async fn estimate_eip1559_fees( + provider: Arc, + estimator: Option, + latest_block: &Block, + domain: &HyperlaneDomain, + tx: &TypedTransaction, +) -> ChainResult<(EthersU256, EthersU256, EthersU256)> +where + M: Middleware + 'static, +{ + if domain.is_zksync_stack() { + estimate_eip1559_fees_zksync(provider, latest_block, tx).await + } else { + estimate_eip1559_fees_default(provider, estimator, latest_block).await + } +} + +async fn estimate_eip1559_fees_zksync( + provider: Arc, + latest_block: &Block, + tx: &TypedTransaction, +) -> ChainResult<(EthersU256, EthersU256, EthersU256)> +where + M: Middleware + 'static, +{ + let base_fee_per_gas = latest_block + .base_fee_per_gas + .ok_or_else(|| ProviderError::CustomError("EIP-1559 not activated".into()))?; + + let response = zksync_estimate_fee(provider, tx).await?; + let max_fee_per_gas = response.max_fee_per_gas; + let max_priority_fee_per_gas = response.max_priority_fee_per_gas; + + Ok((base_fee_per_gas, max_fee_per_gas, max_priority_fee_per_gas)) +} + +async fn zksync_estimate_fee( + provider: Arc, + tx: &TypedTransaction, +) -> ChainResult +where + M: Middleware + 'static, +{ + let mut tx = tx.clone(); + tx.set_from( + // use the sender in the provider if one is set, otherwise default to the EVM relayer address + provider + .default_sender() + .unwrap_or(H160::from_str(EVM_RELAYER_ADDRESS).unwrap()), + ); + + let result = provider + .provider() + .request("zks_estimateFee", [tx.clone()]) + .await?; + tracing::debug!(?result, ?tx, "Successfully fetched zkSync fee estimate"); + Ok(result) +} + +// From +// gas_limit: QUANTITY, 32 bytes - The maximum amount of gas that can be used. +// max_fee_per_gas: QUANTITY, 32 bytes - The maximum fee per unit of gas that the sender is willing to pay. +// max_priority_fee_per_gas: QUANTITY, 32 bytes - The maximum priority fee per unit of gas to incentivize miners. +// gas_per_pubdata_limit: QUANTITY, 32 bytes - The gas limit per unit of public data. +#[derive(Debug, Clone, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +struct ZksyncEstimateFeeResponse { + gas_limit: EthersU256, + max_fee_per_gas: EthersU256, + max_priority_fee_per_gas: EthersU256, + gas_per_pubdata_limit: EthersU256, +} + +/// Logic for a vanilla EVM chain to get EIP-1559 fees. /// Pretty much a copy of the logic in ethers-rs (https://github.com/hyperlane-xyz/ethers-rs/blob/c9ced035628da59376c369be035facda1648577a/ethers-providers/src/provider.rs#L478) /// but returns the base fee as well as the max fee and max priority fee. /// Gets a heuristic recommendation of max fee per gas and max priority fee per gas for /// EIP-1559 compatible transactions. -async fn estimate_eip1559_fees( +async fn estimate_eip1559_fees_default( provider: Arc, estimator: Option, latest_block: &Block, @@ -255,3 +333,40 @@ where Ok(call) } } + +#[cfg(test)] +mod test { + use std::sync::Arc; + + use ethers::{ + providers::{Http, Provider}, + types::{ + transaction::eip2718::TypedTransaction, Address, Bytes, Eip1559TransactionRequest, + NameOrAddress, + }, + }; + use std::str::FromStr; + use url::Url; + + use crate::tx::zksync_estimate_fee; + + #[ignore = "Not running a flaky test requiring network"] + #[tokio::test] + async fn test_zksync_estimate_fees() { + let url: Url = "https://rpc.treasure.lol".parse().unwrap(); + let http = Http::new(url); + let provider = Arc::new(Provider::new(http)); + // Test tx to call `nonce()` on the Treasure mailbox + let tx = TypedTransaction::Eip1559(Eip1559TransactionRequest { + // the `from` field is None in prod, and gas estimation should be robust to this + from: None, + to: Some(NameOrAddress::Address( + Address::from_str("0x6bD0A2214797Bc81e0b006F7B74d6221BcD8cb6E").unwrap(), + )), + data: Some(Bytes::from(vec![0xaf, 0xfe, 0xd0, 0xe0])), + ..Default::default() + }); + // Require a parsing success + let _response = zksync_estimate_fee(provider, &tx).await.unwrap(); + } +} diff --git a/rust/main/chains/hyperlane-sealevel/src/lib.rs b/rust/main/chains/hyperlane-sealevel/src/lib.rs index 90a2e01b66..6121bbe27f 100644 --- a/rust/main/chains/hyperlane-sealevel/src/lib.rs +++ b/rust/main/chains/hyperlane-sealevel/src/lib.rs @@ -23,8 +23,10 @@ mod log_meta_composer; mod mailbox; mod merkle_tree_hook; mod multisig_ism; +mod priority_fee; mod provider; mod rpc; mod trait_builder; +mod tx_submitter; mod utils; mod validator_announce; diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs index f530b04e0f..5e3da84942 100644 --- a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs @@ -220,6 +220,11 @@ fn filter_by_validity( tx: UiTransaction, meta: UiTransactionStatusMeta, ) -> Option<(H512, Vec, Vec)> { + // If the transaction has an error, we skip it + if meta.err.is_some() { + return None; + } + let Some(transaction_hash) = tx .signatures .first() @@ -238,9 +243,29 @@ fn filter_by_validity( return None; }; + // Orders the account keys in line with the behavior of compiled instructions. + let account_keys = match &meta.loaded_addresses { + OptionSerializer::Some(addresses) => { + // If there are loaded addresses, we have a versioned transaction + // that may include dynamically loaded addresses (e.g. from a lookup table). + // The order of these is [static, dynamic writeable, dynamic readonly] and + // follows the iter ordering of https://docs.rs/solana-sdk/latest/solana_sdk/message/struct.AccountKeys.html. + [ + message.account_keys, + addresses.writable.clone(), + addresses.readonly.clone(), + ] + .concat() + } + OptionSerializer::None | OptionSerializer::Skip => { + // There are only static addresses in the transaction. + message.account_keys + } + }; + let instructions = instructions(message.instructions, meta); - Some((transaction_hash, message.account_keys, instructions)) + Some((transaction_hash, account_keys, instructions)) } fn filter_by_encoding( diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_block_multiple_txs_one_successful.json b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_block_multiple_txs_one_successful.json new file mode 100644 index 0000000000..d90fb4eabc --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_block_multiple_txs_one_successful.json @@ -0,0 +1,3388 @@ +{ + "blockHeight": 35744889, + "blockTime": 1734974925, + "blockhash": "DvtcDha1ZnwXbggRkP7pw3EDNortvgCWWA7Lyv5wVTcZ", + "parentSlot": 35781851, + "previousBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM", + "rewards": [ + { + "commission": null, + "lamports": 1900, + "postBalance": 8937590330, + "pubkey": "AJwEBmY7PcLNtZKhpVvmF13VgosvMDva2kH79dHaasb9", + "rewardType": "Fee" + } + ], + "transactions": [ + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8937588480, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8937588530, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "AJwEBmY7PcLNtZKhpVvmF13VgosvMDva2kH79dHaasb9", + "C6PeLNxv75pYFFMnWctc75tAPHvbnQk3p5SgcGPemhqg", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvnh9eEmYV25eHYJGiBBVdJ7QaJuHpWU5p1xAELYC92HNBkLkf7vwiANvYagfemtwLFqN5YQdrT1eCHaWb78mx36Efr6yN4rEdV6WTC1K3cCpTpR1XXfJUvvWS4xZ4Ueuep2jg1z4FPi8rj2cNxPoSeCwZ", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "82X78RuKVZMjZ4wwMJpjiaYVGW3q9PatQzWSsokJLCa3" + }, + "signatures": [ + "3dLqABPPT8JkeyZfub57E99rPtU4dRXvtqcdNU6iNa3iuaLHExmYpAa8isksMo5RthPkAkypaTa8Hp8CMmxG9Vec" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8994813620, + 264520, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8994813670, + 264520, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "7jtuen1N95bBNyAV5dbcx6enYT24qKqHobyHQZnyRoTD", + "Fuwdpk6BQq6hPsEWPtmvyujchKYAb6gMA7Z9rKezuoxS", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvnh9eEmYV25eHYJGiBBVdJ7QaJuHpWU5p1xAELYC92HNBkLkf7vwiANvYagfemtwLFqN5YQdrT1eCHaWb78mx36Efr6yN4rEdV6WTC1K3cCpTpR1XXfJUvvWS4xZ4Ueuep2jg1z4FPi8rj2cNxPoSeCwZ", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "82X78RuKVZMjZ4wwMJpjiaYVGW3q9PatQzWSsokJLCa3" + }, + "signatures": [ + "2o1YTyd4AWK5j23DBsYDzw6c6qqQ8JAEm1TQYEhK8BHXZaxyZsQDUfbpndoQPgvXqu21GktDqvnKSkcpW45YSvqY" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8900415217, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8900415267, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "2gb1u6kcg3V5MfhoycoEL6m6JWgQAmdkpJSXoUa4ogVf", + "Fo7TvsvnVzsVsntZX4bnfH9h3MffzxTGtzQyvm8sTLtP", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvnh9eEmYV25eHYJGiBBVdJ7QaJuHpWU5p1xAELYC92HNBkLkf7vwiANvYagfemtwLFqN5YQdrT1eCHaWb78mx36Efr6yN4rEdV6WTC1K3cCpTpR1XXfJUvvWS4xZ4Ueuep2jg1z4FPi8rj2cNxPoSeCwZ", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "82X78RuKVZMjZ4wwMJpjiaYVGW3q9PatQzWSsokJLCa3" + }, + "signatures": [ + "4ztQLtKoowNM3QBvSi8H7BJ6MAuJKRKCfhsV85ptcC8JM1cXqYr3qq5p4JjT1W1jcRTk6gFyPYXS5ZRQyuQbNwfD" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 24927, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [1]", + "Program 11111111111111111111111111111111 success", + "Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr invoke [1]", + "Program log: Memo (len 66): \"0xe377a5c244b12079b9bd5baad4d3ae7e36165721b774557980fb2f2c4bb859f8\"", + "Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr consumed 24927 of 29913 compute units", + "Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr success" + ], + "postBalances": [ + 1495953, + 6722589421, + 1, + 1, + 5095104 + ], + "postTokenBalances": [], + "preBalances": [ + 51496003, + 6672589421, + 1, + 1, + 5095104 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "ByMrVM5LUgHKwPeQSWKEPnyKQVHqfxFTkQuuj1Vi9cVD", + "F7p3dFrjRTbtRp8FRF6qHLomXbKRBzpvBLjtQcfcgmNe", + "ComputeBudget111111111111111111111111111111", + "11111111111111111111111111111111", + "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr" + ], + "addressTableLookups": [], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 3, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "KeSwJP", + "programIdIndex": 2, + "stackHeight": null + }, + { + "accounts": [ + 0, + 1 + ], + "data": "3Bxs4NRZ15a54oAf", + "programIdIndex": 3, + "stackHeight": null + }, + { + "accounts": [], + "data": "KszPnaqCF2i8y7gn5x5f9sgXMgoyBncGcNtYb8WoiD9nqQVRZWawYwMBK234hSpsQ9zxR6sb8DyByvm377GFFo5w75", + "programIdIndex": 4, + "stackHeight": null + } + ], + "recentBlockhash": "FgiA2obJyS9f5QjsbHf3YGjTusWN9Mu9aqB9zSJKEsLh" + }, + "signatures": [ + "4vhWbER158mpYWNNfKgN3EGytrt1mE8PmcHvr2eCAWJiCqZDZxBZy3vCa76FrZefxdyiVSiovDZQD9qKyxkvdZzJ" + ] + }, + "version": 0 + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 431050, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 431100, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXxd", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "Gva3FJcjwjirKpGdQdxreMWnQxd32jDMEwh2pg7NsnuN" + }, + "signatures": [ + "5Nmrbx7J6hhUu3YNYfxdHgh4BioCWAYDWMmXKjR2Ps7xKwfKcJXQVPpTqNgWJirjePb65fwEVZe7G5Pz4GTzPdGR" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25114, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 6yWRb7MA4PTputZS2GgQ1BKQHC5pu1124HqpKroLs2LG", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25114 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 519850, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 519900, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "6yWRb7MA4PTputZS2GgQ1BKQHC5pu1124HqpKroLs2LG", + "Hu94iEVDhfAhUVUYTe2ePXBVUNtPsTTAtkZKPNf2pq8Z", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "B9TNgu8ndXGYB73nF992K6wYKv6Ty7LxLBoxnE5tYYmR", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXzE", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "3veDZBERK9bD5PzCuygjYquZ85aUnU24kRuUwWRzTtkc" + }, + "signatures": [ + "4dm9BrvJsFmM614MuNFyS4EkeEZenJ79g8HMj4bDPErh4DrdN26pHFZr7txJWrbVLEoT3Wbp82Jgmdk7SeGxasde" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker DJiDXfe1jSRmgYuKjzDCbnYciZkXCRbdRR8ezDbM15iF", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 4260450, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 4260500, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "DJiDXfe1jSRmgYuKjzDCbnYciZkXCRbdRR8ezDbM15iF", + "6qQAxeLkfS1Qfsg7WbyMriGtsuPY1T6NwSiXKrqb3gqs", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "HU4JccsEKv5HKdNDe1wiiKBTacB78QEdSV4xJdrCnFZN", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyq", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "AXAiaXycACYJT9WyET1nM9zJkNWWv9h1SAz6VBX9gwdg" + }, + "signatures": [ + "4x13vs877UsCCugnPPVH9jJ3reby5RfKqQm6fgXkieVMgoLBzognyN4PJFcV6hpeksFN78Sz3eyw5bkaLK9Piv8u" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23575, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23575 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 4669050, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 4669100, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "3WUFeYoWxzMKwngWsB2GsKmByZfZvhp2F2Y3QUswxUfh", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "9JhY9KffbdVxED3GY4jNUrDNv2dv7JQc61ioszdkNrXS", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyV", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "HrGwSEeS1L3DKDjHDCeVycwTKrxN5n861eZY6m3G8Fkm" + }, + "signatures": [ + "4PyVsQnjZnnLC5pmgtAsSD5ZYZyp3NuL1At8J5VR5si18eLcCQFmiXKuALQ2Z5VbesKcRVs2zD9PrtzAJciGr8aS" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 29692, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker CfXww3YzNBQUEtS4ZJeEMZtAEbsym7BAKYUdPsQ1qqrJ", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 29692 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 2947200, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 2947250, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "CfXww3YzNBQUEtS4ZJeEMZtAEbsym7BAKYUdPsQ1qqrJ", + "12p6G2ShLgRbxBpCqDue2zed3UGqnLmrxHNmCrhTR1QS", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "AogE6CYJgaLGXug6D6oTuzZsKJAptaCRD2sLTAMqg1Dm", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXx9", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "4feKSCpn9AFR3UfkoqHuC6HRoqGjkiWqAH5PESV2U3CXjv8obBwooMKCP8xfB9VM8WdjGDHb8BKgBZCbScr5kCjR" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992750, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992800, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXz6", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "GX81sTiYtmXrs7p99NPP74vY3Q6TLHueueQ1xXPzt4bk" + }, + "signatures": [ + "a7sKgx3MotvqiK7KsnAUfWaEHqW1oJ2mLScaRQWvEiHH146yTokGfuKUGDzG7tgZta3LVd1TMjk2yWa4r7hqndE" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23705, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker FZDe7R2oeEqPXUZg7GdbP98yfScU5j3WM9BwDdzA3ZLx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23705 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 2058300, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 2058350, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "FZDe7R2oeEqPXUZg7GdbP98yfScU5j3WM9BwDdzA3ZLx", + "Cy3u4YK7jv3mfqhoFTSMvxWE5wyarYi9fXWR7bEe9NAk", + "35b813JrG1f4gJ3GpBRqPkuFRiEgE5himtQHXVj8YvjY", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXvm", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "3qExduzZcYxeKTSTKEY9gs5UTFeg5azfYytswpgFFVeu1BW3XVJJtyfHwHJh9ZLUyn2pHvDfGFaEyMvrtvLgpenu" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23705, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker FZDe7R2oeEqPXUZg7GdbP98yfScU5j3WM9BwDdzA3ZLx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23705 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 2058250, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 2058300, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "FZDe7R2oeEqPXUZg7GdbP98yfScU5j3WM9BwDdzA3ZLx", + "Cy3u4YK7jv3mfqhoFTSMvxWE5wyarYi9fXWR7bEe9NAk", + "35b813JrG1f4gJ3GpBRqPkuFRiEgE5himtQHXVj8YvjY", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXyG", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "CG5epQJHrdo6WME2VRwHhdasACE7CV5kwCuEbvVk5QitMJjhhpJ5V6u1hFk1cMG7oozXFoFJWeNExnoYwPeSVmm" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25114, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 6yWRb7MA4PTputZS2GgQ1BKQHC5pu1124HqpKroLs2LG", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25114 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 519800, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 519850, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "6yWRb7MA4PTputZS2GgQ1BKQHC5pu1124HqpKroLs2LG", + "Hu94iEVDhfAhUVUYTe2ePXBVUNtPsTTAtkZKPNf2pq8Z", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "B9TNgu8ndXGYB73nF992K6wYKv6Ty7LxLBoxnE5tYYmR", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXxS", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "3veDZBERK9bD5PzCuygjYquZ85aUnU24kRuUwWRzTtkc" + }, + "signatures": [ + "3jueLij1hqvENMjToMiEUM119WPZehXCrSCBYLniRZzC1sbwzwGxYGRRB6wKtHkc82ngqbzJJba9GZ7XztCHMjbr" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 431000, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 431050, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXzT", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "Gva3FJcjwjirKpGdQdxreMWnQxd32jDMEwh2pg7NsnuN" + }, + "signatures": [ + "4JES3o1EfQFxUsEuNxYwbyvZzvhoiY6kHvoizya4J5aeuqYBXbmMiY8s76TNoEyT98KY72fe3dp2QHtL3L5zicDs" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23575, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23575 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 4669000, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 4669050, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "3WUFeYoWxzMKwngWsB2GsKmByZfZvhp2F2Y3QUswxUfh", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "9JhY9KffbdVxED3GY4jNUrDNv2dv7JQc61ioszdkNrXS", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXvb", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "4bXsMeojJxqqLbDsN9DnWRwoSyrorP7CQ8HAZBPxhyND" + }, + "signatures": [ + "2N3PrKS7Yd6sDTUhN471dvsHeTP8cs5RC5VKZGvRN3TnmRYVqaZR1y8Hr69o811YMvKpnWVtqSAknbeYKSXbZrcN" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992700, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992750, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXzJ", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "4bXsMeojJxqqLbDsN9DnWRwoSyrorP7CQ8HAZBPxhyND" + }, + "signatures": [ + "8f5FFcU8KgnDgwRdx6YV1FZEbz8fcjDUhp6M8TkXJbDeY434QSpM3fHa1LgTYLfvViXz9e63ePfXmmT5KVXg4Rt" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 26066, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e invoke [1]", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e consumed 13033 of 27000 compute units", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e success", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e invoke [1]", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e consumed 13033 of 13967 compute units", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e success" + ], + "postBalances": [ + 55400350, + 233920, + 233920, + 1, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 55400400, + 233920, + 233920, + 1, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "4bEk3CLwmnRHQxUEqDtNcXabz8RSdQyMpsAKJTaM8NUc", + "4bbK5m6YSPyALDa5uE9WYMLwnqEATHDzWdYqFZJ6Ezrf", + "E4wLiGrpMi2RtH7c1WrTzCdVVEi58za1XzPygtr7Kmz1", + "ComputeBudget111111111111111111111111111111", + "FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 2, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "HAaSfh", + "programIdIndex": 3, + "stackHeight": null + }, + { + "accounts": [ + 2, + 0 + ], + "data": "vaJro6ZLfqS8Tk6mcBehNesxGGBBDUfeYjo9XpzxmW6pTfUBhDh7eNT", + "programIdIndex": 4, + "stackHeight": null + }, + { + "accounts": [ + 1, + 0 + ], + "data": "svao1p5ZoTbEBpMq8HCJ7B2jKsqFvGGBTjackJ79Q8sb67xwyCid5wd", + "programIdIndex": 4, + "stackHeight": null + } + ], + "recentBlockhash": "HrGwSEeS1L3DKDjHDCeVycwTKrxN5n861eZY6m3G8Fkm" + }, + "signatures": [ + "32xkNevmZipE6UdriH8UdB7bT7LajuAXZF6Y1J7ZJL5q4DEYvZa4SRHL9c6njmmPHjiEDKsEM7CvNPkx9KXb8NaZ" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 262874, + "err": null, + "fee": 150, + "innerInstructions": [ + { + "index": 1, + "instructions": [ + { + "accounts": [ + 0, + 4 + ], + "data": "1111JX81xkJCwniZ1Erg4Sybstk6tqT9u8gU37B5SnCv3ruqnd5SbCwNAcbMvfg2xgbbn", + "programIdIndex": 12, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 6 + ], + "data": "1111JX81xkJCwniZ1Erg4Sybstk6tqT9u8gU37B5SnCv3ruqnd5SbCwNAcbMvfg2xgbbn", + "programIdIndex": 12, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 8 + ], + "data": "3Bxs4Tm5txe73V9q", + "programIdIndex": 12, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 7 + ], + "data": "3Bxs4Tm5txe73V9q", + "programIdIndex": 12, + "stackHeight": 2 + }, + { + "accounts": [ + 3, + 0, + 10, + 0, + 2, + 1, + 9, + 5, + 11, + 18, + 13, + 16, + 12 + ], + "data": "9ZxXEgRKtxM", + "programIdIndex": 15, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 2 + ], + "data": "11114hL6PWxs4U7NCYRNXyZk7j7iV5YvbM2Y4EYYnUoc78BhWkZV7EbHKZpZnbJM3FMyFq", + "programIdIndex": 12, + "stackHeight": 3 + }, + { + "accounts": [ + 2 + ], + "data": "GC422sqZqSiuDzjorrJVQ1wDyBHerctVdibtxN47F9PXCNokjD5NBjqdUEZ7q7gULrAbayLZ33AbQKyBCSPFNnZM1u", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2 + ], + "data": "GyEZt3T6vJ45ToJP8DQByidGXsy4KJEGWVWgP1hEpCP6MRsdGJabNdMf1B9yvA6BX5x37UchRjzKErQP9GT1YjQp1G", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2 + ], + "data": "bPFz9iKJZS3rDbU6zowCjSwEjkgEPMo9i3Vmbodo9YYN1dGaEta9eWisUYepxtz2rgAZBo5ZFNFCJ6MvKF9e8V7ceoa", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2, + 3, + 2, + 3 + ], + "data": "YzZQyW1KJYUcGMonWYpqEXb51jrqpC6SG3vMmUSJpjmTHzgi5rH5QercoJFoQY2wRHDwBmhF3iD7TFuBnY1ETUnuBcVVooT7LgnFcL3XatbSFEdD9SP9HdmRrR1AbAzTR1qauF9DxCfUoHMv7g5GfXSF8H3PcTKcy4HeZAqD6GP7ApLu5bS", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 0, + 1 + ], + "data": "11113Md75Dq7V8gjbzJMw6r5QL5XX645yU1bhj7iFnRmnhAT1ske6hnTQ4LYv8avqJdZ2Z", + "programIdIndex": 12, + "stackHeight": 3 + }, + { + "accounts": [ + 1, + 2, + 3, + 9, + 3 + ], + "data": "SSqVPNo92jX", + "programIdIndex": 16, + "stackHeight": 3 + }, + { + "accounts": [ + 0, + 11, + 0, + 2, + 12, + 18 + ], + "data": "1", + "programIdIndex": 13, + "stackHeight": 3 + }, + { + "accounts": [ + 2 + ], + "data": "84eT", + "programIdIndex": 18, + "stackHeight": 4 + }, + { + "accounts": [ + 0, + 11 + ], + "data": "11112Um5QtBM9RVwhzeb2i4U2mPJ7krjBF48k17qACUVhhTNRzdmH1adRRGPABHBdaEx67", + "programIdIndex": 12, + "stackHeight": 4 + }, + { + "accounts": [ + 11 + ], + "data": "P", + "programIdIndex": 18, + "stackHeight": 4 + }, + { + "accounts": [ + 11, + 2 + ], + "data": "6U1ZUf261fPY3ULHBWy3hurmHY2X4qaWfcvvCwszYF11e", + "programIdIndex": 18, + "stackHeight": 4 + }, + { + "accounts": [ + 2, + 11, + 3 + ], + "data": "6AuM4xMCPFhR", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2, + 3 + ], + "data": "31tb", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2, + 3 + ], + "data": "C2X7q5sVBvi2E5BSotT3ogtLHb3igj3sP7xdQF1f2suStR2MUMN7QBq", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2, + 3 + ], + "data": "5SL6KejFcJAFCech12rmhDMH11RyzCaprR64rHCLCuRW48Wy42PgxL4nfYsZSejosCQQsJve6HruQaoknGeML2GF", + "programIdIndex": 18, + "stackHeight": 3 + } + ] + } + ], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program RariUNM3vz1rwxPg8UJyRAN7rSKXxgd2ncS2ddCa4ZE invoke [1]", + "Program log: Instruction: MintWithControls", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program Rari9ftBd6vFdtpn8TDLwN2ze24KKkM5MLEETNiBMNn invoke [2]", + "Program log: Instruction: Mint", + "Program log: Invoke create account 7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag,BQ2TPCCzmxNMvmk5snbHGfVDL5JDzvXJBvhGc7adsY2o", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Invoke initialise metadata pointer extension", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: MetadataPointerInstruction::Initialize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2442 of 766976 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: GroupMemberPointerInstruction::Initialize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2505 of 762558 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Invoke initialise mint", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: Instruction: InitializeMint2", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 4078 of 758195 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Initialise metadata if needed", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: TokenMetadataInstruction: Initialize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 9992 of 751137 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Invoke create account 7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag,BQ2TPCCzmxNMvmk5snbHGfVDL5JDzvXJBvhGc7adsY2o", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program RariGDYwEF1jQA4kisHxBxiv1TDuBPVHNNoXFNYriFb invoke [3]", + "Program log: Instruction: InitializeMember", + "Program RariGDYwEF1jQA4kisHxBxiv1TDuBPVHNNoXFNYriFb consumed 3062 of 712812 compute units", + "Program RariGDYwEF1jQA4kisHxBxiv1TDuBPVHNNoXFNYriFb success", + "Program log: Finished", + "Program log: MINT NON-FUNGIBLE TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "Program log: 7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [3]", + "Program log: Create", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: GetAccountDataSize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 3038 of 670644 compute units", + "Program return: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb qgAAAAAAAAA=", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program 11111111111111111111111111111111 invoke [4]", + "Program 11111111111111111111111111111111 success", + "Program log: Initialize the associated token account", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: InitializeImmutableOwner", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 1924 of 662747 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: InitializeAccount3", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5392 of 658406 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 24807 of 677448 compute units", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success", + "Program log: Minting TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: Instruction: MintTo", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5568 of 638961 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Removing mint authority", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: Instruction: SetAuthority", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2740 of 631171 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: done", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: TokenMetadataInstruction: UpdateField", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 12096 of 621425 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: TokenMetadataInstruction: UpdateField", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 13658 of 606546 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program Rari9ftBd6vFdtpn8TDLwN2ze24KKkM5MLEETNiBMNn consumed 214421 of 805330 compute units", + "Program Rari9ftBd6vFdtpn8TDLwN2ze24KKkM5MLEETNiBMNn success", + "Program RariUNM3vz1rwxPg8UJyRAN7rSKXxgd2ncS2ddCa4ZE consumed 262874 of 850000 compute units", + "Program RariUNM3vz1rwxPg8UJyRAN7rSKXxgd2ncS2ddCa4ZE success" + ], + "postBalances": [ + 1504115, + 14144, + 48484, + 142256, + 15368, + 53924, + 15368, + 216518752, + 139608770978, + 14416, + 95200, + 20264, + 1, + 7277632, + 1, + 11152, + 11152, + 11152, + 11152 + ], + "postTokenBalances": [ + { + "accountIndex": 11, + "mint": "BQ2TPCCzmxNMvmk5snbHGfVDL5JDzvXJBvhGc7adsY2o", + "owner": "7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "1", + "decimals": 0, + "uiAmount": 1, + "uiAmountString": "1" + } + } + ], + "preBalances": [ + 2777893, + 0, + 0, + 142256, + 0, + 53924, + 0, + 215938752, + 139608190978, + 14416, + 95200, + 0, + 1, + 7277632, + 1, + 11152, + 11152, + 11152, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag", + "9toVdfGuM4qwW9uyfadz3JA9SED6kzJzJaqRfKnvZif2", + "BQ2TPCCzmxNMvmk5snbHGfVDL5JDzvXJBvhGc7adsY2o", + "23buSpWBskpcVtkQsWtcugmbfqsYqHpsDLe4tj5mmAqN", + "5oaouyNATLwQjixXpYT5sEqKaKafafQi5oEM8gcFS1p9", + "71HcxJnmvJrfyYA1gkfK5SAXecGzuWN3B3w9T6dHNa8H", + "8SUKSg5QaqkXBczx27hKisrLnoFpdTekYVyvjcBcwgcw", + "8y6yGuhdyPYEaiujsK62V6ctHcrtYu7f2LxLDXCHnb4d", + "AsSKqK7CkxFUf3KaoQzzr8ZLPm5fFguUtVE5QwGALQQn", + "DLDzmqUwGhBnRkdoUPjAYcHcx17FYjfAAk6q8qj7MPJJ", + "Dq6A6TNFWHjFKuLqWPYjFcTjhSuanpKAgWXxGzJncwtT", + "EoHBPKH6A18QECuWth1pUYafF95W5mfmwS7nAZp9LZLH", + "11111111111111111111111111111111", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "ComputeBudget111111111111111111111111111111", + "Rari9ftBd6vFdtpn8TDLwN2ze24KKkM5MLEETNiBMNn", + "RariGDYwEF1jQA4kisHxBxiv1TDuBPVHNNoXFNYriFb", + "RariUNM3vz1rwxPg8UJyRAN7rSKXxgd2ncS2ddCa4ZE", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 7, + "numRequiredSignatures": 3 + }, + "instructions": [ + { + "accounts": [], + "data": "GA6zB1", + "programIdIndex": 14, + "stackHeight": null + }, + { + "accounts": [ + 3, + 10, + 0, + 4, + 6, + 2, + 1, + 9, + 5, + 8, + 11, + 7, + 18, + 13, + 16, + 12, + 15 + ], + "data": "5gMQbgxkTMLLTytDRsM8B", + "programIdIndex": 17, + "stackHeight": null + } + ], + "recentBlockhash": "GRKHwZHCpQCkdCfLB5uDfNZ1DnbhFaegxpv351WGZESk" + }, + "signatures": [ + "4YYiYWvcT7wqWQ18Jcfwf3D8mPXNVWWWQ1Qapuubqu7FFriFentR8pv6wcDKYAaEe2xNNZXWrDwB6cFXu9g6AUU2", + "4mKjD6UP9fHRaW5BAFp2fzyDFbYZBUF5n2eYfipTYTpXYdbj9o7bysHgJWbNf4HKaXpWtUw5iG6FNhcBbc87rkNS", + "637DgH3g2Giu3m4gD7ALUXGjDAiietgubWDo6yTjkvbqUtNttYTyxQjRBf8j2W8iqsX6AacGGW6j54NXE3pkGTE3" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8937588430, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8937588480, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "AJwEBmY7PcLNtZKhpVvmF13VgosvMDva2kH79dHaasb9", + "C6PeLNxv75pYFFMnWctc75tAPHvbnQk3p5SgcGPemhqg", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvyak29TbGXpE2Lwz5sSCzhNdG5DLVnfiBZBkMgazajyeLBZzKECbBUxETBJhpzkWTodGw6pMLoLygdjREwer3urL9cNoKzndAFuwucV6nMKUePk649zMvZXuP4WCUgk6pjuXigR8Wux32vCszFfJBfqGj", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "4QjwbwDvkGXJ3PiKpEcmbvoiVJKUnyfN3RRJY3xfRYjwkVJ4PQ6kDBiLFWnuirDnqVpSRaPP7NK5JZgxuwC7Y9hy" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430950, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 431000, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXy8", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "Gva3FJcjwjirKpGdQdxreMWnQxd32jDMEwh2pg7NsnuN" + }, + "signatures": [ + "pTYUghgJjDE9jj9TD3izbmKbsoZwyTvQnVXEa9Xumd1enH1TUq3C7tTT7UzXNjCV75V5XNSzvF1yWTZ4Tq4c2Ay" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23575, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23575 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 4668950, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 4669000, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "3WUFeYoWxzMKwngWsB2GsKmByZfZvhp2F2Y3QUswxUfh", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "9JhY9KffbdVxED3GY4jNUrDNv2dv7JQc61ioszdkNrXS", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXxV", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "2DRJDZLuP2bxw5rLvZ4AvX6RhgEnfJ9fRaWPTbGDNEPj43kNof3g2Vp6ZqifU5zPA9FTmZQnTjHKEM8CBhkedHED" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992650, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992700, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXwN", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "2tB9PPDwziUWj8m6HtPn9A3gn74rwVDSekD2Z5XEtV8DLPY8Fm9S7hZEuFWq8NGcncbb8agyDwNXLB5uoeLbtsff" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992600, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992650, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXxv", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "2d8BhKG9E8nMARkU9SkMN9N5UmS4VkPyYYZNoUcekqCX" + }, + "signatures": [ + "VHivewViQLW3Y7W37y6aLB9ZR7k4oBTDizUcL6s69Fsegz3obiz1TBATzDGQsYRn73JLKWA7so64iDe4HavbEoA" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430900, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430950, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyV", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "14tvFMnmt5uugsBUyWWvdBC6YiD6bcWbNUQc2Tr1aLc5" + }, + "signatures": [ + "4hx1wQotXicZS5LcCzoTn8b9rXoAkRNcTTh1hp7yhb22iR3RpyFDab19PhHVTWpHzqrFjYZbRxpgK6nSUT4JGAeS" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430850, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430900, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXzW", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "9PWtA56bgsBEkMS45eBbkUUzzNUYTUeML3VcGHJTK3CR" + }, + "signatures": [ + "3LWqKcfdwLgte6N7xozj4ESm79n2icUdAx1CowBMbaaHEwDFumFnYeQE1HAfqxpWCx1ALFJpaF22pUWZCDPMjUYh" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430800, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430850, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXwu", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "Gva3FJcjwjirKpGdQdxreMWnQxd32jDMEwh2pg7NsnuN" + }, + "signatures": [ + "5DG3XrVfnfTKimSYuz8mWgnqF5mBLuqAcqDZcv1Tq7TGUdmbwwoygEjHjTkbpeuJ79s3Sp6BGhBe8JzYmT6VXbd1" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430750, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430800, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXzN", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "2ASwJhrEruoZdH9BXDEvL7z25w2PX8ztHy9qDgFqhd2X" + }, + "signatures": [ + "5CevNdHzh7yAgNsEAQQqpC2UmckgtpSkRdHqHo6uW1ow5ZoMCcWCj9dFWkBV28PeDA3xicVeZ2urmpyspoQoNUta" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 9235663620, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 9235663670, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "8t2XBEjM7db1Fv24FhNaayPx32daDZ95L5xTETKCk2pK", + "GtvJ5ydPqRrq1oSDdFr4mKynoFFqkDDDYfkPPJnjsH53", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvyak29TbGXpE2Lwz5sSCzhNdG5DLVnfiBZBkMgazajyeLBZzKECbBUxETBJhpzkWTodGw6pMLoLygdjREwer3urL9cNoKzndAFuwucV6nMKUePk649zMvZXuP4WCUgk6pjuXigR8Wux32vCszFfJBfqGj", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "232wBqGGxFPQi22horR7YvofKdtrpc4xnX84D36VFR9QZa8FmTEMteUURgav2eogG33srJ5wKrwmQXw5EhKxNNWB" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430700, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430750, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyM", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "14tvFMnmt5uugsBUyWWvdBC6YiD6bcWbNUQc2Tr1aLc5" + }, + "signatures": [ + "cNqG9iaTpv89mcmfkMXKrY6iUDGHFbJRBMEoWuFPfPV5aXmvf9AUy6xVeot9BxMXpCoFFScQnQT4yPdrpBxBYmq" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430650, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430700, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyw", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "14tvFMnmt5uugsBUyWWvdBC6YiD6bcWbNUQc2Tr1aLc5" + }, + "signatures": [ + "x1x9c9YJwvMe9fKJ1etuSEQvjstXHsHH4AGFLBFAGv564ezffyeDmfPi5oHLLhHZ15pBENLVyyBGZRVY3GXu7NK" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8900415167, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8900415217, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "2gb1u6kcg3V5MfhoycoEL6m6JWgQAmdkpJSXoUa4ogVf", + "Fo7TvsvnVzsVsntZX4bnfH9h3MffzxTGtzQyvm8sTLtP", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvyak29TbGXpE2Lwz5sSCzhNdG5DLVnfiBZBkMgazajyeLBZzKECbBUxETBJhpzkWTodGw6pMLoLygdjREwer3urL9cNoKzndAFuwucV6nMKUePk649zMvZXuP4WCUgk6pjuXigR8Wux32vCszFfJBfqGj", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "4GvrQHF1BuoDyPvT7Vs3TLSfzcSMJscB1fz8Ro36dMncFGYRgg5nJnSpy423MBLqewdn2UNz4Jz7Ze1xfKagz9eH" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8994813570, + 264520, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8994813620, + 264520, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "7jtuen1N95bBNyAV5dbcx6enYT24qKqHobyHQZnyRoTD", + "Fuwdpk6BQq6hPsEWPtmvyujchKYAb6gMA7Z9rKezuoxS", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvyak29TbGXpE2Lwz5sSCzhNdG5DLVnfiBZBkMgazajyeLBZzKECbBUxETBJhpzkWTodGw6pMLoLygdjREwer3urL9cNoKzndAFuwucV6nMKUePk649zMvZXuP4WCUgk6pjuXigR8Wux32vCszFfJBfqGj", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "2hWDjjzuEPtuWXyxh7UJscffuDDV7wjgwDrB4LKezEMpJe3PvwZsCHH2tQaYapRaYgoCuxxMxusHsr8gUcsWaDyh" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 29692, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker CfXww3YzNBQUEtS4ZJeEMZtAEbsym7BAKYUdPsQ1qqrJ", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 29692 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 2947150, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 2947200, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "CfXww3YzNBQUEtS4ZJeEMZtAEbsym7BAKYUdPsQ1qqrJ", + "12p6G2ShLgRbxBpCqDue2zed3UGqnLmrxHNmCrhTR1QS", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "AogE6CYJgaLGXug6D6oTuzZsKJAptaCRD2sLTAMqg1Dm", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyz", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "5ieYGqrkBLQBp5QgEw1qk9TSM7bh1agZF16RT5nJQsjj" + }, + "signatures": [ + "5hwa9WgTik1y13XNZxxXViCbjRqhzgAGtALYAmuvQi934FNFNrjPAiREQiW5HnJGUDiyp9ANMeB5Sahk3NfNDRR6" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 328824, + "err": null, + "fee": 50, + "innerInstructions": [ + { + "index": 2, + "instructions": [ + { + "accounts": [ + 17 + ], + "data": "8YGwT5LUTP4", + "programIdIndex": 15, + "stackHeight": 2 + }, + { + "accounts": [ + 16 + ], + "data": "AsRPEhA6Qs4gQCF7F6cofTsuBDbrBbFbaw5CQ6ceeNF4myVnsfFJtriYBe6adGrQatTrdAY7a1TzMsGRFLBUtZVoToquyyDt3x3G5D2X5g7pUa8DuEZ2AHFK4jJthUV3ytsRDUgDVnPjq2dKcWBc5ZDQKw4EGxaS5U7bofeCxX2vZfWNvCswBx1RABdTaPJJPyhxyDqiT6RfYkL2m6EGAW2dmjLpR4pHmQhC85MnCGKJRd7JR93L5h1EujCBE2gto6wdUUnBFDHGL5SWEKdcEkudNrtUGjCj4R3EnnTBMdmVKFDw8unwhdvGbXnZxxnYDJo31p2e7vVntzaH9MoJ1AGiCAj3VmDYujbJvknMz92Ehk9dihov3uoBrwiJo7X2H7kS7HkfdYS3mGKdom4ZRFAv4vKLjg2Uk9NtE54wVQcqAUCT92e696RnU8gxAc8oeSKf8gFJGHFg1Qrekk9LdaR95Bm7w36iDTB7xovZHkLQay16ZbCv3SC8YRyeqmBfMguY8GJDKXobXg6njWvFVZtVYViLMy9t7o8dZmy9swmuQFYPeRs6fddgQKYQxw", + "programIdIndex": 13, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 1 + ], + "data": "11112L11uQJhYT72kZ1iSnLC4yTJBhW25Zvv2dhge4xi6PgvdPK711MPj6dqaW9Q1Act58", + "programIdIndex": 6, + "stackHeight": 2 + }, + { + "accounts": [ + 12, + 6, + 17, + 10, + 8, + 11, + 3, + 2, + 4 + ], + "data": "7MHiQP8ahsZ7exLBXWsfg2PXgutcWwygoSu2YxVxohLeXDRFUKhVLRz9XRvPvP7wvMK68dufmtWRJYfJgGQkKVJh4UoibKpaSHDjWZd1d1GEnkLMdBPhmZcVGV7Df8LXknCM8gAfqE1gtF8Mey8WfZbuq", + "programIdIndex": 15, + "stackHeight": 2 + }, + { + "accounts": [ + 4, + 2, + 10, + 3, + 6, + 8 + ], + "data": "2", + "programIdIndex": 11, + "stackHeight": 3 + }, + { + "accounts": [ + 3 + ], + "data": "84eT", + "programIdIndex": 8, + "stackHeight": 4 + }, + { + "accounts": [ + 4, + 2 + ], + "data": "11112Um5QtBM9RVwhzeb2i4U2mPJ7krjBF48k17qACUVhhTNRzdmH1adRRGPABHBdaEx67", + "programIdIndex": 6, + "stackHeight": 4 + }, + { + "accounts": [ + 2 + ], + "data": "P", + "programIdIndex": 8, + "stackHeight": 4 + }, + { + "accounts": [ + 2, + 3 + ], + "data": "6SsgWxU3VsJsq1Mht5HyhzQLbcTLc5nrKuFyytmLcmRv9", + "programIdIndex": 8, + "stackHeight": 4 + }, + { + "accounts": [ + 3, + 2, + 3 + ], + "data": "ndTgmR9QMvT7W", + "programIdIndex": 8, + "stackHeight": 3 + } + ] + } + ], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y invoke [1]", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y invoke [2]", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y consumed 4505 of 323327 compute units", + "Program return: FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y AA==", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y success", + "Program BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V invoke [2]", + "Program BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V consumed 184250 of 312286 compute units", + "Program BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y invoke [2]", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [3]", + "Program log: CreateIdempotent", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: GetAccountDataSize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2941 of 91911 compute units", + "Program return: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb qgAAAAAAAAA=", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program 11111111111111111111111111111111 invoke [4]", + "Program 11111111111111111111111111111111 success", + "Program log: Initialize the associated token account", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: InitializeImmutableOwner", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 1924 of 84111 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: InitializeAccount3", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5175 of 79770 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 24597 of 98798 compute units", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: Instruction: MintToChecked", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5383 of 70773 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Warp route transfer completed from origin: 1399811149, recipient: 6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB, remote_amount: 80000000", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y consumed 73912 of 119663 compute units", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y success", + "Program log: Hyperlane inbox processed message 0x95a06dba7265e86a56ad2c2f0fa9e2888cb304f0cd0d2bddbdb4915f5df16f5a", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y consumed 328824 of 361706 compute units", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y success" + ], + "postBalances": [ + 29970800, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "postTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "preBalances": [ + 29983430, + 0, + 0, + 41072, + 92659224, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "G6fWKEBSrDtR8Uzx4kdVRRhrsHZ6zmGX1G2TYMmMgK6u", + "2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf", + "5Py6bEKmK84Wp4Bm9fG9JnjoDazyDrEM4KRrLZLbLexR", + "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "CijxTbPs9JZxTUfo8Hmz2imxzHtKnDFD3kZP3RPy34uJ", + "GKkC5NTFvHkjkPprY4hWbtpsCAt4bhVG9zPx7N8rbSuA", + "11111111111111111111111111111111", + "ComputeBudget111111111111111111111111111111", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "AUiZ4KyQ25f9uRFPJ7GRaYLwFfd8TqL76xYfymWQ7H41", + "BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V", + "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", + "FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y", + "HRmKtAk47FtpiJuNvwZh66CmWkCFuXN18DN4z4b4cRzH", + "HXLdLtBLj3yn384tpZCdN3SMDdN9hDzBsvNxCND3gQCt" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 12, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "L5k7BD", + "programIdIndex": 7, + "stackHeight": null + }, + { + "accounts": [], + "data": "3DTZbgwsozUF", + "programIdIndex": 7, + "stackHeight": null + }, + { + "accounts": [ + 0, + 6, + 5, + 12, + 1, + 17, + 9, + 13, + 16, + 15, + 6, + 17, + 10, + 8, + 11, + 3, + 2, + 4 + ], + "data": "FTTpGG1B19Dvee6GQUXvdRAGVDD2KsGVzEYf41TUxTUZR4AtU9NZiyDkKioWpAgvXfTcn6B3JKbwvQy8n1bWorY2VvWnzwaJivpNKea2HxaSWqZNCJQMUM4CcmeWVnUfjCp8R8V5Pii6RY4MAd66MJLioPNnL9UQYyZ6eT64ncWhuoeLqC8yuESqcsxGRSRmR7cX6fASBoDZVEMxoQ9X4ct9Q2a9PWKivVkTReLZyEHHT4NTTWek13DawFDehydmDcWpLSUJKSmuFwKUisJSTfuzTsgqfSxKtp6KE2hMzVQ46PZpw5XSFqNUp4rGuTYYPcH2uF51wLKNQ8ABY6iXLAe6Lwri7C491RqKvKKM1xcUdSQNNKykNjVcq1pLZ4jKuf2idakmgfACytryMQxAeyJxxZ2d1pDmHxy2kwZTF8LW3quTnxHvaLroQJfr1vjFddfBhnnM4MRuwQnEwhmLcohPRncqcRroByhEwGugYw1XJMvyH8D8sP1MWm9SRKRxSz88QgGfGhtg8eGPVE5fZPnQY46JFUi7JyznxjBoRTjd472aCpP", + "programIdIndex": 14, + "stackHeight": null + } + ], + "recentBlockhash": "5ieYGqrkBLQBp5QgEw1qk9TSM7bh1agZF16RT5nJQsjj" + }, + "signatures": [ + "4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992550, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992600, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXy9", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "3veDZBERK9bD5PzCuygjYquZ85aUnU24kRuUwWRzTtkc" + }, + "signatures": [ + "3sTCx7dEzUALDq3D2zkLyftawaxQZBpHaiqtkvSxkd6QUuuuyjgLUvnrhmkMt5j2rVooqqEscJUAEaQB2GHgXgAf" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 38067, + "err": { + "InstructionError": [ + 1, + { + "Custom": 5 + } + ] + }, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y invoke [1]", + "Program log: Custom program error: 0x5", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y consumed 38067 of 1400000 compute units", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y failed: custom program error: 0x5" + ], + "postBalances": [ + 3105342080, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "postTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "preBalances": [ + 3105342130, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "preTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "rewards": [], + "status": { + "Err": { + "InstructionError": [ + 1, + { + "Custom": 5 + } + ] + } + } + }, + "transaction": { + "message": { + "accountKeys": [ + "G5FM3UKwcBJ47PwLWLLY1RQpqNtTMgnqnd6nZGcJqaBp", + "2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf", + "5Py6bEKmK84Wp4Bm9fG9JnjoDazyDrEM4KRrLZLbLexR", + "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "CijxTbPs9JZxTUfo8Hmz2imxzHtKnDFD3kZP3RPy34uJ", + "GKkC5NTFvHkjkPprY4hWbtpsCAt4bhVG9zPx7N8rbSuA", + "11111111111111111111111111111111", + "ComputeBudget111111111111111111111111111111", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "AUiZ4KyQ25f9uRFPJ7GRaYLwFfd8TqL76xYfymWQ7H41", + "BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V", + "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", + "FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y", + "HRmKtAk47FtpiJuNvwZh66CmWkCFuXN18DN4z4b4cRzH", + "HXLdLtBLj3yn384tpZCdN3SMDdN9hDzBsvNxCND3gQCt" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 12, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "K1FDJ7", + "programIdIndex": 7, + "stackHeight": null + }, + { + "accounts": [ + 0, + 6, + 5, + 12, + 1, + 17, + 9, + 13, + 16, + 15, + 6, + 17, + 10, + 8, + 11, + 3, + 2, + 4 + ], + "data": "FTTpGG1B19Dvee6GQUXvdRAGVDD2KsGVzEYf41TUxTUZR4AtU9NZiyDkKioWpAgvXfTcn6B3JKbwvQy8n1bWorY2VvWnzwaJivpNKea2HxaSWqZNCJQMUM4CcmeWVnUfjCp8R8V5Pii6RY4MAd66MJLioPNnL9UQYyZ6eT64ncWhuoeLqC8yuESqcsxGRSRmR7cX6fASBoDZVEMxoQ9X4ct9Q2a9PWKivVkTReLZyEHHT4NTTWek13DawFDehydmDcWpLSUJKSmuFwKUisJSTfuzTsgqfSxKtp6KE2hMzVQ46PZpw5XSFqNUp4rGuTYYPcH2uF51wLKNQ8ABY6iXLAe6Lwri7C491RqKvKKM1xcUdSQNNKykNjVcq1pLZ4jKuf2idakmgfACytryMQxAeyJxxZ2d1pDmHxy2kwZTF8LW3quTnxHvaLroQJfr1vjFddfBhnnM4MRuwQnEwhmLcohPRncqcRroByhEwGugYw1XJMvyH8D8sP1MWm9SRKRxSz88QgGfGhtg8eGPVE5fZPnQY46JFUi7JyznxjBoRTjd472aCpP", + "programIdIndex": 14, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "5F5PUWAZcBmuGaejN4qr9BjbXCMNSY2ujQ2eUTmiftYaKEE3VoU5uowttiY73ksqpGM3R4CBB7TFKBP1j3R3EUM9" + ] + }, + "version": "legacy" + } + ] +} \ No newline at end of file diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_reverted_txn.json b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_reverted_txn.json new file mode 100644 index 0000000000..0001db5074 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_reverted_txn.json @@ -0,0 +1,175 @@ +{ + "blockTime": 1734974925, + "meta": { + "computeUnitsConsumed": 38067, + "err": { + "InstructionError": [ + 1, + { + "Custom": 5 + } + ] + }, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y invoke [1]", + "Program log: Custom program error: 0x5", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y consumed 38067 of 1400000 compute units", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y failed: custom program error: 0x5" + ], + "postBalances": [ + 3105342080, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "postTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "preBalances": [ + 3105342130, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "preTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "rewards": [], + "status": { + "Err": { + "InstructionError": [ + 1, + { + "Custom": 5 + } + ] + } + } + }, + "slot": 35781852, + "transaction": { + "message": { + "accountKeys": [ + "G5FM3UKwcBJ47PwLWLLY1RQpqNtTMgnqnd6nZGcJqaBp", + "2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf", + "5Py6bEKmK84Wp4Bm9fG9JnjoDazyDrEM4KRrLZLbLexR", + "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "CijxTbPs9JZxTUfo8Hmz2imxzHtKnDFD3kZP3RPy34uJ", + "GKkC5NTFvHkjkPprY4hWbtpsCAt4bhVG9zPx7N8rbSuA", + "11111111111111111111111111111111", + "ComputeBudget111111111111111111111111111111", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "AUiZ4KyQ25f9uRFPJ7GRaYLwFfd8TqL76xYfymWQ7H41", + "BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V", + "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", + "FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y", + "HRmKtAk47FtpiJuNvwZh66CmWkCFuXN18DN4z4b4cRzH", + "HXLdLtBLj3yn384tpZCdN3SMDdN9hDzBsvNxCND3gQCt" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 12, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "K1FDJ7", + "programIdIndex": 7, + "stackHeight": null + }, + { + "accounts": [ + 0, + 6, + 5, + 12, + 1, + 17, + 9, + 13, + 16, + 15, + 6, + 17, + 10, + 8, + 11, + 3, + 2, + 4 + ], + "data": "FTTpGG1B19Dvee6GQUXvdRAGVDD2KsGVzEYf41TUxTUZR4AtU9NZiyDkKioWpAgvXfTcn6B3JKbwvQy8n1bWorY2VvWnzwaJivpNKea2HxaSWqZNCJQMUM4CcmeWVnUfjCp8R8V5Pii6RY4MAd66MJLioPNnL9UQYyZ6eT64ncWhuoeLqC8yuESqcsxGRSRmR7cX6fASBoDZVEMxoQ9X4ct9Q2a9PWKivVkTReLZyEHHT4NTTWek13DawFDehydmDcWpLSUJKSmuFwKUisJSTfuzTsgqfSxKtp6KE2hMzVQ46PZpw5XSFqNUp4rGuTYYPcH2uF51wLKNQ8ABY6iXLAe6Lwri7C491RqKvKKM1xcUdSQNNKykNjVcq1pLZ4jKuf2idakmgfACytryMQxAeyJxxZ2d1pDmHxy2kwZTF8LW3quTnxHvaLroQJfr1vjFddfBhnnM4MRuwQnEwhmLcohPRncqcRroByhEwGugYw1XJMvyH8D8sP1MWm9SRKRxSz88QgGfGhtg8eGPVE5fZPnQY46JFUi7JyznxjBoRTjd472aCpP", + "programIdIndex": 14, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "5F5PUWAZcBmuGaejN4qr9BjbXCMNSY2ujQ2eUTmiftYaKEE3VoU5uowttiY73ksqpGM3R4CBB7TFKBP1j3R3EUM9" + ] + }, + "version": "legacy" +} \ No newline at end of file diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_versioned_txn.json b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_versioned_txn.json new file mode 100644 index 0000000000..0fcd409407 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_versioned_txn.json @@ -0,0 +1,565 @@ +{ + "blockTime": 1734978752, + "meta": { + "computeUnitsConsumed": 285017, + "err": null, + "fee": 50150, + "innerInstructions": [ + { + "index": 4, + "instructions": [ + { + "accounts": [ + 14 + ], + "data": "84eT", + "programIdIndex": 24, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 3 + ], + "data": "11112Um5QtBM9RVwhzeb2i4U2mPJ7krjBF48k17qACUVhhTNRzdmH1adRRGPABHBdaEx67", + "programIdIndex": 9, + "stackHeight": 2 + }, + { + "accounts": [ + 3 + ], + "data": "P", + "programIdIndex": 24, + "stackHeight": 2 + }, + { + "accounts": [ + 3, + 14 + ], + "data": "6U6TaA8c9FiMd3yMvYM3RZr5L251Z6XBhE7CZMpM6UqrA", + "programIdIndex": 24, + "stackHeight": 2 + } + ] + }, + { + "index": 5, + "instructions": [ + { + "accounts": [ + 1, + 22, + 16, + 0 + ], + "data": "iSvRA2gPzQThi", + "programIdIndex": 10, + "stackHeight": 2 + }, + { + "accounts": [ + 17, + 14, + 3, + 15 + ], + "data": "iQVR3BvfMWGrC", + "programIdIndex": 24, + "stackHeight": 2 + } + ] + }, + { + "index": 7, + "instructions": [ + { + "accounts": [ + 3, + 14, + 0, + 0 + ], + "data": "tBUevJEscuw5z", + "programIdIndex": 24, + "stackHeight": 2 + }, + { + "accounts": [ + 19, + 29, + 9, + 26, + 0, + 2, + 5 + ], + "data": "2cRRtjzqbhv2aDpjzg6LXy6C7SLpDEsUatfoywKz3m1ifhrSUVpNtpkHK1dj5rchz1z3j8CtHuW5T2ezWvBJVLET7tCge9vDB2AF5EM8LPUdk1EGpKZam3tQNV1W7xMmt4iDto9DAhMQrbR6uG1Vb66vdH6kjEbHWTMbhUim4BP661Gpk1yyPTHjQUB", + "programIdIndex": 28, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 19 + ], + "data": "3Bxs3zrfFUZbEPqZ", + "programIdIndex": 9, + "stackHeight": 3 + }, + { + "accounts": [ + 0, + 5 + ], + "data": "1111614MkWaU9KqTDJLQwrzvidXGxXXwfY2mfoKeoqQBJrMaZskjDkgQ6pE2yERkoudxWv", + "programIdIndex": 9, + "stackHeight": 3 + }, + { + "accounts": [ + 9, + 0, + 20, + 2, + 6, + 21, + 31 + ], + "data": "6ZKyf8sS97C2Z34TUpXiGQBLPqCXXtBbZ2gHBxwLacXBZ6P8XPoaBUwFzxs1H", + "programIdIndex": 30, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 21 + ], + "data": "3Bxs46hkTBuBteUP", + "programIdIndex": 9, + "stackHeight": 3 + }, + { + "accounts": [ + 0, + 6 + ], + "data": "11115GPcU8wJysz1fCGMm1QuqnxK4pGnpF8XeC1S6D1r5qH2HggEcqE6oAfk4xFS7paC4J", + "programIdIndex": 9, + "stackHeight": 3 + } + ] + } + ], + "loadedAddresses": { + "readonly": [ + "So11111111111111111111111111111111111111112", + "SysvarRent111111111111111111111111111111111", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "HXLdLtBLj3yn384tpZCdN3SMDdN9hDzBsvNxCND3gQCt", + "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", + "HP8WWjbxdeGhW3NRdBpWpARKgphEAQP5htG4AfbXqvRE", + "Hs7KVBU67nBnWhDPZkEFwWqrFMUfJbmY2DQ4gmCZfaZp", + "3Wp4qKkgf4tjXz1soGyTSndCgBPLZFSrZkiDZ8Qp9EEj" + ], + "writable": [ + "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "Du5B9P5uPhZ1nWubRTLrhoh6Va1kpuVXM1FpM7wJSPSu", + "FQjMvPVo9ReLZwbojjBkdjda4kSjdqoRjrARfN9qX9FJ", + "GgHsBMbgswDHEDoMvoYGhqsepjdsxCAjk2W22yEvz1Em", + "FKKDGYumoKjQjVEejff6MD1FpKuBs6SdgAobVdJdE21B", + "FvGvXJf6bd2wx8FxzsYNzd2uHaPy7JTkmuKiVvSTt7jm", + "ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK" + ] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [1]", + "Program 11111111111111111111111111111111 success", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]", + "Program log: Instruction: InitializeAccount", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3442 of 500000 compute units", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]", + "Program log: CreateIdempotent", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: GetAccountDataSize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2941 of 488247 compute units", + "Program return: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb qgAAAAAAAAA=", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program log: Initialize the associated token account", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: InitializeImmutableOwner", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 1924 of 480447 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: InitializeAccount3", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5175 of 476106 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 26000 of 496558 compute units", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success", + "Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc invoke [1]", + "Program log: Instruction: SwapV2", + "Program log: fee_growth: 6962398081", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]", + "Program log: Instruction: TransferChecked", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6239 of 425251 compute units", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: TransferChecked", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 8356 of 410679 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc consumed 71018 of 470558 compute units", + "Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc success", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]", + "Program log: Instruction: CloseAccount", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 2914 of 399540 compute units", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y invoke [1]", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: BurnChecked", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5921 of 376214 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y invoke [2]", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Protocol fee of 0 paid from 7xkuDw5Lxs5nnVGQTBr65sdwXBRjgmuzXC2hsEfHBhRC to FKKDGYumoKjQjVEejff6MD1FpKuBs6SdgAobVdJdE21B", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Dispatched message to 1399811149, ID 0xdf5b603df4e3e3e318f222cf6c2ea3aea44893dab86ab34d3dd88f42c87b27d0", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y consumed 81465 of 365453 compute units", + "Program return: EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y 31tgPfTj4+MY8iLPbC6jrqRIk9q4arNNPdiPQsh7J9A=", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y success", + "Program Hs7KVBU67nBnWhDPZkEFwWqrFMUfJbmY2DQ4gmCZfaZp invoke [2]", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Paid IGP ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK for 244000 gas for message 0xdf5b…27d0 to 1399811149", + "Program Hs7KVBU67nBnWhDPZkEFwWqrFMUfJbmY2DQ4gmCZfaZp consumed 56083 of 280947 compute units", + "Program Hs7KVBU67nBnWhDPZkEFwWqrFMUfJbmY2DQ4gmCZfaZp success", + "Program log: Warp route transfer completed to destination: 1399811149, recipient: 0x9a83…6889, remote_amount: 17884084", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y consumed 181643 of 396626 compute units", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y success", + "Program 11111111111111111111111111111111 invoke [1]", + "Program 11111111111111111111111111111111 success" + ], + "postBalances": [ + 14487952, + 0, + 0, + 20264, + 687888, + 21896, + 18292, + 4187500, + 1, + 1, + 9076640, + 7277632, + 11152, + 11152, + 41072, + 53108, + 41900320071, + 19924, + 0, + 84796, + 9928, + 2660002254, + 1000000000, + 9860, + 11152, + 5095104, + 0, + 28492, + 11152, + 8704, + 11152, + 18700 + ], + "postTokenBalances": [ + { + "accountIndex": 3, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "7xkuDw5Lxs5nnVGQTBr65sdwXBRjgmuzXC2hsEfHBhRC", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "0", + "decimals": 9, + "uiAmount": null, + "uiAmountString": "0" + } + }, + { + "accountIndex": 16, + "mint": "So11111111111111111111111111111111111111112", + "owner": "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "uiTokenAmount": { + "amount": "41900300147", + "decimals": 9, + "uiAmount": 41.900300147, + "uiAmountString": "41.900300147" + } + }, + { + "accountIndex": 17, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "1100478938255", + "decimals": 9, + "uiAmount": 1100.478938255, + "uiAmountString": "1100.478938255" + } + } + ], + "preBalances": [ + 15923196, + 0, + 0, + 0, + 687888, + 0, + 0, + 4182500, + 1, + 1, + 9076640, + 7277632, + 11152, + 11152, + 41072, + 53108, + 41899325071, + 19924, + 0, + 84796, + 9928, + 2659677612, + 1000000000, + 9860, + 11152, + 5095104, + 0, + 28492, + 11152, + 8704, + 11152, + 18700 + ], + "preTokenBalances": [ + { + "accountIndex": 16, + "mint": "So11111111111111111111111111111111111111112", + "owner": "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "uiTokenAmount": { + "amount": "41899305147", + "decimals": 9, + "uiAmount": 41.899305147, + "uiAmountString": "41.899305147" + } + }, + { + "accountIndex": 17, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "1100496822339", + "decimals": 9, + "uiAmount": 1100.496822339, + "uiAmountString": "1100.496822339" + } + } + ], + "rewards": [], + "status": { + "Ok": null + } + }, + "slot": 35792433, + "transaction": { + "message": { + "accountKeys": [ + "7xkuDw5Lxs5nnVGQTBr65sdwXBRjgmuzXC2hsEfHBhRC", + "AHE9Hs4nZF9NM1VJZHg61jkFBx5cBVaabAYAJFzPAiCk", + "2xieFW4TnPYwRyCf1aT9m6Xry4rBeCRKyPsScByyiAAG", + "GZKxYbwFzZgPti86aMjFTVtFL3pP4wUq38TfQjpGHqg5", + "AkEJURpBDvPEaQcnDum3BywUB5vLHHLoBLm3z7jmMKtG", + "9g87Di4xiYVvBE5F8Atk8xorbbVD8yKqbdHRkFu5HEgw", + "gJRnC4X1pnctZEzdo67Pwx4wfRw5MLFdTa2ostjGv9C", + "BWbHzqYBnWmU6kRg8Upi61hq3gf5u8F3hB886MBhg7wh", + "ComputeBudget111111111111111111111111111111", + "11111111111111111111111111111111", + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y" + ], + "addressTableLookups": [ + { + "accountKey": "F4omQWQnyM6Fny5CA9KY4xyyNemDrp87ZHXZDwME5M8q", + "readonlyIndexes": [ + 7, + 1, + 3, + 4, + 14, + 15, + 16, + 18, + 21, + 24 + ], + "writableIndexes": [ + 8, + 6, + 9, + 11, + 13, + 17, + 22, + 25 + ] + } + ], + "header": { + "numReadonlySignedAccounts": 1, + "numReadonlyUnsignedAccounts": 6, + "numRequiredSignatures": 3 + }, + "instructions": [ + { + "accounts": [], + "data": "EvSMNP", + "programIdIndex": 8, + "stackHeight": null + }, + { + "accounts": [], + "data": "3gJqkocMWaMm", + "programIdIndex": 8, + "stackHeight": null + }, + { + "accounts": [ + 0, + 1 + ], + "data": "111169tnWyB6yf7otj9gwMZ223az8WhRhw17kSToNJKZLqyX9pDi2Cd13sTA9NPWFfoQpx", + "programIdIndex": 9, + "stackHeight": null + }, + { + "accounts": [ + 1, + 22, + 0, + 23 + ], + "data": "2", + "programIdIndex": 10, + "stackHeight": null + }, + { + "accounts": [ + 0, + 3, + 0, + 14, + 9, + 24 + ], + "data": "2", + "programIdIndex": 11, + "stackHeight": null + }, + { + "accounts": [ + 10, + 24, + 25, + 0, + 15, + 22, + 14, + 1, + 16, + 3, + 17, + 4, + 4, + 4, + 18 + ], + "data": "4AoQRYXBdnCR4Ye4kfVqUSk92cVTu2wqdAePuVxcoJsMUVket7q7Sp2DCT1", + "programIdIndex": 12, + "stackHeight": null + }, + { + "accounts": [ + 1, + 0, + 0 + ], + "data": "A", + "programIdIndex": 10, + "stackHeight": null + }, + { + "accounts": [ + 9, + 26, + 27, + 28, + 19, + 29, + 0, + 2, + 5, + 30, + 20, + 6, + 31, + 21, + 24, + 14, + 3 + ], + "data": "RpjV6TtUSvsqoqZDmaVYK3Bu3EKPjEdZSC4i9viiVTSQ7fcSFrXZVvXuHzpQxzu8MT913h4XokFBcMrqJJrqDufh1zrzR885gUDpnk23", + "programIdIndex": 13, + "stackHeight": null + }, + { + "accounts": [ + 0, + 7 + ], + "data": "3Bxs4PckVVt51W8w", + "programIdIndex": 9, + "stackHeight": null + } + ], + "recentBlockhash": "9BcgXdeCcvL42fcsM9Gszs5Rjg4QvjyCTQZb2AAyrLaC" + }, + "signatures": [ + "Ku7gtQzEztksncHMHYkXq8PNst5rZsznrXMDmVqoQjc7SR4PsXz33qjNMckNcHriCxuhZJGZequo8moNsRP9GZK", + "3koYYZbZiHFBuNiUjFUqHGJw6hw8A8qxudK7v18TVvW9pwzER3XEcWWcMovYok83ihGxMhGxUdW6WbFcdajdWZUU", + "5e5xsKD3s4GWCHpiji2XmioRZG6SWKAYyQb5V7KoTjFueTYxKqbD8QYvWV7iLGJm2fVEZpDx9pY5cRV7Az8Vmk1w" + ] + }, + "version": 0 +} \ No newline at end of file diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs index d1097b1b08..3d666d3461 100644 --- a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs @@ -1,13 +1,16 @@ use std::fs; use std::path::PathBuf; -use solana_transaction_status::EncodedTransactionWithStatusMeta; +use hyperlane_core::{LogMeta, U256}; +use solana_transaction_status::{EncodedTransactionWithStatusMeta, UiConfirmedBlock}; use crate::log_meta_composer::{ is_interchain_payment_instruction, is_message_delivery_instruction, is_message_dispatch_instruction, search_transactions, }; -use crate::utils::decode_pubkey; +use crate::utils::{decode_h256, decode_h512, decode_pubkey}; + +use super::LogMetaComposer; #[test] pub fn test_search_dispatched_message_transaction() { @@ -29,6 +32,26 @@ pub fn test_search_dispatched_message_transaction() { assert!(!transaction_hashes.is_empty()); } +#[test] +pub fn test_search_dispatched_message_versioned_transaction() { + // given + let mailbox_program_id = decode_pubkey("EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y").unwrap(); + let dispatched_message_pda_account = + decode_pubkey("9g87Di4xiYVvBE5F8Atk8xorbbVD8yKqbdHRkFu5HEgw").unwrap(); + let transactions = transactions(&read_json("dispatch_message_versioned_txn.json")); + + // when + let transaction_hashes = search_transactions( + transactions, + &mailbox_program_id, + &dispatched_message_pda_account, + is_message_dispatch_instruction, + ); + + // then + assert!(!transaction_hashes.is_empty()); +} + #[test] pub fn test_search_delivered_message_transaction() { // given @@ -49,6 +72,27 @@ pub fn test_search_delivered_message_transaction() { assert!(!transaction_hashes.is_empty()); } +#[test] +pub fn test_search_delivered_message_reverted_transaction() { + // given + let mailbox_program_id = decode_pubkey("EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y").unwrap(); + // From the successful version of the delivery in https://eclipsescan.xyz/tx/4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb + let delivered_message_pda_account = + decode_pubkey("2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf").unwrap(); + let transactions = transactions(&read_json("delivery_message_reverted_txn.json")); + + // when + let transaction_hashes = search_transactions( + transactions, + &mailbox_program_id, + &delivered_message_pda_account, + is_message_delivery_instruction, + ); + + // then + assert!(transaction_hashes.is_empty()); +} + #[test] pub fn test_search_interchain_payment_transaction() { // given @@ -70,6 +114,48 @@ pub fn test_search_interchain_payment_transaction() { assert!(!transaction_hashes.is_empty()); } +#[test] +fn test_log_meta_block_with_multiple_txs_only_one_successful() { + // This test case uses an example of a block where delivery was attempted + // in 2 transactions, but only one was successful. + // Successful: https://eclipsescan.xyz/tx/4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb + // Reverted: https://eclipsescan.xyz/tx/5F5PUWAZcBmuGaejN4qr9BjbXCMNSY2ujQ2eUTmiftYaKEE3VoU5uowttiY73ksqpGM3R4CBB7TFKBP1j3R3EUM9 + + // given + let mailbox_program_id = decode_pubkey("EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y").unwrap(); + let composer = LogMetaComposer::new( + mailbox_program_id, + "message delivery".to_owned(), + is_message_delivery_instruction, + ); + // From the successful version of the delivery in https://eclipsescan.xyz/tx/4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb + let delivered_message_pda_account = + decode_pubkey("2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf").unwrap(); + let block = serde_json::from_str::(&read_json( + "delivery_message_block_multiple_txs_one_successful.json", + )) + .unwrap(); + let log_index = U256::zero(); + let pda_slot = block.block_height.unwrap(); + let blockhash = decode_h256(&block.blockhash).unwrap(); + + // when + let log_meta = composer + .log_meta(block, log_index, &delivered_message_pda_account, &pda_slot) + .unwrap(); + + // then + assert_eq!(log_meta, LogMeta { + address: mailbox_program_id.to_bytes().into(), + block_number: pda_slot, + block_hash: blockhash, + // The successful transaction and its index in the block + transaction_id: decode_h512("4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb").unwrap(), + transaction_index: 33, + log_index, + }); +} + fn read_json(path: &str) -> String { let relative = PathBuf::new().join("src/log_meta_composer/").join(path); let absolute = fs::canonicalize(relative).expect("cannot find path"); diff --git a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs index 66e58131aa..034f24c027 100644 --- a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs +++ b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs @@ -22,61 +22,37 @@ use hyperlane_sealevel_message_recipient_interface::{ }; use lazy_static::lazy_static; use serializable_account_meta::SimulationReturnData; -use solana_client::{rpc_client::SerializableTransaction, rpc_response::Response}; use solana_program::pubkey; use solana_sdk::{ account::Account, - bs58, clock::Slot, commitment_config::CommitmentConfig, - compute_budget::ComputeBudgetInstruction, instruction::{AccountMeta, Instruction}, pubkey::Pubkey, - signature::Signature, signer::{keypair::Keypair, Signer as _}, - transaction::Transaction, }; -use solana_transaction_status::TransactionStatus; use tracing::{debug, info, instrument, warn}; use hyperlane_core::{ config::StrOrIntParseError, ChainCommunicationError, ChainResult, ContractLocator, Decode as _, Encode as _, FixedPointNumber, HyperlaneChain, HyperlaneContract, HyperlaneDomain, - HyperlaneMessage, HyperlaneProvider, Indexed, Indexer, KnownHyperlaneDomain, LogMeta, Mailbox, - MerkleTreeHook, ReorgPeriod, SequenceAwareIndexer, TxCostEstimate, TxOutcome, H256, H512, U256, + HyperlaneMessage, HyperlaneProvider, Indexed, Indexer, LogMeta, Mailbox, MerkleTreeHook, + ReorgPeriod, SequenceAwareIndexer, TxCostEstimate, TxOutcome, H256, H512, U256, }; -use crate::account::{search_accounts_by_discriminator, search_and_validate_account}; use crate::log_meta_composer::{ is_message_delivery_instruction, is_message_dispatch_instruction, LogMetaComposer, }; +use crate::tx_submitter::TransactionSubmitter; +use crate::{ + account::{search_accounts_by_discriminator, search_and_validate_account}, + priority_fee::PriorityFeeOracle, +}; use crate::{ConnectionConf, SealevelProvider, SealevelRpcClient}; const SYSTEM_PROGRAM: &str = "11111111111111111111111111111111"; const SPL_NOOP: &str = "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"; -// The max amount of compute units for a transaction. -// TODO: consider a more sane value and/or use IGP gas payments instead. -const PROCESS_COMPUTE_UNITS: u32 = 1_400_000; - -/// 0.0005 SOL, in lamports. -/// A typical tx fee without a prioritization fee is 0.000005 SOL, or -/// 5000 lamports. (Example: https://explorer.solana.com/tx/fNd3xVeBzFHeuzr8dXQxLGiHMzTeYpykSV25xWzNRaHtzzjvY9A3MzXh1ZsK2JncRHkwtuWrGEwGXVhFaUCYhtx) -/// See average priority fees here https://solanacompass.com/statistics/fees -/// to inform what to spend here. -const PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX: u64 = 500000; - -/// In micro-lamports. Multiply this by the compute units to figure out -/// the additional cost of processing a message, in addition to the mandatory -/// "base" cost of signature verification. -/// Unused at the moment, but kept for future reference. -#[allow(dead_code)] -const PROCESS_COMPUTE_UNIT_PRICE_MICRO_LAMPORTS: u64 = - // Convert to micro-lamports - (PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX * 1_000_000) - // Divide by the max compute units - / PROCESS_COMPUTE_UNITS as u64; - // Earlier versions of collateral warp routes were deployed off a version where the mint // was requested as a writeable account for handle instruction. This is not necessary, // and generally requires a higher priority fee to be paid. @@ -96,6 +72,7 @@ lazy_static! { (pubkey!("CuQmsT4eSF4dYiiGUGYYQxJ7c58pUAD5ADE3BbFGzQKx"), pubkey!("EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm")), ]); } + /// A reference to a Mailbox contract on some Sealevel chain pub struct SealevelMailbox { pub(crate) program_id: Pubkey, @@ -103,6 +80,8 @@ pub struct SealevelMailbox { pub(crate) outbox: (Pubkey, u8), pub(crate) provider: SealevelProvider, payer: Option, + priority_fee_oracle: Box, + tx_submitter: Box, } impl SealevelMailbox { @@ -127,8 +106,12 @@ impl SealevelMailbox { program_id, inbox, outbox, - provider, payer, + priority_fee_oracle: conf.priority_fee_oracle.create_oracle(), + tx_submitter: conf + .transaction_submitter + .create_submitter(provider.rpc().url()), + provider, }) } @@ -301,122 +284,88 @@ impl SealevelMailbox { self.get_account_metas(instruction).await } - fn use_jito(&self) -> bool { - matches!( - self.domain(), - HyperlaneDomain::Known(KnownHyperlaneDomain::SolanaMainnet) - ) - } - - async fn send_and_confirm_transaction( + async fn get_process_instruction( &self, - transaction: &Transaction, - ) -> ChainResult { - if self.use_jito() { - self.send_and_confirm_transaction_with_jito(transaction) - .await - } else { - self.provider - .rpc() - .send_and_confirm_transaction(transaction) - .await - } - } + message: &HyperlaneMessage, + metadata: &[u8], + ) -> ChainResult { + let recipient: Pubkey = message.recipient.0.into(); + let mut encoded_message = vec![]; + message.write_to(&mut encoded_message).unwrap(); - /// Send a transaction to Jito and wait for it to be confirmed. - /// Logic stolen from Solana's non-blocking client. - pub async fn send_and_confirm_transaction_with_jito( - &self, - transaction: &impl SerializableTransaction, - ) -> ChainResult { - let signature = transaction.get_signature(); + let payer = self.get_payer()?; - let base58_txn = bs58::encode( - bincode::serialize(&transaction).map_err(ChainCommunicationError::from_other)?, + let (process_authority_key, _process_authority_bump) = Pubkey::try_find_program_address( + mailbox_process_authority_pda_seeds!(&recipient), + &self.program_id, ) - .into_string(); - - const SEND_RETRIES: usize = 1; - const GET_STATUS_RETRIES: usize = usize::MAX; - - 'sending: for _ in 0..SEND_RETRIES { - let jito_request_body = serde_json::json!({ - "jsonrpc": "2.0", - "id": 1, - "method": "sendBundle", - "params": [ - [base58_txn] - ], + .ok_or_else(|| { + ChainCommunicationError::from_other_str( + "Could not find program address for process authority", + ) + })?; + let (processed_message_account_key, _processed_message_account_bump) = + Pubkey::try_find_program_address( + mailbox_processed_message_pda_seeds!(message.id()), + &self.program_id, + ) + .ok_or_else(|| { + ChainCommunicationError::from_other_str( + "Could not find program address for processed message account", + ) + })?; + + // Get the account metas required for the recipient.InterchainSecurityModule instruction. + let ism_getter_account_metas = self.get_ism_getter_account_metas(recipient).await?; + + // Get the recipient ISM. + let ism = self + .get_recipient_ism(recipient, ism_getter_account_metas.clone()) + .await?; + + let ixn = + hyperlane_sealevel_mailbox::instruction::Instruction::InboxProcess(InboxProcess { + metadata: metadata.to_vec(), + message: encoded_message.clone(), }); + let ixn_data = ixn + .into_instruction_data() + .map_err(ChainCommunicationError::from_other)?; - tracing::info!( - ?jito_request_body, - ?signature, - "Sending sealevel transaction to Jito as bundle" - ); + // Craft the accounts for the transaction. + let mut accounts: Vec = vec![ + AccountMeta::new_readonly(payer.pubkey(), true), + AccountMeta::new_readonly(Pubkey::from_str(SYSTEM_PROGRAM).unwrap(), false), + AccountMeta::new(self.inbox.0, false), + AccountMeta::new_readonly(process_authority_key, false), + AccountMeta::new(processed_message_account_key, false), + ]; + accounts.extend(ism_getter_account_metas); + accounts.extend([ + AccountMeta::new_readonly(Pubkey::from_str(SPL_NOOP).unwrap(), false), + AccountMeta::new_readonly(ism, false), + ]); - let jito_response = reqwest::Client::new() - .post("https://mainnet.block-engine.jito.wtf:443/api/v1/bundles") - .json(&jito_request_body) - .send() - .await - .map_err(ChainCommunicationError::from_other)?; - let jito_response_text = jito_response.text().await; - - tracing::info!( - ?signature, - ?jito_response_text, - "Got Jito response for sealevel transaction bundle" - ); + // Get the account metas required for the ISM.Verify instruction. + let ism_verify_account_metas = self + .get_ism_verify_account_metas(ism, metadata.into(), encoded_message) + .await?; + accounts.extend(ism_verify_account_metas); - let recent_blockhash = if transaction.uses_durable_nonce() { - self.provider - .rpc() - .get_latest_blockhash_with_commitment(CommitmentConfig::processed()) - .await? - } else { - *transaction.get_recent_blockhash() - }; - - for status_retry in 0..GET_STATUS_RETRIES { - let signature_statuses: Response>> = self - .provider - .rpc() - .get_signature_statuses(&[*signature]) - .await?; - let signature_status = signature_statuses.value.first().cloned().flatten(); - match signature_status { - Some(_) => return Ok(*signature), - None => { - if !self - .provider - .rpc() - .is_blockhash_valid(&recent_blockhash) - .await? - { - // Block hash is not found by some reason - break 'sending; - } else if cfg!(not(test)) - // Ignore sleep at last step. - && status_retry < GET_STATUS_RETRIES - { - // Retry twice a second - tokio::time::sleep(std::time::Duration::from_millis(500)).await; - continue; - } - } - } - } - } + // The recipient. + accounts.extend([AccountMeta::new_readonly(recipient, false)]); - Err(ChainCommunicationError::from_other( - solana_client::rpc_request::RpcError::ForUser( - "unable to confirm transaction. \ - This can happen in situations such as transaction expiration \ - and insufficient fee-payer funds" - .to_string(), - ), - )) + // Get account metas required for the Handle instruction + let handle_account_metas = self.get_handle_account_metas(message).await?; + accounts.extend(handle_account_metas); + + let process_instruction = Instruction { + program_id: self.program_id, + data: ixn_data, + accounts, + }; + + Ok(process_instruction) } async fn get_inbox(&self) -> ChainResult> { @@ -429,6 +378,12 @@ impl SealevelMailbox { .into_inner(); Ok(inbox) } + + fn get_payer(&self) -> ChainResult<&Keypair> { + self.payer + .as_ref() + .ok_or_else(|| ChainCommunicationError::SignerUnavailable) + } } impl HyperlaneContract for SealevelMailbox { @@ -508,133 +463,42 @@ impl Mailbox for SealevelMailbox { metadata: &[u8], _tx_gas_limit: Option, ) -> ChainResult { - let recipient: Pubkey = message.recipient.0.into(); - let mut encoded_message = vec![]; - message.write_to(&mut encoded_message).unwrap(); - - let payer = self - .payer - .as_ref() - .ok_or_else(|| ChainCommunicationError::SignerUnavailable)?; - - let mut instructions = Vec::with_capacity(3); - // Set the compute unit limit. - instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( - PROCESS_COMPUTE_UNITS, - )); - - // If we're using Jito, we need to send a tip to the Jito fee account. - // Otherwise, we need to set the compute unit price. - if self.use_jito() { - let tip: u64 = std::env::var("JITO_TIP_LAMPORTS") - .ok() - .and_then(|s| s.parse::().ok()) - .unwrap_or(PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX); - - // The tip is a standalone transfer to a Jito fee account. - // See https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#sendbundle. - instructions.push(solana_sdk::system_instruction::transfer( - &payer.pubkey(), - // A random Jito fee account, taken from the getFeeAccount RPC response: - // https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#gettipaccounts - &solana_sdk::pubkey!("DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh"), - tip, - )); - } // "processed" level commitment does not guarantee finality. // roughly 5% of blocks end up on a dropped fork. // However we don't want this function to be a bottleneck and there already // is retry logic in the agents. let commitment = CommitmentConfig::processed(); - let (process_authority_key, _process_authority_bump) = Pubkey::try_find_program_address( - mailbox_process_authority_pda_seeds!(&recipient), - &self.program_id, - ) - .ok_or_else(|| { - ChainCommunicationError::from_other_str( - "Could not find program address for process authority", - ) - })?; - let (processed_message_account_key, _processed_message_account_bump) = - Pubkey::try_find_program_address( - mailbox_processed_message_pda_seeds!(message.id()), - &self.program_id, - ) - .ok_or_else(|| { - ChainCommunicationError::from_other_str( - "Could not find program address for processed message account", - ) - })?; + let process_instruction = self.get_process_instruction(message, metadata).await?; - // Get the account metas required for the recipient.InterchainSecurityModule instruction. - let ism_getter_account_metas = self.get_ism_getter_account_metas(recipient).await?; - - // Get the recipient ISM. - let ism = self - .get_recipient_ism(recipient, ism_getter_account_metas.clone()) - .await?; - - let ixn = - hyperlane_sealevel_mailbox::instruction::Instruction::InboxProcess(InboxProcess { - metadata: metadata.to_vec(), - message: encoded_message.clone(), - }); - let ixn_data = ixn - .into_instruction_data() - .map_err(ChainCommunicationError::from_other)?; - - // Craft the accounts for the transaction. - let mut accounts: Vec = vec![ - AccountMeta::new_readonly(payer.pubkey(), true), - AccountMeta::new_readonly(Pubkey::from_str(SYSTEM_PROGRAM).unwrap(), false), - AccountMeta::new(self.inbox.0, false), - AccountMeta::new_readonly(process_authority_key, false), - AccountMeta::new(processed_message_account_key, false), - ]; - accounts.extend(ism_getter_account_metas); - accounts.extend([ - AccountMeta::new_readonly(Pubkey::from_str(SPL_NOOP).unwrap(), false), - AccountMeta::new_readonly(ism, false), - ]); - - // Get the account metas required for the ISM.Verify instruction. - let ism_verify_account_metas = self - .get_ism_verify_account_metas(ism, metadata.into(), encoded_message) + let tx = self + .provider + .rpc() + .build_estimated_tx_for_instruction( + process_instruction, + self.get_payer()?, + &*self.tx_submitter, + &*self.priority_fee_oracle, + ) .await?; - accounts.extend(ism_verify_account_metas); - // The recipient. - accounts.extend([AccountMeta::new_readonly(recipient, false)]); + tracing::info!(?tx, "Created sealevel transaction to process message"); - // Get account metas required for the Handle instruction - let handle_account_metas = self.get_handle_account_metas(message).await?; - accounts.extend(handle_account_metas); + let signature = self.tx_submitter.send_transaction(&tx, true).await?; - let inbox_instruction = Instruction { - program_id: self.program_id, - data: ixn_data, - accounts, - }; - instructions.push(inbox_instruction); - let recent_blockhash = self - .rpc() - .get_latest_blockhash_with_commitment(commitment) - .await?; + tracing::info!(?tx, ?signature, "Sealevel transaction sent"); - let txn = Transaction::new_signed_with_payer( - &instructions, - Some(&payer.pubkey()), - &[payer], - recent_blockhash, - ); + let send_instant = std::time::Instant::now(); - tracing::info!(?txn, "Created sealevel transaction to process message"); + // Wait for the transaction to be confirmed. + self.rpc().wait_for_transaction_confirmation(&tx).await?; - let signature = self.send_and_confirm_transaction(&txn).await?; - - tracing::info!(?txn, ?signature, "Sealevel transaction sent"); + // We expect time_to_confirm to fluctuate depending on the commitment level when submitting the + // tx, but still use it as a proxy for tx latency to help debug. + tracing::info!(?tx, ?signature, time_to_confirm=?send_instant.elapsed(), "Sealevel transaction confirmed"); + // TODO: not sure if this actually checks if the transaction was executed / reverted? + // Confirm the transaction. let executed = self .rpc() .confirm_transaction_with_commitment(&signature, commitment) @@ -655,10 +519,30 @@ impl Mailbox for SealevelMailbox { #[instrument(err, ret, skip(self))] async fn process_estimate_costs( &self, - _message: &HyperlaneMessage, - _metadata: &[u8], + message: &HyperlaneMessage, + metadata: &[u8], ) -> ChainResult { - // TODO use correct data upon integrating IGP support + // Getting a process instruction in Sealevel is a pretty expensive operation + // that involves some view calls. Consider reusing the instruction with subsequent + // calls to `process` to avoid this cost. + let process_instruction = self.get_process_instruction(message, metadata).await?; + + // The returned costs are unused at the moment - we simply want to perform a simulation to + // determine if the message will revert or not. + let _ = self + .rpc() + .get_estimated_costs_for_instruction( + process_instruction, + self.get_payer()?, + &*self.tx_submitter, + &*self.priority_fee_oracle, + ) + .await?; + + // TODO use correct data upon integrating IGP support. + // NOTE: providing a real gas limit here will result in accurately enforcing + // gas payments. Be careful rolling this out to not impact existing contracts + // that may not be paying for super accurate gas amounts. Ok(TxCostEstimate { gas_limit: U256::zero(), gas_price: FixedPointNumber::zero(), diff --git a/rust/main/chains/hyperlane-sealevel/src/priority_fee.rs b/rust/main/chains/hyperlane-sealevel/src/priority_fee.rs new file mode 100644 index 0000000000..2df395cce6 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/priority_fee.rs @@ -0,0 +1,218 @@ +use async_trait::async_trait; +use derive_new::new; +use hyperlane_core::{ChainCommunicationError, ChainResult}; +use reqwest::Client; +use serde::Deserialize; +use solana_sdk::{bs58, transaction::Transaction}; + +use crate::{HeliusPriorityFeeLevel, HeliusPriorityFeeOracleConfig}; + +/// A trait for fetching the priority fee for a transaction. +#[async_trait] +pub trait PriorityFeeOracle: Send + Sync { + /// Fetch the priority fee in microlamports for a transaction. + async fn get_priority_fee(&self, transaction: &Transaction) -> ChainResult; +} + +/// A priority fee oracle that returns a constant fee. +#[derive(Debug, Clone, new)] +pub struct ConstantPriorityFeeOracle { + fee: u64, +} + +#[async_trait] +impl PriorityFeeOracle for ConstantPriorityFeeOracle { + async fn get_priority_fee(&self, _transaction: &Transaction) -> ChainResult { + Ok(self.fee) + } +} + +/// A priority fee oracle that fetches the fee from the Helius API. +/// https://docs.helius.dev/solana-apis/priority-fee-api +#[derive(Debug, Clone)] +pub struct HeliusPriorityFeeOracle { + client: Client, + config: HeliusPriorityFeeOracleConfig, +} + +impl HeliusPriorityFeeOracle { + pub fn new(config: HeliusPriorityFeeOracleConfig) -> Self { + Self { + client: reqwest::Client::new(), + config, + } + } + + fn get_priority_fee_estimate_options(&self) -> serde_json::Value { + // It's an odd interface, but if using the Recommended fee level, the API requires `recommended: true`, + // otherwise it requires `priorityLevel: ""`. + + let (key, value) = match &self.config.fee_level { + HeliusPriorityFeeLevel::Recommended => ("recommended", serde_json::json!(true)), + level => ("priorityLevel", serde_json::json!(level)), + }; + + serde_json::json!({ + key: value, + "transactionEncoding": "base58", + }) + } +} + +#[async_trait] +impl PriorityFeeOracle for HeliusPriorityFeeOracle { + async fn get_priority_fee(&self, transaction: &Transaction) -> ChainResult { + let base58_tx = bs58::encode( + bincode::serialize(transaction).map_err(ChainCommunicationError::from_other)?, + ) + .into_string(); + + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "id": "1", + "method": "getPriorityFeeEstimate", + "params": [ + { + "transaction": base58_tx, + "options": self.get_priority_fee_estimate_options(), + } + ], + }); + + let response = self + .client + .post(self.config.url.clone()) + .json(&request_body) + .send() + .await + .map_err(ChainCommunicationError::from_other)?; + + let response: JsonRpcResult = response + .json() + .await + .map_err(ChainCommunicationError::from_other)?; + + tracing::debug!(?response, "Fetched priority fee from Helius API"); + + let fee = response.result.priority_fee_estimate.round() as u64; + + Ok(fee) + } +} + +/// The result of a JSON-RPC request to the Helius API. +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct JsonRpcResult { + #[allow(dead_code)] + jsonrpc: String, + #[allow(dead_code)] + id: String, + result: T, +} + +/// The result of a `getPriorityFeeEstimate` request to the Helius API. +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +struct GetPriorityFeeEstimateResult { + priority_fee_estimate: f64, +} + +#[cfg(test)] +mod test { + use solana_sdk::{bs58, transaction::Transaction}; + + use crate::{ + priority_fee::{HeliusPriorityFeeOracle, PriorityFeeOracle}, + HeliusPriorityFeeLevel, HeliusPriorityFeeOracleConfig, + }; + + use super::{GetPriorityFeeEstimateResult, JsonRpcResult}; + + #[tokio::test] + async fn test_helius_get_priority_fee() { + let helius_url = if let Ok(url) = std::env::var("HELIUS_URL") { + url + } else { + // Skip test if HELIUS_URL is not set + return; + }; + + let oracle = super::HeliusPriorityFeeOracle::new(super::HeliusPriorityFeeOracleConfig { + url: url::Url::parse(&helius_url).unwrap(), + fee_level: super::HeliusPriorityFeeLevel::Medium, + }); + + // Example process transaction + // https://solscan.io/tx/W9fXtRD8mPkkUmuoLi9QxSCgFuy32rCVa8kfxtPjWXWRH2D1AWzuDEGuvexWGyWhQDXnEmaADZMeYu5RVjWZyAB + let process_tx_base58 = "BPBE2dE4sPJX3nm4svEZ181qBfX9yvUp5H67uTt3aqRGtC6a77hW5vrQk9zJ3KkNuK63KoJCeqp1kkFwsbF5KL1UHf5Hrj8GXpiRxmKD8NybEZUWhjdVW9azMxJdnxxiFqH7wFQtZGkQxhx6oJz1qi5Xc64LEbPJEwSTAp5US1VCnnhWGRqJ297kvS8hWaVLuUxr4jEqYNG2LSusXZmzABBqEvRv753PBxcKiBE2moo9VKZ8n3ai6rmQGnSzsoAfwnjCx6iUdNSWqpYFHcq2xhMXJx8US5kv837KsT5tKQBbujsWUoRGGJ8vkmm7RJSYyR3DYEMa5ira9fiDwnK5qP3EgP2hrG73YYBxZ9naRrYzHG2GiEGWEUgNPHaUtK3JsbjTLiNjyZU8ERTdMxi4rBLppREJfHDWYUNgN9hTL81LYv4YoJY3UUTQphzT268f6oZoiyavngb8t3Lq8pbyc3gPiw7AcWXmn2ERDAcHvS59AaoxxcwZyn8UWUdynwCzvNbWhb97qVHSzBY1S79sxHFuqyBhbbD5YhkMhFGLjPUEDvncxE2hLt9iQCQaEQzCNRMmnZw7yJ1YxoKDKfmUTXJ6rmT4p2pz7f8x4jJwQ2pC2YxobcfHrNvD7929vXSvpomyZmaEXYAN2bqGBUe2KazpnobVCwafjKMVN4AaTJRMTXi92VKuShuKJEuZo9ZM7TScEqRZC5hLFU8SbCdASEUoQjpDzivUf1m9gQtT2ob5FPwJzcuZpqTWgixd59BRHTB1L5c4fDvtYr1QJFpJRN4DsXGryK4eTMu2oAs3imGpg1rHRLpuBTbcrchEivz7bD17bBj8VeHogfkPcehD9yaHzmYPRF47aWZ52GSFSSpc5kJRRQyghUKNPFBnycLGAbfkRYDdVzUgdrr3CNYksJCu45TChg54tMWWwrqSD3k5RPv7A6bXbAH4PzW83vzE2vGJFYpwUgNEnjuA1rVnYJHXsFdWBrqrsz3UvdTs5kUxyoxjNNKvoXSaTeXMXEt1HUdmQ3sw1dW9wRkYdHwWzksM6n7P7MLnVY6qv3BVUpJiX4K355BXhMhyozzcBQX2vvyC7J8UxPBofMrBRVtbMsXmfp3sphos1pog6wpN2MiEaJqm6KK5yQguANnQzN8mK7MREkjYXtCnczf84CrcHqpp2onQUaR4TPn8zCPVAxY4HVkCoDWTwKj8Am9M4L3a7wmF37epgKnQuypTH7dqbJPRTALe7tndrtvJCuoTFP8wPXQXxvwnBPXeLmhK9E2mpskTA33KfqvVBu4R5SFYNtGoKbvuHaDf83Lf2xx1YPUogXuEWZMx5zcaHWMmvutpfdnPe3Rb7GL4hPVKj4t9MNgiAg3QbjaR9nqYBUPT4kUpxVCJWEadDVh5pgLwnkg4DJ5ArNfgH5"; + let process_tx_bytes = bs58::decode(process_tx_base58).into_vec().unwrap(); + let transaction: Transaction = bincode::deserialize(&process_tx_bytes).unwrap(); + + oracle.get_priority_fee(&transaction).await.unwrap(); + } + + #[test] + fn test_helius_get_priority_fee_estimate_options_ser() { + let get_oracle = |fee_level| { + HeliusPriorityFeeOracle::new(HeliusPriorityFeeOracleConfig { + url: url::Url::parse("http://localhost:8080").unwrap(), + fee_level, + }) + }; + + // When the fee level is Recommended, ensure `recommended` is set to true + let oracle = get_oracle(HeliusPriorityFeeLevel::Recommended); + + let options = oracle.get_priority_fee_estimate_options(); + let expected = serde_json::json!({ + "recommended": true, + "transactionEncoding": "base58", + }); + assert_eq!(options, expected); + + // When the fee level is not Recommended, ensure `priorityLevel` is set + let oracle = get_oracle(HeliusPriorityFeeLevel::Medium); + + let options = oracle.get_priority_fee_estimate_options(); + let expected = serde_json::json!({ + "priorityLevel": "Medium", + "transactionEncoding": "base58", + }); + assert_eq!(options, expected); + + // Ensure the serialization of HeliusPriorityFeeLevel is PascalCase, + // as required by the API https://docs.helius.dev/solana-apis/priority-fee-api#helius-priority-fee-api + let serialized = serde_json::json!([ + HeliusPriorityFeeLevel::Recommended, + HeliusPriorityFeeLevel::Min, + HeliusPriorityFeeLevel::Low, + HeliusPriorityFeeLevel::Medium, + HeliusPriorityFeeLevel::High, + HeliusPriorityFeeLevel::VeryHigh, + HeliusPriorityFeeLevel::UnsafeMax, + ]); + let expected = serde_json::json!([ + "Recommended", + "Min", + "Low", + "Medium", + "High", + "VeryHigh", + "UnsafeMax" + ]); + assert_eq!(serialized, expected); + } + + #[test] + fn test_helius_get_priority_fee_estimate_deser() { + let text = r#"{"jsonrpc":"2.0","result":{"priorityFeeEstimate":1000.0},"id":"1"}"#; + let response: JsonRpcResult = + serde_json::from_str(text).unwrap(); + + let expected = GetPriorityFeeEstimateResult { + priority_fee_estimate: 1000.0, + }; + assert_eq!(response.result, expected); + } +} diff --git a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs index 59adb671f3..f9b08170a5 100644 --- a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs +++ b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs @@ -2,12 +2,18 @@ use base64::Engine; use borsh::{BorshDeserialize, BorshSerialize}; use serializable_account_meta::{SerializableAccountMeta, SimulationReturnData}; use solana_client::{ - nonblocking::rpc_client::RpcClient, rpc_config::RpcBlockConfig, - rpc_config::RpcProgramAccountsConfig, rpc_config::RpcTransactionConfig, rpc_response::Response, + nonblocking::rpc_client::RpcClient, + rpc_client::SerializableTransaction, + rpc_config::{ + RpcBlockConfig, RpcProgramAccountsConfig, RpcSendTransactionConfig, + RpcSimulateTransactionConfig, RpcTransactionConfig, + }, + rpc_response::{Response, RpcSimulateTransactionResult}, }; use solana_sdk::{ account::Account, commitment_config::CommitmentConfig, + compute_budget::ComputeBudgetInstruction, hash::Hash, instruction::{AccountMeta, Instruction}, message::Message, @@ -17,16 +23,33 @@ use solana_sdk::{ }; use solana_transaction_status::{ EncodedConfirmedTransactionWithStatusMeta, TransactionStatus, UiConfirmedBlock, - UiReturnDataEncoding, UiTransactionEncoding, UiTransactionReturnData, + UiReturnDataEncoding, UiTransactionEncoding, }; use hyperlane_core::{ChainCommunicationError, ChainResult, U256}; -use crate::error::HyperlaneSealevelError; +use crate::{ + error::HyperlaneSealevelError, priority_fee::PriorityFeeOracle, + tx_submitter::TransactionSubmitter, +}; + +const COMPUTE_UNIT_MULTIPLIER_NUMERATOR: u32 = 11; +const COMPUTE_UNIT_MULTIPLIER_DENOMINATOR: u32 = 10; + +const PRIORITY_FEE_MULTIPLIER_NUMERATOR: u64 = 110; +const PRIORITY_FEE_MULTIPLIER_DENOMINATOR: u64 = 100; + +pub struct SealevelTxCostEstimate { + compute_units: u32, + compute_unit_price_micro_lamports: u64, +} pub struct SealevelRpcClient(RpcClient); impl SealevelRpcClient { + /// The max amount of compute units for a transaction. + const MAX_COMPUTE_UNITS: u32 = 1_400_000; + pub fn new(rpc_endpoint: String) -> Self { Self(RpcClient::new_with_commitment( rpc_endpoint, @@ -199,16 +222,74 @@ impl SealevelRpcClient { .map_err(ChainCommunicationError::from_other) } - pub async fn send_and_confirm_transaction( + pub async fn send_transaction( &self, transaction: &Transaction, + skip_preflight: bool, ) -> ChainResult { self.0 - .send_and_confirm_transaction(transaction) + .send_transaction_with_config( + transaction, + RpcSendTransactionConfig { + skip_preflight, + ..Default::default() + }, + ) .await .map_err(ChainCommunicationError::from_other) } + /// Polls the RPC until the transaction is confirmed or the blockhash + /// expires. + /// Standalone logic stolen from Solana's non-blocking client, + /// decoupled from the sending of a transaction. + pub async fn wait_for_transaction_confirmation( + &self, + transaction: &impl SerializableTransaction, + ) -> ChainResult<()> { + let signature = transaction.get_signature(); + + const GET_STATUS_RETRIES: usize = usize::MAX; + + let recent_blockhash = if transaction.uses_durable_nonce() { + self.get_latest_blockhash_with_commitment(CommitmentConfig::processed()) + .await? + } else { + *transaction.get_recent_blockhash() + }; + + for status_retry in 0..GET_STATUS_RETRIES { + let signature_statuses: Response>> = + self.get_signature_statuses(&[*signature]).await?; + let signature_status = signature_statuses.value.first().cloned().flatten(); + match signature_status { + Some(_) => return Ok(()), + None => { + if !self.is_blockhash_valid(&recent_blockhash).await? { + // Block hash is not found by some reason + break; + } else if cfg!(not(test)) + // Ignore sleep at last step. + && status_retry < GET_STATUS_RETRIES + { + // Retry twice a second + tokio::time::sleep(std::time::Duration::from_millis(500)).await; + continue; + } + } + } + } + + Err(ChainCommunicationError::from_other( + solana_client::rpc_request::RpcError::ForUser( + "unable to confirm transaction. \ + This can happen in situations such as transaction expiration \ + and insufficient fee-payer funds" + .to_string(), + ), + )) + } + /// Simulates an instruction, and attempts to deserialize it into a T. /// If no return data at all was returned, returns Ok(None). /// If some return data was returned but deserialization was unsuccessful, @@ -227,9 +308,9 @@ impl SealevelRpcClient { Some(&payer.pubkey()), &recent_blockhash, )); - let return_data = self.simulate_transaction(&transaction).await?; + let simulation = self.simulate_transaction(&transaction).await?; - if let Some(return_data) = return_data { + if let Some(return_data) = simulation.return_data { let bytes = match return_data.data.1 { UiReturnDataEncoding::Base64 => base64::engine::general_purpose::STANDARD .decode(return_data.data.0) @@ -245,19 +326,194 @@ impl SealevelRpcClient { Ok(None) } - async fn simulate_transaction( + pub async fn simulate_transaction( &self, transaction: &Transaction, - ) -> ChainResult> { - let return_data = self + ) -> ChainResult { + let result = self .0 - .simulate_transaction(transaction) + .simulate_transaction_with_config( + transaction, + RpcSimulateTransactionConfig { + sig_verify: false, + replace_recent_blockhash: true, + ..Default::default() + }, + ) .await .map_err(ChainCommunicationError::from_other)? - .value - .return_data; + .value; + + Ok(result) + } + + /// Gets the estimated costs for a given instruction. + pub async fn get_estimated_costs_for_instruction( + &self, + instruction: Instruction, + payer: &Keypair, + tx_submitter: &dyn TransactionSubmitter, + priority_fee_oracle: &dyn PriorityFeeOracle, + ) -> ChainResult { + // Build a transaction that sets the max compute units and a dummy compute unit price. + // This is used for simulation to get the actual compute unit limit. We set dummy values + // for the compute unit limit and price because we want to include the instructions that + // set these in the cost estimate. + let simulation_tx = self + .create_transaction_for_instruction( + Self::MAX_COMPUTE_UNITS, + 0, + instruction.clone(), + payer, + tx_submitter, + false, + ) + .await?; + + let simulation_result = self.simulate_transaction(&simulation_tx).await?; + + // If there was an error in the simulation result, return an error. + if simulation_result.err.is_some() { + tracing::error!(?simulation_result, "Got simulation result for transaction"); + return Err(ChainCommunicationError::from_other_str( + format!("Error in simulation result: {:?}", simulation_result.err).as_str(), + )); + } else { + tracing::debug!(?simulation_result, "Got simulation result for transaction"); + } + + // Get the compute units used in the simulation result, requiring + // that it is greater than 0. + let simulation_compute_units: u32 = simulation_result + .units_consumed + .unwrap_or_default() + .try_into() + .map_err(ChainCommunicationError::from_other)?; + if simulation_compute_units == 0 { + return Err(ChainCommunicationError::from_other_str( + "Empty or zero compute units returned in simulation result", + )); + } + + // Bump the compute units to be conservative + let simulation_compute_units = Self::MAX_COMPUTE_UNITS.min( + (simulation_compute_units * COMPUTE_UNIT_MULTIPLIER_NUMERATOR) + / COMPUTE_UNIT_MULTIPLIER_DENOMINATOR, + ); + + let mut priority_fee = priority_fee_oracle.get_priority_fee(&simulation_tx).await?; + + if let Ok(max_priority_fee) = std::env::var("SVM_MAX_PRIORITY_FEE") { + let max_priority_fee = max_priority_fee.parse()?; + if priority_fee > max_priority_fee { + tracing::info!( + priority_fee, + max_priority_fee, + "Estimated priority fee is very high, capping to a max", + ); + priority_fee = max_priority_fee; + } + } + + // Bump the priority fee to be conservative + let priority_fee = (priority_fee * PRIORITY_FEE_MULTIPLIER_NUMERATOR) + / PRIORITY_FEE_MULTIPLIER_DENOMINATOR; + + Ok(SealevelTxCostEstimate { + compute_units: simulation_compute_units, + compute_unit_price_micro_lamports: priority_fee, + }) + } + + /// Builds a transaction with estimated costs for a given instruction. + pub async fn build_estimated_tx_for_instruction( + &self, + instruction: Instruction, + payer: &Keypair, + tx_submitter: &dyn TransactionSubmitter, + priority_fee_oracle: &dyn PriorityFeeOracle, + ) -> ChainResult { + // Get the estimated costs for the instruction. + let SealevelTxCostEstimate { + compute_units, + compute_unit_price_micro_lamports, + } = self + .get_estimated_costs_for_instruction( + instruction.clone(), + payer, + tx_submitter, + priority_fee_oracle, + ) + .await?; + + tracing::info!( + ?compute_units, + ?compute_unit_price_micro_lamports, + "Got compute units and compute unit price / priority fee for transaction" + ); + + // Build the final transaction with the correct compute unit limit and price. + let tx = self + .create_transaction_for_instruction( + compute_units, + compute_unit_price_micro_lamports, + instruction, + payer, + tx_submitter, + true, + ) + .await?; + + Ok(tx) + } + + /// Creates a transaction for a given instruction, compute unit limit, and compute unit price. + /// If `sign` is true, the transaction will be signed. + pub async fn create_transaction_for_instruction( + &self, + compute_unit_limit: u32, + compute_unit_price_micro_lamports: u64, + instruction: Instruction, + payer: &Keypair, + tx_submitter: &dyn TransactionSubmitter, + sign: bool, + ) -> ChainResult { + let instructions = vec![ + // Set the compute unit limit. + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + // Set the priority fee / tip + tx_submitter.get_priority_fee_instruction( + compute_unit_price_micro_lamports, + compute_unit_limit.into(), + &payer.pubkey(), + ), + instruction, + ]; + + let tx = if sign { + // Getting the finalized blockhash eliminates the chance the blockhash + // gets reorged out, causing the tx to be invalid. The tradeoff is this + // will cause the tx to expire in about 47 seconds (instead of the typical 60). + let recent_blockhash = self + .get_latest_blockhash_with_commitment(CommitmentConfig::finalized()) + .await + .map_err(ChainCommunicationError::from_other)?; + + Transaction::new_signed_with_payer( + &instructions, + Some(&payer.pubkey()), + &[payer], + recent_blockhash, + ) + } else { + Transaction::new_unsigned(Message::new(&instructions, Some(&payer.pubkey()))) + }; + + Ok(tx) + } - Ok(return_data) + pub fn url(&self) -> String { + self.0.url() } } diff --git a/rust/main/chains/hyperlane-sealevel/src/trait_builder.rs b/rust/main/chains/hyperlane-sealevel/src/trait_builder.rs index e0b7c5cb37..13cc0b90a4 100644 --- a/rust/main/chains/hyperlane-sealevel/src/trait_builder.rs +++ b/rust/main/chains/hyperlane-sealevel/src/trait_builder.rs @@ -1,6 +1,12 @@ use hyperlane_core::{config::OperationBatchConfig, ChainCommunicationError, NativeToken}; +use serde::Serialize; use url::Url; +use crate::{ + priority_fee::{ConstantPriorityFeeOracle, HeliusPriorityFeeOracle, PriorityFeeOracle}, + tx_submitter::{JitoTransactionSubmitter, RpcTransactionSubmitter, TransactionSubmitter}, +}; + /// Sealevel connection configuration #[derive(Debug, Clone)] pub struct ConnectionConf { @@ -10,6 +16,10 @@ pub struct ConnectionConf { pub operation_batch: OperationBatchConfig, /// Native token and its denomination pub native_token: NativeToken, + /// Priority fee oracle configuration + pub priority_fee_oracle: PriorityFeeOracleConfig, + /// Transaction submitter configuration + pub transaction_submitter: TransactionSubmitterConfig, } /// An error type when parsing a connection configuration. @@ -23,6 +33,106 @@ pub enum ConnectionConfError { InvalidConnectionUrl(String, url::ParseError), } +/// Configuration to of how the priority fee should be determined +#[derive(Debug, Clone)] +pub enum PriorityFeeOracleConfig { + /// A constant value, in micro lamports + Constant(u64), + /// A Helius priority fee oracle + Helius(HeliusPriorityFeeOracleConfig), +} + +impl Default for PriorityFeeOracleConfig { + fn default() -> Self { + PriorityFeeOracleConfig::Constant(0) + } +} + +impl PriorityFeeOracleConfig { + /// Create a new priority fee oracle from the configuration + pub fn create_oracle(&self) -> Box { + match self { + PriorityFeeOracleConfig::Constant(fee) => { + Box::new(ConstantPriorityFeeOracle::new(*fee)) + } + PriorityFeeOracleConfig::Helius(config) => { + Box::new(HeliusPriorityFeeOracle::new(config.clone())) + } + } + } +} + +/// Configuration for the Helius priority fee oracle +#[derive(Debug, Clone)] +pub struct HeliusPriorityFeeOracleConfig { + /// The Helius URL to use + pub url: Url, + /// The fee level to use + pub fee_level: HeliusPriorityFeeLevel, +} + +/// The priority fee level to use +#[derive(Debug, Clone, Serialize, Default)] +pub enum HeliusPriorityFeeLevel { + /// 50th percentile, but a floor of 10k microlamports. + /// The floor results in a staked Helius connection being used. (https://docs.helius.dev/guides/sending-transactions-on-solana#staked-connections) + #[default] + Recommended, + /// 0th percentile + Min, + /// 10th percentile + Low, + /// 50th percentile + Medium, + /// 75th percentile + High, + /// 90th percentile + VeryHigh, + /// 100th percentile + UnsafeMax, +} + +/// Configuration for the transaction submitter +#[derive(Debug, Clone)] +pub enum TransactionSubmitterConfig { + /// Use the RPC transaction submitter + Rpc { + /// The URL to use. If not provided, a default RPC URL will be used + url: Option, + }, + /// Use the Jito transaction submitter + Jito { + /// The URL to use. If not provided, a default Jito URL will be used + url: Option, + }, +} + +impl Default for TransactionSubmitterConfig { + fn default() -> Self { + TransactionSubmitterConfig::Rpc { url: None } + } +} + +impl TransactionSubmitterConfig { + /// Create a new transaction submitter from the configuration + pub fn create_submitter(&self, default_rpc_url: String) -> Box { + match self { + TransactionSubmitterConfig::Rpc { url } => Box::new(RpcTransactionSubmitter::new( + url.clone().unwrap_or(default_rpc_url), + )), + TransactionSubmitterConfig::Jito { url } => { + // Default to a bundle-only URL (i.e. revert protected) + Box::new(JitoTransactionSubmitter::new(url.clone().unwrap_or_else( + || { + "https://mainnet.block-engine.jito.wtf/api/v1/transactions?bundleOnly=true" + .to_string() + }, + ))) + } + } + } +} + #[derive(thiserror::Error, Debug)] #[error(transparent)] struct SealevelNewConnectionError(#[from] anyhow::Error); diff --git a/rust/main/chains/hyperlane-sealevel/src/tx_submitter.rs b/rust/main/chains/hyperlane-sealevel/src/tx_submitter.rs new file mode 100644 index 0000000000..c7468d0f24 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/tx_submitter.rs @@ -0,0 +1,115 @@ +use async_trait::async_trait; +use hyperlane_core::ChainResult; +use solana_sdk::{ + compute_budget::ComputeBudgetInstruction, instruction::Instruction, pubkey::Pubkey, + signature::Signature, transaction::Transaction, +}; + +use crate::SealevelRpcClient; + +/// A trait for submitting transactions to the chain. +#[async_trait] +pub trait TransactionSubmitter: Send + Sync { + /// Get the instruction to set the compute unit price. + fn get_priority_fee_instruction( + &self, + compute_unit_price_micro_lamports: u64, + compute_units: u64, + payer: &Pubkey, + ) -> Instruction; + + /// Send a transaction to the chain. + async fn send_transaction( + &self, + transaction: &Transaction, + skip_preflight: bool, + ) -> ChainResult; +} + +/// A transaction submitter that uses the vanilla RPC to submit transactions. +#[derive(Debug)] +pub struct RpcTransactionSubmitter { + rpc_client: SealevelRpcClient, +} + +impl RpcTransactionSubmitter { + pub fn new(url: String) -> Self { + Self { + rpc_client: SealevelRpcClient::new(url), + } + } +} + +#[async_trait] +impl TransactionSubmitter for RpcTransactionSubmitter { + fn get_priority_fee_instruction( + &self, + compute_unit_price_micro_lamports: u64, + _compute_units: u64, + _payer: &Pubkey, + ) -> Instruction { + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price_micro_lamports) + } + + async fn send_transaction( + &self, + transaction: &Transaction, + skip_preflight: bool, + ) -> ChainResult { + self.rpc_client + .send_transaction(transaction, skip_preflight) + .await + } +} + +/// A transaction submitter that uses the Jito API to submit transactions. +#[derive(Debug)] +pub struct JitoTransactionSubmitter { + rpc_client: SealevelRpcClient, +} + +impl JitoTransactionSubmitter { + /// The minimum tip to include in a transaction. + /// From https://docs.jito.wtf/lowlatencytxnsend/#sendtransaction + const MINIMUM_TIP_LAMPORTS: u64 = 1000; + + pub fn new(url: String) -> Self { + Self { + rpc_client: SealevelRpcClient::new(url), + } + } +} + +#[async_trait] +impl TransactionSubmitter for JitoTransactionSubmitter { + fn get_priority_fee_instruction( + &self, + compute_unit_price_micro_lamports: u64, + compute_units: u64, + payer: &Pubkey, + ) -> Instruction { + // Divide by 1_000_000 to convert from microlamports to lamports. + let tip_lamports = (compute_units * compute_unit_price_micro_lamports) / 1_000_000; + let tip_lamports = tip_lamports.max(Self::MINIMUM_TIP_LAMPORTS); + + // The tip is a standalone transfer to a Jito fee account. + // See https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#sendbundle. + solana_sdk::system_instruction::transfer( + payer, + // A random Jito fee account, taken from the getFeeAccount RPC response: + // https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#gettipaccounts + &solana_sdk::pubkey!("DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh"), + tip_lamports, + ) + } + + async fn send_transaction( + &self, + transaction: &Transaction, + skip_preflight: bool, + ) -> ChainResult { + self.rpc_client + .send_transaction(transaction, skip_preflight) + .await + } +} diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index bb97daa396..77ec76fbd9 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -34,7 +34,7 @@ "interchainAccountIsm": "0xd766e7C7517f2d0D92754b2fe4aE7AdEf7bDEC3e", "interchainAccountRouter": "0x25C87e735021F72d8728438C2130b02E3141f2cb", "interchainGasPaymaster": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", - "interchainSecurityModule": "0x7115c77E844E301693d78F1B19e796083eB0b680", + "interchainSecurityModule": "0xd3fA56EDc496f986df5D2464E4C2c6027F8b4cEf", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x811808Dd29ba8B0FC6C0ec0b5537035E59745162", @@ -100,7 +100,7 @@ "interchainAccountIsm": "0x2A7574358Ec53522CE2452887661AB4c86F7d400", "interchainAccountRouter": "0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6", "interchainGasPaymaster": "0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22", - "interchainSecurityModule": "0xB51De3e8BCE366a871d5ba631ACa843D18d9Bc60", + "interchainSecurityModule": "0xe99C998dd9823B9b713A100fB885dd192C0d86DA", "mailbox": "0x979Ca5202784112f4738403dBec5D0F3B9daabB9", "merkleTreeHook": "0x748040afB89B8FdBb992799808215419d36A0930", "name": "arbitrum", @@ -172,7 +172,7 @@ "interchainAccountIsm": "0x27a3233c05C1Df7c163123301D14bE9349E3Cb48", "interchainAccountRouter": "0xa82a0227e6d6db53AF4B264A852bfF91C6504a51", "interchainGasPaymaster": "0x95519ba800BBd0d34eeAE026fEc620AD978176C0", - "interchainSecurityModule": "0xEc016e4DB2ca7EdB65F40AEF59DdFe12a28344ed", + "interchainSecurityModule": "0xFf2139af114d1D43C7348CA7471e08c7B31213A3", "mailbox": "0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6", "merkleTreeHook": "0x84eea61D679F42D92145fA052C89900CBAccE95A", "name": "avalanche", @@ -245,7 +245,7 @@ "interchainAccountIsm": "0x223F7D3f27E6272266AE4B5B91Fd5C7A2d798cD8", "interchainAccountRouter": "0x4767D22117bBeeb295413000B620B93FD8522d53", "interchainGasPaymaster": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", - "interchainSecurityModule": "0x4EC3B7A1E41032C7b557fBb5c7FEbB255D23d41E", + "interchainSecurityModule": "0x22c3D036C518A3953c57Ec3101b404a78158b7e4", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x19dc38aeae620380430C200a6E990D5Af5480117", "name": "base", @@ -316,7 +316,7 @@ "interchainAccountIsm": "0xe93f2f409ad8B5000431D234472973fe848dcBEC", "interchainAccountRouter": "0x2f4Eb04189e11Af642237Da62d163Ab714614498", "interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", - "interchainSecurityModule": "0xdc01bf0D464460bD383B5C81d5962451204ec28b", + "interchainSecurityModule": "0xff226D43F30B95Fac99D225E6aD36f308ff03d7A", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", "name": "blast", @@ -384,7 +384,7 @@ "interchainAccountIsm": "0x451dF8AB0936D85526D816f0b4dCaDD934A034A4", "interchainAccountRouter": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "interchainGasPaymaster": "0x62B7592C1B6D1E43f4630B8e37f4377097840C05", - "interchainSecurityModule": "0x6a32F3789Ba8880742d1fB6Cb51aed5EcfdE702C", + "interchainSecurityModule": "0xD94FA19BaC0A4f8Aa14D4ccB4B7A7Efb777F0A1e", "mailbox": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", "merkleTreeHook": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", "name": "bob", @@ -450,7 +450,7 @@ "interchainAccountIsm": "0x9e22945bE593946618383B108CC5bce09eBA4C26", "interchainAccountRouter": "0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1", "interchainGasPaymaster": "0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451", - "interchainSecurityModule": "0x0c461142ac54Fa4d24Fe5Ff6643A8386d2C03b29", + "interchainSecurityModule": "0x8ca30D8d1406B820b411dD1799fAa2A5E15a9D93", "mailbox": "0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4", "merkleTreeHook": "0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26", "name": "bsc", @@ -531,7 +531,7 @@ "interchainAccountIsm": "0xB732c83aeE29596E3163Da2260710eAB67Bc0B29", "interchainAccountRouter": "0x27a6cAe33378bB6A6663b382070427A01fc9cB37", "interchainGasPaymaster": "0x571f1435613381208477ac5d6974310d88AC7cB7", - "interchainSecurityModule": "0x324fedE5dba4729760514913bfD29f626F487e35", + "interchainSecurityModule": "0x0df8056AB4fd95D7c8f848BcF95d63b76F6bFA04", "mailbox": "0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb", "merkleTreeHook": "0x04dB778f05854f26E67e0a66b740BBbE9070D366", "name": "celo", @@ -596,7 +596,7 @@ "interchainAccountIsm": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", "interchainAccountRouter": "0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0x53D92225b49932471E6CA7bf1089203e49f5E51E", + "interchainSecurityModule": "0xB8508EecB14dd8d3762782eefC1ead0E92D89Ea5", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "cheesechain", @@ -659,7 +659,7 @@ "from": 4842212 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x3203B23145Cc21f6ba1c9AA49401fa66fBDB113E", + "interchainSecurityModule": "0x18250E686438602607205154288f160065d5F600", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "cyber", @@ -726,7 +726,7 @@ "from": 23783929 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xf0bE03F3176EA2dEA8b614C5695EF0eF795e79eF", + "interchainSecurityModule": "0x7fc28AE86f109B1F2f2aeCb9aDFaFF10A5440E02", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "degenchain", @@ -785,7 +785,7 @@ "index": { "from": 1, "mode": "sequence", - "chunk": 100 + "chunk": 20 }, "interchainGasPaymaster": "ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK", "mailbox": "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", @@ -839,7 +839,7 @@ "interchainAccountIsm": "0xCeafc098e5c3c7768b9229Be2FEC275862A81Abd", "interchainAccountRouter": "0xed9a722c543883FB7e07E78F3879762DE09eA7D5", "interchainGasPaymaster": "0xB30EAB08aa87138D57168D0e236850A530f49921", - "interchainSecurityModule": "0xC4F35559a1FBD1ACb7Ba88cEdC157754477FC047", + "interchainSecurityModule": "0x99d4146DC4910e3881b63C3471198F3Cb6aBAc52", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xC831271c1fB212012811a91Dd43e5926C1020563", "name": "endurance", @@ -910,7 +910,7 @@ "interchainAccountIsm": "0x292C614ED53DaaDBf971521bc2C652d1ca51cB47", "interchainAccountRouter": "0x5E532F7B610618eE73C2B462978e94CB1F7995Ce", "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611", - "interchainSecurityModule": "0xcFF5f9d69343f4200100dbA755C794012518Ed38", + "interchainSecurityModule": "0x8C3c9e95091A504b28902dF319F4cE8Bd77D2f59", "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239", "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA", "name": "ethereum", @@ -982,7 +982,7 @@ "interchainAccountIsm": "0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF", "interchainAccountRouter": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", "interchainGasPaymaster": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", - "interchainSecurityModule": "0x7D24f9d82BCC10ab4A02F48D2Aae1AD00Ea47dC3", + "interchainSecurityModule": "0xd0C1FC10c922434452DAc6DA518Fe91582CF2407", "mailbox": "0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3", "merkleTreeHook": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", "name": "fraxtal", @@ -1050,7 +1050,7 @@ "interchainAccountIsm": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", "interchainAccountRouter": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", "interchainGasPaymaster": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", - "interchainSecurityModule": "0xff36B9B99338CAe60fd794741B5e02a3D92254C2", + "interchainSecurityModule": "0xE62f55C6760CE12688Ae4C4FDBf2Cb7f08C468A6", "mailbox": "0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696", "merkleTreeHook": "0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f", "name": "fusemainnet", @@ -1124,7 +1124,7 @@ "interchainAccountIsm": "0x07E2062A1bC66a2C1d05cb5C3870a4AF86e0056E", "interchainAccountRouter": "0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064", "interchainGasPaymaster": "0xDd260B99d302f0A3fF885728c086f729c06f227f", - "interchainSecurityModule": "0x8fC6e2011050ccC99B7f8460C23Cc85402D78e85", + "interchainSecurityModule": "0x93BC454D1E8049a286EC84E75e628AB23e5E61f8", "mailbox": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "name": "gnosis", @@ -1195,7 +1195,7 @@ "interchainAccountIsm": "0x708E002637792FDC031E6B62f23DD60014AC976a", "interchainAccountRouter": "0xfB8cea1c7F45608Da30655b50bbF355D123A4358", "interchainGasPaymaster": "0x19dc38aeae620380430C200a6E990D5Af5480117", - "interchainSecurityModule": "0xaee1F6685b0495cc2bFa4F5E5c096466fC9873b8", + "interchainSecurityModule": "0xe6a1cA2c655FD86E5bD0307b1577f11e031E4691", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65", "name": "inevm", @@ -1285,6 +1285,9 @@ } ], "rpcUrls": [ + { + "http": "https://injective-rpc.publicnode.com:443" + }, { "http": "https://sentry.tm.injective.network:443" } @@ -1323,7 +1326,7 @@ "from": 14616307 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x66c540f566a52F46931FaBbcED90d7d669da7303", + "interchainSecurityModule": "0xc11B492a516F839F3f05D0CE8f79E51Bf65a66E9", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "kroma", @@ -1396,7 +1399,7 @@ "interchainAccountIsm": "0xdcA646C56E7768DD11654956adE24bfFf9Ba4893", "interchainAccountRouter": "0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C", "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", - "interchainSecurityModule": "0x93c9fEeC4Dd4935a65029A4BF03fB6df1130FBB9", + "interchainSecurityModule": "0x73171e4CAAe12ae90EFA6f5D33818021b2C8F80F", "mailbox": "0x02d16BC51af6BfD153d67CA61754cF912E82C4d9", "merkleTreeHook": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", "name": "linea", @@ -1467,7 +1470,7 @@ "from": 4195553 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xDbe54a99c9550BF6EB7F510b62cfe2d5E74F072e", + "interchainSecurityModule": "0x629c7Bf8586256624f5D925360F4382defa04eBf", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "lisk", @@ -1531,7 +1534,7 @@ "from": 3088760 }, "interchainGasPaymaster": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", - "interchainSecurityModule": "0x5997a574AbfED0506a5319b669b5f328b1C391A3", + "interchainSecurityModule": "0x6f3e2043611307bE33016a9aaDf1943cCd10d7db", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x062200d92dF6bB7bA89Ce4D6800110450f94784e", "name": "lukso", @@ -1605,7 +1608,7 @@ "interchainAccountIsm": "0x8Ea50255C282F89d1A14ad3F159437EE5EF0507f", "interchainAccountRouter": "0x693A4cE39d99e46B04cb562329e3F0141cA17331", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0xF9fecfeAA2A20744eAb207f7c01CA245C49Bab9e", + "interchainSecurityModule": "0x809253E828b9F94781Ee58089bA696883D05dDca", "isTestnet": false, "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", @@ -1675,7 +1678,7 @@ "interchainAccountIsm": "0xe039DA3A0071BEd087A12660D7b03cf669c7776E", "interchainAccountRouter": "0x45285463352c53a481e882cD5E2AF2E25BBdAd0D", "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", - "interchainSecurityModule": "0x244BbF1B35C67De0367E4A02C63bFD4269976A92", + "interchainSecurityModule": "0xA9dfB22e46133f23bB635818aeB04Ae31645D2a8", "mailbox": "0x398633D19f4371e1DB5a8EFE90468eB70B1176AA", "merkleTreeHook": "0x5332D1AC0A626D265298c14ff681c0A8D28dB86d", "name": "mantle", @@ -1737,7 +1740,7 @@ "from": 13523607 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x3C5672Af5874D2ea59B73edF4489Db73bCE743D0", + "interchainSecurityModule": "0x8Dc8e217071F55C772Ffa21CCCCf3B70FCec40c7", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "merlin", @@ -1804,7 +1807,7 @@ "from": 17966274 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xb54D5F3905422BcD7f8d4627ad60c9F3196dEF66", + "interchainSecurityModule": "0x67F16B702A2b8AC3d8fc1ffAEfBAB7Fe6fe762AD", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "metis", @@ -1869,7 +1872,7 @@ "from": 3752032 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xda17325c9f34cedc06728707eD95eC79d26386a7", + "interchainSecurityModule": "0xFE82E2d4278124122e9771D7A525846e506BbAD3", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "mint", @@ -1936,7 +1939,7 @@ "interchainAccountIsm": "0xa377b8269e0A47cdd2fD5AAeAe860b45623c6d82", "interchainAccountRouter": "0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8", "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0xB484705Abc1F351b94B63C93Af83B6d108351137", + "interchainSecurityModule": "0xA54Cca261C76B09663Ae4bCe042d644e6F822e2E", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "mode", @@ -2004,7 +2007,7 @@ "interchainAccountIsm": "0x79b3730CE3685f65802aF1771319992bA960EB9D", "interchainAccountRouter": "0xc4482f66191754a8629D35289043C4EB0285F10E", "interchainGasPaymaster": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "interchainSecurityModule": "0xFc907245E3c91cFE8aFFDcCb01ef7053a76C7eDb", + "interchainSecurityModule": "0xe12cd1ddf6AA5f71FBee45CE9A819a0B3B2fb67F", "mailbox": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", "merkleTreeHook": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", "name": "moonbeam", @@ -2146,7 +2149,7 @@ "interchainAccountIsm": "0x2c46BF14641d00549ECa4779BF5CBf91602C1DEd", "interchainAccountRouter": "0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD", "interchainGasPaymaster": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "interchainSecurityModule": "0xe12A4A59080320aBC854FE647761D83D00883807", + "interchainSecurityModule": "0x10b4d96f8D4F095f0B708195B502FDeC165b739b", "mailbox": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", "merkleTreeHook": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", "name": "optimism", @@ -2281,7 +2284,7 @@ "interchainAccountIsm": "0xBAC4529cdfE7CCe9E858BF706e41F8Ed096C1BAd", "interchainAccountRouter": "0xF163949AD9F88977ebF649D0461398Ca752E64B9", "interchainGasPaymaster": "0x0071740Bf129b05C4684abfbBeD248D80971cce2", - "interchainSecurityModule": "0xD94CaFdBe8c9C2C05fD5992B087bc30F237001D2", + "interchainSecurityModule": "0x47E840c5537547E0Fff9aB9cCd05eDe70A6D9139", "mailbox": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB", "merkleTreeHook": "0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6", "name": "polygon", @@ -2318,11 +2321,7 @@ "validatorAnnounce": "0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5", "staticMerkleRootWeightedMultisigIsmFactory": "0x07CE1B0cFfa436AE2fb7Fbd7318648774FdA53f9", "staticMessageIdWeightedMultisigIsmFactory": "0x9e22945bE593946618383B108CC5bce09eBA4C26", - "technicalStack": "other", - "transactionOverrides": { - "maxFeePerGas": 800000000000, - "maxPriorityFeePerGas": 50000000000 - } + "technicalStack": "other" }, "polygonzkevm": { "aggregationHook": "0x8464aF853363B8d6844070F68b0AB34Cb6523d0F", @@ -2358,7 +2357,7 @@ "interchainAccountIsm": "0xc1198e241DAe48BF5AEDE5DCE49Fe4A6064cF7a7", "interchainAccountRouter": "0x20a0A32a110362920597F72974E1E0d7e25cA20a", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0xAbD84C24bC17b3733D094Cf911561F3c088bA8E0", + "interchainSecurityModule": "0x008cF37Cf63dE3179A9a93F558537daB1A73a46C", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "polygonzkevm", @@ -2426,7 +2425,7 @@ "from": 32018468 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x1C516BB0B775B2EDF3fA26beb547f2634F23bB11", + "interchainSecurityModule": "0x56c8e2Ca77EA631D049e9AdbCC81902c4A420AF8", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "proofofplay", @@ -2485,12 +2484,12 @@ "domainRoutingIsm": "0x494415e823236A05c608D6b777bC80082cED6A2E", "domainRoutingIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", "fallbackRoutingHook": "0xDd1CddEd982e4d271d4D6Bc4cdE8d4F3338733B5", - "gasCurrencyCoinGeckoId": "real-ether", + "gasCurrencyCoinGeckoId": "ethereum", "index": { "from": 363159 }, "interchainGasPaymaster": "0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696", - "interchainSecurityModule": "0x342766bc19A0bcd47d4269D1804AF4Ad27D4372C", + "interchainSecurityModule": "0x16a780d2f0d39B0e0e7B3d05a7E9d0BA772D2e2D", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x55E4F0bc6b7Bb493D50839A8592e7ad8d5e93cf7", "name": "real", @@ -2557,7 +2556,7 @@ "interchainAccountIsm": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785", "interchainAccountRouter": "0x7a4d31a686A36285d68e14EDD53631417eB19603", "interchainGasPaymaster": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "interchainSecurityModule": "0x020f0b3691383B662Fb0D5799D5516652eFE5124", + "interchainSecurityModule": "0xF11b43b26e1Df7A7fc9E2fB7982630Ca9E78Db17", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", "name": "redstone", @@ -2619,7 +2618,7 @@ "from": 937117 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x798BC62c7E991c908A7c18131324Eb413ac61cc6", + "interchainSecurityModule": "0xa8dBD60A10bC4f2B807Abc040c620453b1Ad9fb0", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "sanko", @@ -2687,7 +2686,7 @@ "interchainAccountIsm": "0x32af5Df81fEd5E26119F6640FBB13f3d63a94CDe", "interchainAccountRouter": "0x0B48a744698ba8dFa514742dFEB6728f52fD66f7", "interchainGasPaymaster": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "interchainSecurityModule": "0x35b219Ee7824b0DB8d0bE01a97Cb88cFC4d8aB22", + "interchainSecurityModule": "0x86e427d91d26eCD2542846D4C9b57186e9339a37", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", "name": "scroll", @@ -2703,7 +2702,19 @@ "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", "rpcUrls": [ { - "http": "https://scroll.blockpi.network/v1/rpc/public" + "http": "https://rpc.scroll.io" + }, + { + "http": "https://rpc.ankr.com/scroll" + }, + { + "http": "https://scroll-mainnet.chainstacklabs.com" + }, + { + "http": "https://scroll.drpc.org" + }, + { + "http": "https://1rpc.io/scroll" } ], "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", @@ -2750,12 +2761,13 @@ "gasCurrencyCoinGeckoId": "sei-network", "gnosisSafeTransactionServiceUrl": "https://transaction.sei-safe.protofire.io", "index": { - "from": 80809403 + "from": 80809403, + "chunk": 1000 }, "interchainAccountIsm": "0xf35dc7B9eE4Ebf0cd3546Bd6EE3b403dE2b9F5D6", "interchainAccountRouter": "0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5", "interchainGasPaymaster": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", - "interchainSecurityModule": "0x7329fEFd101560d0e56F54768dB5c7f095148a9b", + "interchainSecurityModule": "0xFDd69b3E4c13c6D65f856F99A12BFA0F0cc529D7", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49", "name": "sei", @@ -2816,7 +2828,7 @@ "index": { "from": 1, "mode": "sequence", - "chunk": 100 + "chunk": 20 }, "interchainGasPaymaster": "JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M", "mailbox": "E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi", @@ -2870,7 +2882,7 @@ "interchainAccountIsm": "0xAE557e108b3336130370aC74836f1356B4b30Cf2", "interchainAccountRouter": "0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B", "interchainGasPaymaster": "0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42", - "interchainSecurityModule": "0x38ab08a7cb19757Ba6dc870277780519380DED32", + "interchainSecurityModule": "0xd663Fb2EE0F8E351869e3E4CdbDeA3b0e440Eb98", "mailbox": "0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3", "merkleTreeHook": "0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd", "name": "taiko", @@ -2932,7 +2944,7 @@ "from": 1678063 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x798BC62c7E991c908A7c18131324Eb413ac61cc6", + "interchainSecurityModule": "0x56c8e2Ca77EA631D049e9AdbCC81902c4A420AF8", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", @@ -3000,7 +3012,7 @@ "interchainAccountIsm": "0x551BbEc45FD665a8C95ca8731CbC32b7653Bc59B", "interchainAccountRouter": "0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x8c5D31F910a08E8ae72a1Ea28c77609be3774e29", + "interchainSecurityModule": "0x83D407ebFa89d1D64833F314f6ad6bBc57728D66", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "viction", @@ -3068,7 +3080,7 @@ "interchainAccountIsm": "0xCB9f90EE5d83Ea52ABd922BD70898f0155D54798", "interchainAccountRouter": "0x473884010F0C1742DA8Ad01E7E295624B931076b", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0x586bB821b040491EA7822317cA2316c3B217F9AA", + "interchainSecurityModule": "0x85bD389452743323afF638a3486A8cC451a33329", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "worldchain", @@ -3130,7 +3142,7 @@ "from": 24395308 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xb26302055D46090B299b7c01041f246FEEdcE559", + "interchainSecurityModule": "0x1E6fdCA7fda50eD32c2c54b28a0E0557e6065fba", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "xai", @@ -3198,7 +3210,7 @@ "interchainAccountIsm": "0x29B37088724B745C0ABcE591449Cf042772160C2", "interchainAccountRouter": "0x03cF708E42C89623bd83B281A56935cB562b9258", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0xae69dcB077234da706C6228756Ffb13B8B332970", + "interchainSecurityModule": "0x0F95bC504568913673CB7C1e6BeFc605a31bD945", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "xlayer", @@ -3266,7 +3278,7 @@ "interchainAccountIsm": "0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29", "interchainAccountRouter": "0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5", "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0xFa772A78594a65458B7A6934DA1fA83930B0F51b", + "interchainSecurityModule": "0x0c979c68c88459F6b4cCfEc73B6d6Ac262f7159e", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "zetachain", @@ -3332,7 +3344,7 @@ "from": 1511458 }, "interchainGasPaymaster": "0x03cF708E42C89623bd83B281A56935cB562b9258", - "interchainSecurityModule": "0x41792A9E3FD2883F5bD6fd38a209483Fc21082f8", + "interchainSecurityModule": "0x3abC1e4D81c96C7cF6E80638dD8dBcc9FF1BD4C3", "mailbox": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", "merkleTreeHook": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28", "name": "zircuit", @@ -3405,7 +3417,7 @@ "interchainAccountIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", "interchainAccountRouter": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainGasPaymaster": "0x18B0688990720103dB63559a3563f7E8d0f63EDb", - "interchainSecurityModule": "0xD1Ce8d18B61AfE53D63ba7DC359F0bD3eA915235", + "interchainSecurityModule": "0x0393C0ba78562BCC043c0C7c76Ed09230b04A35f", "mailbox": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "merkleTreeHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", "name": "zoramainnet", @@ -3476,7 +3488,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x5d315fD2F9ce3F538F76c2f6b9516495B0a1bCEb", + "interchainSecurityModule": "0xa5a09C88941410515A5Fc6D42FFb4Db3B6722274", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3543,7 +3555,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x24326Ebe336Fa9d48615697B39845B6B2F098174", + "interchainSecurityModule": "0xa221Fda4b2fd4b586BbE14aB39E79F186de16CA9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3613,7 +3625,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x4bD8927F13cCCe50B2bB3603B5Eaf484A56f1638", + "interchainSecurityModule": "0xdC6E982Ea3091006b1Ef0CB6Acfe018b058eEd19", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3689,7 +3701,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xF53b96635A3e7c57fe481c94efe0F658990E5040", + "interchainSecurityModule": "0x27d3ADAA10646b8787A614D5d1ef257593BEe1Ea", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3753,7 +3765,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x071aeFd19DD91AB9E63ED3BDa36d0b7097A7459f", + "interchainSecurityModule": "0xe43d5f9b4da11ef7F775Ba2B40b112A7F706dF83", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3826,7 +3838,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x2769f9B495692BC6135BA71255EeD04A995e74E2", + "interchainSecurityModule": "0xb9B8bD14661DE405F7597CC5b0D859C568700dF6", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3894,7 +3906,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xB2fB0a0b676B75cf6Af1ab517023f88Ea90EDd2E", + "interchainSecurityModule": "0x0081c30768c4C91C73d7871E5ae25B0d27276Fc0", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3957,7 +3969,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x604F761705Cf5D1682dD17356b84d96CD41B0734", + "interchainSecurityModule": "0xa4D428c24332A7E42a49b47A8c56f489ce43426F", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -4027,7 +4039,7 @@ "interchainAccountIsm": "0xcd9D3744512F07AE844c40E27912092d7c503565", "interchainAccountRouter": "0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8", "interchainGasPaymaster": "0xb58257cc81E47EC72fD38aE16297048de23163b4", - "interchainSecurityModule": "0x80D7DDC0b7d8dae6F9CcB0D78558291118815349", + "interchainSecurityModule": "0x621711bf30D680256460884a626b6B2A3F8Fa2Bd", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1", "pausableHook": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", @@ -4087,7 +4099,7 @@ "interchainAccountIsm": "0xc23BaF5Eb5848D19701BbE7f139645e6bd58a319", "interchainAccountRouter": "0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE", "interchainGasPaymaster": "0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86", - "interchainSecurityModule": "0x64bdb8Bfb9DbAc2FD2fD28a9B37605CE73D4410f", + "interchainSecurityModule": "0x70a1E8ee35227962f03a767c2b1073D2000c0c3D", "mailbox": "0xb129828B9EDa48192D0B2db35D0E40dCF51B3594", "merkleTreeHook": "0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59", "pausableHook": "0x6Fb36672365C7c797028C400A61c58c0ECc53cD2", @@ -4218,7 +4230,7 @@ "interchainAccountIsm": "0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1", "interchainAccountRouter": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "interchainGasPaymaster": "0x18B0688990720103dB63559a3563f7E8d0f63EDb", - "interchainSecurityModule": "0x9386BadA88dF2b034614Dcf3CC82aB0dC6C63849", + "interchainSecurityModule": "0x2011044b3949C6406Cf47BC8c3122e7D70331266", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", "pausableHook": "0x2F619Ac5122689180AeBB930ADccdae215d538a9", @@ -4282,7 +4294,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xf10dB7FBC4B5d79d217881aB7FeC71A4a33449af", + "interchainSecurityModule": "0xb35e7Cc9d45F3A5AD7dab46EB71F0b564B985322", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4343,7 +4355,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xf48D165f545221766DbEB9D92b1187DD1322170b", + "interchainSecurityModule": "0x9219ED9F72c64961c7745C61A1a3492b16435d06", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4422,7 +4434,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x78E7691458EA3Ca38a56fD4eFBE54D30dDDa72Ac", + "interchainSecurityModule": "0xe24AdcdFA8B77A69F4134c6A7c8AB571911fDD43", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4489,7 +4501,7 @@ "interchainAccountIsm": "0x783EC5e105234a570eB90f314284E5dBe53bdd90", "interchainAccountRouter": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", "interchainGasPaymaster": "0xf3dFf6747E7FC74B431C943961054B7BF6309d8a", - "interchainSecurityModule": "0x3Eb3273A92B6b1653f64CD945506dd67F478C9bd", + "interchainSecurityModule": "0xD6f9589f8d1Aa8e4f196174Be8046cF94D4364B9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8", "pausableHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", @@ -4560,7 +4572,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x3428158e7D0D9AD25653ea390EE9a9aA43628a48", + "interchainSecurityModule": "0x9DdF78676e47935f24DbcC6C0FDF9FF6687Fc461", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4625,7 +4637,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xFeAE4cdACEc5E2aC50A0357eed6c13A5d76c88cD", + "interchainSecurityModule": "0x540605591E8C763FA4C1DeE91A674E39b33c768a", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4689,7 +4701,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x18545b46Df0A6cd81FA05C663FAc4ee26a750ad0", + "interchainSecurityModule": "0x132655e619098058D595E871206e7ec1f4a8cb00", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4756,7 +4768,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xc3FFEd2a525a487cfe805193c463CB7BdD704CE9", + "interchainSecurityModule": "0x1277E184770eFF57bc54a8317cff379C53Ed307C", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4820,7 +4832,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xb5813484CD3027FCb4B908a3bD2D9c118423a14B", + "interchainSecurityModule": "0xb35e7Cc9d45F3A5AD7dab46EB71F0b564B985322", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4882,7 +4894,7 @@ "fallbackDomainRoutingHook": "0x671836d35BB15E21ECc92c4936F0e3131efe12B4", "fallbackRoutingHook": "0x671836d35BB15E21ECc92c4936F0e3131efe12B4", "interchainGasPaymaster": "0x318FbdB17d4e743aBF3183658a4730777101B75C", - "interchainSecurityModule": "0xd60690A755C070817AacF88d1FD3F64451D80149", + "interchainSecurityModule": "0x753876a50C354F2EfB35D1D37dA7F25fd5a78250", "mailbox": "0xd7b351D2dE3495eA259DD10ab4b9300A378Afbf3", "merkleTreeHook": "0x55379421409961Ef129738c24261379ef8A547Df", "proxyAdmin": "0x72e2A678442Edc65f14476A0E4c94312C0469f4A", @@ -5006,7 +5018,7 @@ "interchainAccountIsm": "0x4d264424905535E97396Db83bd553D0d73A4EF9d", "interchainAccountRouter": "0x26A29486480BD74f9B830a9B8dB33cb43C40f496", "interchainGasPaymaster": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", - "interchainSecurityModule": "0x5e7Ff7Cb6C828DFda4Ce8934A6f8F4C7B33E2217", + "interchainSecurityModule": "0x89Ea8BAEC48ec2EB8F5444aD600a15dABd4426D7", "mailbox": "0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "pausableHook": "0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8", @@ -5070,7 +5082,7 @@ "interchainAccountIsm": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "interchainAccountRouter": "0x4ef363Da5bb09CC6aeA16973786963d0C8820778", "interchainGasPaymaster": "0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40", - "interchainSecurityModule": "0x14bF825eE8FaD180d379280963FBB66F6c256a6E", + "interchainSecurityModule": "0x89E35A66511eF1446DaB436FDF9c1eF93EFaa03D", "mailbox": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", "merkleTreeHook": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", "pausableHook": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", @@ -5137,7 +5149,7 @@ "interchainAccountIsm": "0x60bB6D060393D3C206719A7bD61844cC82891cfB", "interchainAccountRouter": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", "interchainGasPaymaster": "0x61374178e45F65fF9D6252d017Cd580FC60B7654", - "interchainSecurityModule": "0x969179b1330226bC861aE726Aa1D2Bba03cc5576", + "interchainSecurityModule": "0xF88aFBD5C7D6f804bb525Bc8f3A12906Ded7C715", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xEe08043cf22c80b27BF24d19999231dF4a3fC256", "pausableHook": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", @@ -5202,7 +5214,7 @@ "interchainAccountIsm": "0xcdc31BA959DE8C035A03167ebAE1961208CDf172", "interchainAccountRouter": "0x349831a180eE4265008C5FFB9465Ff97c1CF0028", "interchainGasPaymaster": "0x6AA10748a036a49Cb290C0e12B77319b76792D5E", - "interchainSecurityModule": "0x1Be73077A341D517AcAa2516c0BE356b6444134B", + "interchainSecurityModule": "0xEeEF1a33C123D8a3Ee96C670fC740D4e7A603329", "mailbox": "0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D", "merkleTreeHook": "0x2783D98CC073dbcDa90241C804d16982D3d75821", "pausableHook": "0x3bb2D0a828f7dD91bA786091F421f6d7cF376445", @@ -5272,7 +5284,7 @@ "interchainAccountIsm": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "interchainAccountRouter": "0x4ef363Da5bb09CC6aeA16973786963d0C8820778", "interchainGasPaymaster": "0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9", - "interchainSecurityModule": "0x8021F7b95A9354619c22a3bed3a6549d07Ac34B4", + "interchainSecurityModule": "0x06B1B5afCFfB8F49Dcea935A5E9E6A8FF96Da029", "mailbox": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", "merkleTreeHook": "0xdAa1B65547fB969c9ff5678956AB2FF9771B883D", "pausableHook": "0xA0e0829DA397CcF55d5B779C31728f21Cb8219DF", @@ -5384,7 +5396,7 @@ "interchainAccountIsm": "0x8c794a781327b819416E7b67908f1D22397f1E67", "interchainAccountRouter": "0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6", "interchainGasPaymaster": "0x2b79328DA089E89A9E9c08732b56dd31F01011Db", - "interchainSecurityModule": "0x14663E42b9b66F79103c5824230CC79a26E24BfD", + "interchainSecurityModule": "0x7E81F96355529Cf7Cb768B3CCf49552E727eC7EE", "mailbox": "0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9", "merkleTreeHook": "0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227", "pausableHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", @@ -5448,7 +5460,7 @@ "interchainAccountIsm": "0xE67Dc24970B482579923551Ede52BD35a2858989", "interchainAccountRouter": "0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409", "interchainGasPaymaster": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", - "interchainSecurityModule": "0x846856eeD85eBc6C5FBf94F17e0c9cC76dF6c86E", + "interchainSecurityModule": "0xdA07f00d13E908b7c52C02b38AB748d924DdE890", "mailbox": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", "merkleTreeHook": "0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8", "pausableHook": "0xdAa1B65547fB969c9ff5678956AB2FF9771B883D", @@ -5512,7 +5524,7 @@ "interchainAccountIsm": "0x20a0A32a110362920597F72974E1E0d7e25cA20a", "interchainAccountRouter": "0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54", "interchainGasPaymaster": "0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6", - "interchainSecurityModule": "0xa1080587BA36750d90746A147Ee79F8589Ac0099", + "interchainSecurityModule": "0x90B3696922e6a8128EEB23F08Cbf5b2545f849C6", "mailbox": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "merkleTreeHook": "0xf147bBD944C610F86DaE6C7668497D22932C1E4A", "pausableHook": "0x872Bd98057931c8809927c6dE2ef39738a80Eb0C", @@ -5579,7 +5591,7 @@ "interchainAccountIsm": "0xf40eE9FF75Fa34910b7C4C8d68d4850B3bD184D3", "interchainAccountRouter": "0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea", "interchainGasPaymaster": "0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409", - "interchainSecurityModule": "0x008FED472F8d4634C5701B3bEc2380C30064BEb5", + "interchainSecurityModule": "0x727DaD31073Dcc961B76Cbd625D6d074fA7988c9", "mailbox": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", "merkleTreeHook": "0x8c794a781327b819416E7b67908f1D22397f1E67", "pausableHook": "0x4d264424905535E97396Db83bd553D0d73A4EF9d", @@ -5646,7 +5658,7 @@ "interchainAccountIsm": "0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D", "interchainAccountRouter": "0x7279B1e11142078b8dC9e69620200f4C84FB8aaa", "interchainGasPaymaster": "0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7", - "interchainSecurityModule": "0x54BF1a8c5584E844a6b4F9F98e2770A415921f66", + "interchainSecurityModule": "0x8A4C3c1f234e9da8e325902f7105471B078a1e23", "mailbox": "0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8", "merkleTreeHook": "0x086c3947F71BE98A0bDf4AB7239955e7542b0CbA", "pausableHook": "0x9C6e8d989ea7F212e679191BEb44139d83ac927a", @@ -5716,7 +5728,7 @@ "interchainAccountIsm": "0x8a733038eF4BbC314eE0F7595257D8d3799B6aA9", "interchainAccountRouter": "0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9", "interchainGasPaymaster": "0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C", - "interchainSecurityModule": "0xBCc50A4e5690251aFF052b415251DfBc634002C7", + "interchainSecurityModule": "0xff5306993F410008d1d7581695252e95c55bc458", "mailbox": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6", "merkleTreeHook": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", "pausableHook": "0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9", @@ -5777,7 +5789,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x0cF15af1385776F0f853C3525cC9A9eba600c209", + "interchainSecurityModule": "0x16c7A4C2f4BCDBFC8205Baa9F1dCBcd44B4d8d90", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5847,7 +5859,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x319310239BC5c43808Ff1008d0db3B38067F7Ce9", + "interchainSecurityModule": "0x78E12CF0Ee442f7B9E6df137e0c038A4b6e8d8Eb", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5908,7 +5920,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x773daCf7C9944fE6e1Fa740eeC7FD4ae820a9cbb", + "interchainSecurityModule": "0xF2c7E4Ad99b08d1a2CF139cb7b79d645b50BEdEa", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5972,7 +5984,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x555b95e85640aeE885236327aB91946827ebdB57", + "interchainSecurityModule": "0x0D9b693d45690a9FfE8F1e8E0dC41A2C6207E090", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -6036,7 +6048,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x555b95e85640aeE885236327aB91946827ebdB57", + "interchainSecurityModule": "0x78E12CF0Ee442f7B9E6df137e0c038A4b6e8d8Eb", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -6109,7 +6121,7 @@ "interchainAccountIsm": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainAccountRouter": "0x4D50044335dc1d4D26c343AdeDf6E47808475Deb", "interchainGasPaymaster": "0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B", - "interchainSecurityModule": "0x6d29ffb859D867Faf2705f39b168331960438f31", + "interchainSecurityModule": "0xE490AbA47A8b6B26dFF22A61aAFd51C52fD386c2", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", "pausableHook": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", @@ -6173,7 +6185,7 @@ "interchainAccountIsm": "0x31Bb27f6007C33acD1be83ACEd3164C60f8F7b13", "interchainAccountRouter": "0xEeb5a99a75585fe137c83E7b62b74f87264A5481", "interchainGasPaymaster": "0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03", - "interchainSecurityModule": "0x833005B52Ea2785178752f91b51614E40eF56891", + "interchainSecurityModule": "0x56b99cFe785C7e9F61040cdd4081d63Ef48Cf928", "mailbox": "0x0dF25A2d59F03F039b56E90EdC5B89679Ace28Bc", "merkleTreeHook": "0xC88636fFdFAc7cb87b7A76310B7a62AF0A000595", "pausableHook": "0x2AF32cF8e3Cf42d221eDa0c843818fA5ee129E27", @@ -6237,7 +6249,7 @@ "interchainAccountIsm": "0x28291a7062afA569104bEd52F7AcCA3dD2FafD11", "interchainAccountRouter": "0xe9E3444DDD80c50276c0Fcf316026f6d7fEc2c47", "interchainGasPaymaster": "0x25EAC2007b0D40E3f0AF112FD346412321038719", - "interchainSecurityModule": "0xd8d54AA2d31De782C76170328eB3Dca412F171ae", + "interchainSecurityModule": "0xCb1514f34Dfd366cF74D0F58F3D8BDE49C059533", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "pausableHook": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", @@ -6305,7 +6317,7 @@ "interchainAccountIsm": "0x027eFD1695941969435AA640542B690044dF7E06", "interchainAccountRouter": "0x65F1343AC23D4fF48bf6c7E0c55872d245397567", "interchainGasPaymaster": "0x28291a7062afA569104bEd52F7AcCA3dD2FafD11", - "interchainSecurityModule": "0xAf8AA677016ee577268Ab6ad19483075605a5671", + "interchainSecurityModule": "0xF0f29D8b9d16aE092886A38571D5E7Ffdb508EB3", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xcd90D49b046772F710250b9119117169CB2e4D8b", "pausableHook": "0x7CE76f5f0C469bBB4cd7Ea6EbabB54437A093127", @@ -6442,6 +6454,1247 @@ "index": { "from": 7286869 } + }, + "arthera": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.arthera.net/api", + "family": "blockscout", + "name": "Arthera Explorer", + "url": "https://explorer.arthera.net" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 10242, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Arthera", + "domainId": 10242, + "gasCurrencyCoinGeckoId": "arthera", + "name": "arthera", + "nativeToken": { + "decimals": 18, + "name": "Arthera", + "symbol": "AA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.arthera.net", + "pagination": { + "maxBlockRange": 10000 + } + } + ], + "technicalStack": "other", + "aggregationHook": "0xeee0A47491ade07A37D026E4670Dc5c93fdAe888", + "domainRoutingIsm": "0x928DcA761f20aBFBdf088314f448234fB96dE60C", + "domainRoutingIsmFactory": "0x29B37088724B745C0ABcE591449Cf042772160C2", + "fallbackRoutingHook": "0x1fbcCdc677c10671eE50b46C61F0f7d135112450", + "interchainAccountIsm": "0xf9609bB22847e0DB5F6fB8f95b84D25A19b46ac5", + "interchainAccountRouter": "0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29", + "interchainGasPaymaster": "0xFb7D175d6F53800D68D32C3Fe1416807A394cC24", + "interchainSecurityModule": "0x882eE9A3938501558823514b70d8bBa945953B80", + "mailbox": "0x473884010F0C1742DA8Ad01E7E295624B931076b", + "merkleTreeHook": "0xdA629E1B79e3420ECd1e80571aDd6a4a3b13AE79", + "pausableHook": "0xe93f2f409ad8B5000431D234472973fe848dcBEC", + "pausableIsm": "0x466b330C2e360c0214A9Da2428415298f720883E", + "protocolFee": "0x33AA12b4e8E79cA551Ca9D1F2eC7d2cE02129dd4", + "proxyAdmin": "0x03cF708E42C89623bd83B281A56935cB562b9258", + "staticAggregationHookFactory": "0x46fa3A5780e5B90Eaf34BDED554d5353B5ABE9E7", + "staticAggregationIsm": "0x871459fDa27204F20300A3E472fD05e0C62f09De", + "staticAggregationIsmFactory": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", + "staticMerkleRootMultisigIsmFactory": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28", + "staticMerkleRootWeightedMultisigIsmFactory": "0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60", + "staticMessageIdMultisigIsmFactory": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", + "staticMessageIdWeightedMultisigIsmFactory": "0xCB9f90EE5d83Ea52ABd922BD70898f0155D54798", + "storageGasOracle": "0x8d9Bd7E9ec3cd799a659EE650DfF6C799309fA91", + "testRecipient": "0x49998DFdeF3F0b05Fe103C435bF73f5D735a0b97", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xEe9E0FB6f43913aDBbe5bf89073F4BA590AB8184", + "index": { + "from": 19952728 + } + }, + "aurora": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.mainnet.aurora.dev/api", + "family": "blockscout", + "name": "Aurora Explorer", + "url": "https://explorer.mainnet.aurora.dev" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 1313161554, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Aurora", + "domainId": 1313161554, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "aurora", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.aurora.dev" + }, + { + "http": "https://aurora.drpc.org" + } + ], + "technicalStack": "other", + "aggregationHook": "0xCB571B99DD7e5f13bEb043893706D76024A30886", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "interchainAccountIsm": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", + "interchainAccountRouter": "0x021D2810a758c833080DEc2F1Fa8F571Aae97D45", + "interchainGasPaymaster": "0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E", + "interchainSecurityModule": "0x597210e915409D2B9D4487Ef21ea115444e419Ed", + "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", + "merkleTreeHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "pausableIsm": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "protocolFee": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "proxyAdmin": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0xAD067B2DF9Cab270d1F4fe546B15f1AA7e0977DD", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "testRecipient": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x426a3CE72C1586b1867F9339550371E86DB3e396", + "index": { + "from": 135117550 + } + }, + "conflux": { + "blockExplorers": [ + { + "apiUrl": "https://evmapi.confluxscan.net/api", + "family": "blockscout", + "name": "ConfluxScan eSpace", + "url": "https://evm.confluxscan.net" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 10 + }, + "chainId": 1030, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Conflux eSpace", + "domainId": 1030, + "gasCurrencyCoinGeckoId": "conflux-token", + "name": "conflux", + "nativeToken": { + "decimals": 18, + "name": "Ethereum", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://evm.confluxrpc.com" + }, + { + "http": "https://conflux-espace-public.unifra.io" + }, + { + "http": "https://conflux-espace.blockpi.network/v1/rpc/public" + } + ], + "technicalStack": "other", + "aggregationHook": "0x2A3E42635E7acAc8Bb7851963Bc9d29B1dAAd409", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "interchainAccountIsm": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "interchainAccountRouter": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "interchainSecurityModule": "0x7664aAE6C1bCFfe364F742c75f52D3dC70FF412E", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableIsm": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", + "protocolFee": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x95cE3183137f906753463933C5dfDe777D2E7fE2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "testRecipient": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "index": { + "from": 111730015 + } + }, + "conwai": { + "blockExplorers": [ + { + "apiUrl": "https://conwai.calderaexplorer.xyz/api", + "family": "blockscout", + "name": "Conwai Explorer", + "url": "https://conwai.calderaexplorer.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 0 + }, + "chainId": 668668, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Conwai", + "domainId": 668668, + "gasCurrencyCoinGeckoId": "conwai", + "index": { + "from": 73 + }, + "name": "conwai", + "nativeToken": { + "decimals": 18, + "name": "Conwai", + "symbol": "CNW" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://conwai.calderachain.xyz/http" + } + ], + "technicalStack": "arbitrumnitro", + "aggregationHook": "0x2A3E42635E7acAc8Bb7851963Bc9d29B1dAAd409", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "interchainSecurityModule": "0x44f0875a9a412849B2167c7a4A3ECE4e13ba1ac4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableIsm": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", + "protocolFee": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x95cE3183137f906753463933C5dfDe777D2E7fE2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "testRecipient": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907" + }, + "corn": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/21000000/etherscan/api", + "family": "routescan", + "name": "Cornscan", + "url": "https://cornscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 20, + "reorgPeriod": 5 + }, + "chainId": 21000000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Corn", + "domainId": 21000000, + "index": { + "from": 55636 + }, + "gasCurrencyCoinGeckoId": "bitcoin", + "name": "corn", + "nativeToken": { + "decimals": 18, + "name": "Bitcorn", + "symbol": "BTCN" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.corn-rpc.com" + }, + { + "http": "https://maizenet-rpc.usecorn.com" + }, + { + "http": "https://rpc.ankr.com/corn_maizenet" + } + ], + "technicalStack": "arbitrumnitro", + "aggregationHook": "0x2A3E42635E7acAc8Bb7851963Bc9d29B1dAAd409", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "interchainSecurityModule": "0x44f0875a9a412849B2167c7a4A3ECE4e13ba1ac4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableIsm": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", + "protocolFee": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x95cE3183137f906753463933C5dfDe777D2E7fE2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "testRecipient": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907" + }, + "evmos": { + "blockExplorers": [ + { + "apiUrl": "https://www.mintscan.io/evmos/api", + "family": "other", + "name": "Mintscan", + "url": "https://www.mintscan.io/evmos" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 9001, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Evmos EVM", + "domainId": 9001, + "gasCurrencyCoinGeckoId": "evmos", + "name": "evmos", + "nativeToken": { + "decimals": 18, + "name": "Evmos", + "symbol": "EVMOS" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://evmos.lava.build" + }, + { + "http": "https://evmos-json-rpc.stakely.io" + }, + { + "http": "https://rpc-evm.evmos.dragonstake.io" + }, + { + "http": "https://evmos.drpc.org" + } + ], + "technicalStack": "other", + "aggregationHook": "0x2A3E42635E7acAc8Bb7851963Bc9d29B1dAAd409", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "interchainSecurityModule": "0x03Def25faaABF7aa393eC4108267f0b2c0B1F58f", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableIsm": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", + "protocolFee": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x95cE3183137f906753463933C5dfDe777D2E7fE2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "testRecipient": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "index": { + "from": 25566476 + } + }, + "form": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.form.network/api", + "family": "blockscout", + "name": "Form Explorer", + "url": "https://explorer.form.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 478, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Form", + "domainId": 478, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "form", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.form.network/http" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x2A3E42635E7acAc8Bb7851963Bc9d29B1dAAd409", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "interchainSecurityModule": "0x03Def25faaABF7aa393eC4108267f0b2c0B1F58f", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableIsm": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", + "protocolFee": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x95cE3183137f906753463933C5dfDe777D2E7fE2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "testRecipient": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "index": { + "from": 469384 + }, + "gnosisSafeTransactionServiceUrl": "https://prod.form.keypersafe.xyz/" + }, + "ink": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.inkonchain.com/api", + "family": "blockscout", + "name": "Ink Explorer", + "url": "https://explorer.inkonchain.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 57073, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Ink", + "domainId": 57073, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "ink", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc-qnd.inkonchain.com" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x4D5DDc9D93F9b60c101B6ba75fcD9f3a10F7F8da", + "domainRoutingIsm": "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff", + "domainRoutingIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "fallbackRoutingHook": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "interchainAccountIsm": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "interchainAccountRouter": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", + "interchainGasPaymaster": "0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E", + "interchainSecurityModule": "0x017a26fE04aB95c77BA6DeE4d441A3F2402BBe17", + "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", + "merkleTreeHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "pausableIsm": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "protocolFee": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "proxyAdmin": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "staticAggregationHookFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticAggregationIsm": "0x9D68537eE6b1351fE22a0837e6aD522c526CA72e", + "staticAggregationIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "storageGasOracle": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "testRecipient": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x426a3CE72C1586b1867F9339550371E86DB3e396", + "index": { + "from": 860343 + }, + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-ink.safe.global/" + }, + "rivalz": { + "blockExplorers": [ + { + "apiUrl": "https://rivalz.calderaexplorer.xyz/api", + "family": "blockscout", + "name": "Rivalz Explorer", + "url": "https://rivalz.calderaexplorer.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 0 + }, + "chainId": 753, + "displayName": "Rivalz", + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "domainId": 753, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 21 + }, + "name": "rivalz", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rivalz.calderachain.xyz/http" + } + ], + "technicalStack": "arbitrumnitro", + "aggregationHook": "0xfe94Ea7DA6C45849D395e3d03973aa924553b937", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "interchainAccountIsm": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", + "interchainAccountRouter": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", + "interchainGasPaymaster": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", + "interchainSecurityModule": "0x0fB08d319a9Daaf6e8005873D2BA1980Bd59c614", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "pausableHook": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "pausableIsm": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "protocolFee": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x8f1953EFbd2C720223faD02d6CB5CD25f97D7fC9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", + "testRecipient": "0x92249B8ed35C2980e58666a3EBF4a075DDD2895f", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615" + }, + "soneium": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.soneium.org/api", + "family": "blockscout", + "name": "Soneium Explorer", + "url": "https://explorer.soneium.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 1868, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Soneium", + "domainId": 1868, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "soneium", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.soneium.org" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x2A3E42635E7acAc8Bb7851963Bc9d29B1dAAd409", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "interchainSecurityModule": "0x7664aAE6C1bCFfe364F742c75f52D3dC70FF412E", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableIsm": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", + "protocolFee": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x95cE3183137f906753463933C5dfDe777D2E7fE2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "testRecipient": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "index": { + "from": 612005 + } + }, + "sonic": { + "blockExplorers": [ + { + "apiUrl": "https://api.sonicscan.org/api", + "family": "etherscan", + "name": "Sonic Explorer", + "url": "https://sonicscan.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 146, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic", + "domainId": 146, + "gasCurrencyCoinGeckoId": "fantom", + "name": "sonic", + "nativeToken": { + "decimals": 18, + "name": "Sonic", + "symbol": "S" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.soniclabs.com" + } + ], + "technicalStack": "other", + "aggregationHook": "0x2A3E42635E7acAc8Bb7851963Bc9d29B1dAAd409", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "interchainSecurityModule": "0x794BF08dE42238809d811193A6189D6d03177DF8", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableIsm": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", + "protocolFee": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x95cE3183137f906753463933C5dfDe777D2E7fE2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "testRecipient": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "index": { + "from": 482156 + } + }, + "telos": { + "blockExplorers": [ + { + "apiUrl": "https://www.teloscan.io/api", + "family": "other", + "name": "Teloscan", + "url": "https://www.teloscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": "finalized" + }, + "chainId": 40, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Telos EVM", + "domainId": 40, + "gasCurrencyCoinGeckoId": "telos", + "name": "telos", + "nativeToken": { + "decimals": 18, + "name": "Telos", + "symbol": "TLOS" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.telos.net" + }, + { + "http": "https://telos.drpc.org" + } + ], + "technicalStack": "other", + "aggregationHook": "0x2A3E42635E7acAc8Bb7851963Bc9d29B1dAAd409", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountRouter": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", + "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "interchainSecurityModule": "0x557862e7ADd75E72779316b119F75358b3445102", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "pausableIsm": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", + "protocolFee": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x95cE3183137f906753463933C5dfDe777D2E7fE2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "testRecipient": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "index": { + "from": 378761707 + } + }, + "soon": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.soo.network/", + "family": "other", + "name": "SOON Explorer", + "url": "https://explorer.soo.network/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.05, + "reorgPeriod": 0 + }, + "chainId": 50075007, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "SOON", + "domainId": 50075007, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 1, + "mode": "sequence", + "chunk": 20 + }, + "name": "soon", + "nativeToken": { + "decimals": 9, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://rpc.mainnet.soo.network/rpc" + } + ], + "technicalStack": "other", + "interchainGasPaymaster": "Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ", + "interchainSecurityModule": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM", + "mailbox": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", + "merkleTreeHook": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", + "validatorAnnounce": "GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz" + }, + "torus": { + "blockExplorers": [ + { + "apiUrl": "https://api.blockscout.torus.network/api", + "family": "blockscout", + "name": "Torus Explorer", + "url": "https://blockscout.torus.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 8, + "reorgPeriod": "finalized" + }, + "chainId": 21000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Torus", + "domainId": 21000, + "gasCurrencyCoinGeckoId": "torus", + "name": "torus", + "nativeToken": { + "decimals": 18, + "name": "Torus", + "symbol": "TORUS" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://api-hyperlane.nodes.torus.network" + }, + { + "http": "https://api.torus.network" + } + ], + "technicalStack": "polkadotsubstrate", + "aggregationHook": "0xfe94Ea7DA6C45849D395e3d03973aa924553b937", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "interchainAccountIsm": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", + "interchainAccountRouter": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", + "interchainGasPaymaster": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", + "interchainSecurityModule": "0x8f1953EFbd2C720223faD02d6CB5CD25f97D7fC9", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "pausableHook": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "pausableIsm": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "protocolFee": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x8f1953EFbd2C720223faD02d6CB5CD25f97D7fC9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", + "testRecipient": "0x92249B8ed35C2980e58666a3EBF4a075DDD2895f", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", + "index": { + "from": 40622 + } + }, + "artela": { + "blockExplorers": [ + { + "apiUrl": "https://artscan.artela.network/api", + "family": "other", + "name": "Artela Explorer", + "url": "https://artscan.artela.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 11820, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Artela", + "domainId": 11820, + "gasCurrencyCoinGeckoId": "artela", + "name": "artela", + "nativeToken": { + "decimals": 18, + "name": "Artela", + "symbol": "ART" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://node-euro.artela.network/rpc" + }, + { + "http": "https://node-hongkong.artela.network/rpc" + } + ], + "technicalStack": "other", + "aggregationHook": "0x79B1c9E49396A62AFf9B072A0DebD010D4b80455", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountIsm": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "interchainAccountRouter": "0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB", + "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "pausableIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", + "protocolFee": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "testRecipient": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "index": { + "from": 75891 + } + }, + "guru": { + "blockExplorers": [ + { + "apiUrl": "https://blockscout.gurunetwork.ai/api", + "family": "blockscout", + "name": "Guru Explorer", + "url": "https://blockscout.gurunetwork.ai" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 260, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Guru Network", + "domainId": 260, + "gasCurrencyCoinGeckoId": "guru-network", + "name": "guru", + "nativeToken": { + "decimals": 18, + "name": "Guru Network", + "symbol": "GURU" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.gurunetwork.ai/archive/260" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x84cfF1F756DF5d1532DAD539ABCE18eE328c84f7", + "domainRoutingIsm": "0x494415e823236A05c608D6b777bC80082cED6A2E", + "domainRoutingIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "fallbackRoutingHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "interchainAccountIsm": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "interchainAccountRouter": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187", + "interchainGasPaymaster": "0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b", + "interchainSecurityModule": "0xDbCf838Fbf126D0d99B7D384dA416663A97Da867", + "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "merkleTreeHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "pausableHook": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "pausableIsm": "0xD8aF449f8fEFbA2064863DCE5aC248F8B232635F", + "protocolFee": "0xff72A726Ce261846f2dF6F32113e514b5Ddb0E37", + "proxyAdmin": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "staticAggregationHookFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "staticAggregationIsm": "0xDbCf838Fbf126D0d99B7D384dA416663A97Da867", + "staticAggregationIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticMerkleRootMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMerkleRootWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "staticMessageIdMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMessageIdWeightedMultisigIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "storageGasOracle": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "testRecipient": "0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "index": { + "from": 4511934 + } + }, + "hemi": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.hemi.xyz/api", + "family": "blockscout", + "name": "Hemi Explorer", + "url": "https://explorer.hemi.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 12, + "reorgPeriod": 5 + }, + "chainId": 43111, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Hemi Network", + "domainId": 43111, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "hemi", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.hemi.network/rpc" + } + ], + "technicalStack": "other", + "aggregationHook": "0x79B1c9E49396A62AFf9B072A0DebD010D4b80455", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountIsm": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9", + "interchainAccountRouter": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", + "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "pausableIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", + "protocolFee": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "testRecipient": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "index": { + "from": 881513 + } + }, + "nero": { + "blockExplorers": [ + { + "apiUrl": "https://api.neroscan.io/api", + "family": "etherscan", + "name": "Neroscan", + "url": "https://www.neroscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 5 + }, + "chainId": 1689, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Nero", + "domainId": 1689, + "gasCurrencyCoinGeckoId": "nerochain", + "gnosisSafeTransactionServiceUrl": "https://multisign.nerochain.io/txs/", + "name": "nero", + "nativeToken": { + "decimals": 18, + "name": "Nero", + "symbol": "NERO" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.nerochain.io" + } + ], + "technicalStack": "other", + "aggregationHook": "0x79B1c9E49396A62AFf9B072A0DebD010D4b80455", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountIsm": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", + "interchainAccountRouter": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "pausableIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", + "protocolFee": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "testRecipient": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "index": { + "from": 1623141 + }, + "transactionOverrides": { + "maxFeePerGas": 10000000000, + "maxPriorityFeePerGas": 1000000000 + } + }, + "xpla": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.xpla.io/mainnet/api", + "family": "other", + "name": "XPLA Explorer", + "url": "https://explorer.xpla.io/mainnet" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 6, + "reorgPeriod": 5 + }, + "chainId": 37, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "XPLA", + "domainId": 37, + "gasCurrencyCoinGeckoId": "xpla", + "name": "xpla", + "nativeToken": { + "decimals": 18, + "name": "XPLA", + "symbol": "XPLA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://dimension-evm-rpc.xpla.dev" + } + ], + "technicalStack": "other", + "aggregationHook": "0xC4d5F57ac4C1D076E13D5fE299AB26c8f5698454", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountIsm": "0xE350143242a2F7962F23D71ee9Dd98f6e86D1772", + "interchainAccountRouter": "0x5B24EE24049582fF74c1d311d72c70bA5B76a554", + "interchainGasPaymaster": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "interchainSecurityModule": "0x4d33DB9EEb44274BA7362DF412392E70D9F53F16", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "pausableIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", + "protocolFee": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "testRecipient": "0x7Ce3a48cd9FD80004d95b088760bD05bA86C1f7b", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e", + "index": { + "from": 12446115 + } } }, "defaultRpcConsensusType": "fallback" diff --git a/rust/main/config/testnet_config.json b/rust/main/config/testnet_config.json index e5e01dcaf8..6f8dca0b8d 100644 --- a/rust/main/config/testnet_config.json +++ b/rust/main/config/testnet_config.json @@ -1232,10 +1232,10 @@ "formtestnet": { "blockExplorers": [ { - "apiUrl": "https://explorer.form.network/api", + "apiUrl": "https://sepolia-explorer.form.network/api", "family": "blockscout", "name": "Form Testnet Explorer", - "url": "https://explorer.form.network" + "url": "https://sepolia-explorer.form.network" } ], "blocks": { diff --git a/rust/main/helm/hyperlane-agent/templates/external-secret.yaml b/rust/main/helm/hyperlane-agent/templates/external-secret.yaml index 9be0700b75..f3a6980d21 100644 --- a/rust/main/helm/hyperlane-agent/templates/external-secret.yaml +++ b/rust/main/helm/hyperlane-agent/templates/external-secret.yaml @@ -30,6 +30,14 @@ spec: {{- if eq .protocol "cosmos" }} HYP_CHAINS_{{ .name | upper }}_CUSTOMGRPCURLS: {{ printf "'{{ .%s_grpcs | mustFromJson | join \",\" }}'" .name }} {{- end }} + {{- if eq .protocol "sealevel" }} + {{- if eq ((.priorityFeeOracle).type) "helius" }} + HYP_CHAINS_{{ .name | upper }}_PRIORITYFEEORACLE_URL: {{ printf "'{{ .%s_helius }}'" .name }} + {{- end }} + {{- if eq ((.transactionSubmitter).url) "helius" }} + HYP_CHAINS_{{ .name | upper }}_TRANSACTIONSUBMITTER_URL: {{ printf "'{{ .%s_helius }}'" .name }} + {{- end }} + {{- end }} {{- end }} data: {{- /* @@ -45,4 +53,9 @@ spec: remoteRef: key: {{ printf "%s-grpc-endpoints-%s" $.Values.hyperlane.runEnv .name }} {{- end }} + {{- if and (eq .protocol "sealevel") (or (eq ((.priorityFeeOracle).type) "helius") (eq ((.transactionSubmitter).url) "helius")) }} + - secretKey: {{ printf "%s_helius" .name }} + remoteRef: + key: {{ printf "%s-rpc-endpoint-helius-%s" $.Values.hyperlane.runEnv .name }} + {{- end }} {{- end }} diff --git a/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml b/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml index da69543d8e..47be9ad2e9 100644 --- a/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml +++ b/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml @@ -17,7 +17,9 @@ spec: metadata: annotations: checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/external-secret: {{ include (print $.Template.BasePath "/external-secret.yaml") . | sha256sum }} checksum/relayer-configmap: {{ include (print $.Template.BasePath "/relayer-configmap.yaml") . | sha256sum }} + checksum/relayer-external-secret: {{ include (print $.Template.BasePath "/relayer-external-secret.yaml") . | sha256sum }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }} diff --git a/rust/main/helm/hyperlane-agent/templates/scraper-statefulset.yaml b/rust/main/helm/hyperlane-agent/templates/scraper-statefulset.yaml index 06326e260c..1b419e1123 100644 --- a/rust/main/helm/hyperlane-agent/templates/scraper-statefulset.yaml +++ b/rust/main/helm/hyperlane-agent/templates/scraper-statefulset.yaml @@ -17,6 +17,8 @@ spec: metadata: annotations: checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/external-secret: {{ include (print $.Template.BasePath "/external-secret.yaml") . | sha256sum }} + checksum/scraper-external-secret: {{ include (print $.Template.BasePath "/scraper-external-secret.yaml") . | sha256sum }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }} diff --git a/rust/main/helm/hyperlane-agent/templates/validator-statefulset.yaml b/rust/main/helm/hyperlane-agent/templates/validator-statefulset.yaml index 1b0a87dd41..b5929bfd99 100644 --- a/rust/main/helm/hyperlane-agent/templates/validator-statefulset.yaml +++ b/rust/main/helm/hyperlane-agent/templates/validator-statefulset.yaml @@ -17,7 +17,9 @@ spec: metadata: annotations: checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/external-secret: {{ include (print $.Template.BasePath "/external-secret.yaml") . | sha256sum }} checksum/validator-configmap: {{ include (print $.Template.BasePath "/validator-configmap.yaml") . | sha256sum }} + checksum/scraper-external-secret: {{ include (print $.Template.BasePath "/scraper-external-secret.yaml") . | sha256sum }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }} diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/metrics.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/metrics.rs new file mode 100644 index 0000000000..8918da99f9 --- /dev/null +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/metrics.rs @@ -0,0 +1,65 @@ +use prometheus::IntGaugeVec; + +use crate::CoreMetrics; + +/// Struct encapsulating prometheus metrics used by SequenceAware and RateLimited cursors. +#[derive(Debug, Clone)] +pub struct CursorMetrics { + /// Current block of the cursor. + /// Used by both sequence aware and rate limited cursors. + /// Labels: + /// - `event_type`: the event type the cursor is indexing. Could be anything implementing `Indexable`. + /// - `chain`: Chain the cursor is collecting data from. + /// - `cursor_type`: The type of cursor. E.g. `forward_sequenced`, `backward_sequenced`, `forward_rate_limited`. + pub cursor_current_block: IntGaugeVec, + + /// Current sequence of the cursor. + /// Only used by sequence aware cursors. + /// Labels: + /// - `event_type`: the event type the cursor is indexing. Could be anything implementing `Indexable`. + /// - `chain`: Chain the cursor is collecting data from. + /// - `cursor_type`: The type of cursor. E.g. `forward_sequenced`, `backward_sequenced`, `forward_rate_limited`. + pub cursor_current_sequence: IntGaugeVec, + + /// Max sequence of the cursor. + /// Only used by sequence aware cursors. + /// Labels: + /// - `event_type`: the event type the cursor is indexing. Could be anything implementing `Indexable`. + /// - `chain`: Chain the cursor is collecting data from. + pub cursor_max_sequence: IntGaugeVec, +} + +impl CursorMetrics { + /// Instantiate a new CursorMetrics object. + pub fn new(metrics: &CoreMetrics) -> Self { + let cursor_current_block = metrics + .new_int_gauge( + "cursor_current_block", + "Current block of the cursor", + &["event_type", "chain", "cursor_type"], + ) + .expect("failed to register cursor_current_block metric"); + + let cursor_current_sequence = metrics + .new_int_gauge( + "cursor_current_sequence", + "Current sequence of the cursor", + &["event_type", "chain", "cursor_type"], + ) + .expect("failed to register cursor_current_sequence metric"); + + let cursor_max_sequence = metrics + .new_int_gauge( + "cursor_max_sequence", + "Max sequence of the cursor", + &["event_type", "chain"], + ) + .expect("failed to register cursor_max_sequence metric"); + + CursorMetrics { + cursor_current_block, + cursor_current_sequence, + cursor_max_sequence, + } + } +} diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/mod.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/mod.rs index 563d0fcc74..2fb36453e4 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/mod.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/mod.rs @@ -1,13 +1,16 @@ -pub(crate) mod sequence_aware; - use hyperlane_core::{ Delivery, HyperlaneDomainProtocol, HyperlaneMessage, InterchainGasPayment, MerkleTreeInsertion, }; + +pub(crate) mod sequence_aware; pub(crate) use sequence_aware::ForwardBackwardSequenceAwareSyncCursor; pub(crate) mod rate_limited; pub(crate) use rate_limited::RateLimitedContractSyncCursor; +pub(crate) mod metrics; +pub(crate) use metrics::CursorMetrics; + pub enum CursorType { SequenceAware, RateLimited, @@ -24,6 +27,8 @@ pub trait Indexable { fn broadcast_channel_size() -> Option { None } + /// Returns the name of the type for metrics. + fn name() -> &'static str; } impl Indexable for HyperlaneMessage { @@ -40,6 +45,10 @@ impl Indexable for HyperlaneMessage { fn broadcast_channel_size() -> Option { TX_ID_CHANNEL_CAPACITY } + + fn name() -> &'static str { + "hyperlane_message" + } } impl Indexable for InterchainGasPayment { @@ -51,6 +60,10 @@ impl Indexable for InterchainGasPayment { HyperlaneDomainProtocol::Cosmos => CursorType::RateLimited, } } + + fn name() -> &'static str { + "interchain_gas_payment" + } } impl Indexable for MerkleTreeInsertion { @@ -62,6 +75,10 @@ impl Indexable for MerkleTreeInsertion { HyperlaneDomainProtocol::Cosmos => CursorType::SequenceAware, } } + + fn name() -> &'static str { + "merkle_tree_insertion" + } } impl Indexable for Delivery { @@ -73,4 +90,8 @@ impl Indexable for Delivery { HyperlaneDomainProtocol::Cosmos => CursorType::RateLimited, } } + + fn name() -> &'static str { + "delivery" + } } diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/rate_limited.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/rate_limited.rs index 9428d6bfd4..88c5784824 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/rate_limited.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/rate_limited.rs @@ -8,12 +8,16 @@ use std::{ use async_trait::async_trait; use derive_new::new; use eyre::Result; + use hyperlane_core::{ - ContractSyncCursor, CursorAction, HyperlaneWatermarkedLogStore, Indexed, Indexer, LogMeta, + ContractSyncCursor, CursorAction, HyperlaneDomain, HyperlaneWatermarkedLogStore, Indexed, + Indexer, LogMeta, }; use crate::contract_sync::eta_calculator::SyncerEtaCalculator; +use super::{CursorMetrics, Indexable}; + /// Time window for the moving average used in the eta calculator in seconds. const ETA_TIME_WINDOW: f64 = 2. * 60.; @@ -83,12 +87,16 @@ pub(crate) struct RateLimitedContractSyncCursor { last_tip_update: Instant, eta_calculator: SyncerEtaCalculator, sync_state: SyncState, + metrics: Arc, + domain: HyperlaneDomain, } -impl RateLimitedContractSyncCursor { +impl RateLimitedContractSyncCursor { /// Construct a new contract sync helper. pub async fn new( indexer: Arc>, + metrics: Arc, + domain: &HyperlaneDomain, store: Arc>, chunk_size: u32, initial_height: u32, @@ -107,6 +115,8 @@ impl RateLimitedContractSyncCursor { // The rate limited cursor currently only syncs in the forward direction. SyncDirection::Forward, ), + metrics, + domain: domain.to_owned(), }) } @@ -155,12 +165,24 @@ impl RateLimitedContractSyncCursor { Duration::from_secs(0) } } + + async fn update_metrics(&self) { + let latest_block = self.latest_queried_block(); + let chain_name = self.domain.name(); + // The rate limited cursor currently only syncs in the forward direction. + let label_values = &[T::name(), chain_name, "forward_rate_limited"]; + + self.metrics + .cursor_current_block + .with_label_values(label_values) + .set(latest_block as i64); + } } #[async_trait] impl ContractSyncCursor for RateLimitedContractSyncCursor where - T: Send + Sync + Debug + 'static, + T: Indexable + Send + Sync + Debug + 'static, { async fn next_action(&mut self) -> Result<(CursorAction, Duration)> { let eta = self.sync_eta(); @@ -187,6 +209,7 @@ where _: Vec<(Indexed, LogMeta)>, range: RangeInclusive, ) -> Result<()> { + self.update_metrics().await; // Store a relatively conservative view of the high watermark, which should allow a single watermark to be // safely shared across multiple cursors, so long as they are running sufficiently in sync self.store @@ -216,12 +239,13 @@ where } } -impl Debug for RateLimitedContractSyncCursor { +impl Debug for RateLimitedContractSyncCursor { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("RateLimitedContractSyncCursor") .field("tip", &self.tip) .field("last_tip_update", &self.last_tip_update) .field("sync_state", &self.sync_state) + .field("domain", &self.domain) .finish() } } @@ -229,50 +253,92 @@ impl Debug for RateLimitedContractSyncCursor { #[cfg(test)] pub(crate) mod test { use super::*; - use hyperlane_core::{ChainResult, HyperlaneLogStore}; + use crate::cursors::CursorType; + use hyperlane_core::{ChainResult, HyperlaneDomainProtocol, HyperlaneLogStore}; use mockall::{self, Sequence}; const CHUNK_SIZE: u32 = 10; const INITIAL_HEIGHT: u32 = 0; + #[derive(Debug, Clone)] + struct MockIndexable; + + unsafe impl Sync for MockIndexable {} + unsafe impl Send for MockIndexable {} + + impl Indexable for MockIndexable { + fn indexing_cursor(_domain: HyperlaneDomainProtocol) -> CursorType { + CursorType::RateLimited + } + + fn name() -> &'static str { + "mock_indexable" + } + } + mockall::mock! { - pub Indexer {} + pub Indexer {} - impl Debug for Indexer { + impl Debug for Indexer { fn fmt<'a>(&self, f: &mut std::fmt::Formatter<'a>) -> std::fmt::Result; } #[async_trait] - impl Indexer<()> for Indexer { - async fn fetch_logs_in_range(&self, range: RangeInclusive) -> ChainResult , LogMeta)>>; + impl Indexer for Indexer { + async fn fetch_logs_in_range(&self, range: RangeInclusive) -> ChainResult, LogMeta)>>; async fn get_finalized_block_number(&self) -> ChainResult; } } mockall::mock! { - pub Db {} + pub Db {} - impl Debug for Db { + impl Debug for Db { fn fmt<'a>(&self, f: &mut std::fmt::Formatter<'a>) -> std::fmt::Result; } #[async_trait] - impl HyperlaneLogStore<()> for Db { - async fn store_logs(&self, logs: &[(hyperlane_core::Indexed<()> , LogMeta)]) -> Result; + impl HyperlaneLogStore for Db { + async fn store_logs(&self, logs: &[(hyperlane_core::Indexed, LogMeta)]) -> Result; } #[async_trait] - impl HyperlaneWatermarkedLogStore<()> for Db { + impl HyperlaneWatermarkedLogStore for Db { async fn retrieve_high_watermark(&self) -> Result>; async fn store_high_watermark(&self, block_number: u32) -> Result<()>; } } - async fn mock_rate_limited_cursor( + fn mock_cursor_metrics() -> CursorMetrics { + CursorMetrics { + cursor_current_block: prometheus::IntGaugeVec::new( + prometheus::Opts::new("cursor_current_block", "Current block of the cursor") + .namespace("mock") + .subsystem("cursor"), + &["event_type", "chain", "cursor_type"], + ) + .unwrap(), + cursor_current_sequence: prometheus::IntGaugeVec::new( + prometheus::Opts::new("cursor_current_sequence", "Current sequence of the cursor") + .namespace("mock") + .subsystem("cursor"), + &["event_type", "chain", "cursor_type"], + ) + .unwrap(), + cursor_max_sequence: prometheus::IntGaugeVec::new( + prometheus::Opts::new("cursor_max_sequence", "Max sequence of the cursor") + .namespace("mock") + .subsystem("cursor"), + &["event_type", "chain"], + ) + .unwrap(), + } + } + async fn mock_rate_limited_cursor( custom_chain_tips: Option>, - ) -> RateLimitedContractSyncCursor<()> { + ) -> RateLimitedContractSyncCursor { let mut seq = Sequence::new(); - let mut indexer = MockIndexer::new(); + let mut indexer = MockIndexer::::new(); match custom_chain_tips { Some(chain_tips) => { for tip in chain_tips { @@ -294,11 +360,14 @@ pub(crate) mod test { } let mut db = MockDb::new(); + let metrics = mock_cursor_metrics(); db.expect_store_high_watermark().returning(|_| Ok(())); let chunk_size = CHUNK_SIZE; let initial_height = INITIAL_HEIGHT; RateLimitedContractSyncCursor::new( Arc::new(indexer), + Arc::new(metrics), + &HyperlaneDomain::new_test_domain("test"), Arc::new(db), chunk_size, initial_height, @@ -309,7 +378,7 @@ pub(crate) mod test { #[tokio::test] async fn test_next_action_retries_if_update_isnt_called() { - let mut cursor = mock_rate_limited_cursor(None).await; + let mut cursor = mock_rate_limited_cursor::(None).await; let (action_1, _) = cursor.next_action().await.unwrap(); let (_action_2, _) = cursor.next_action().await.unwrap(); @@ -319,7 +388,7 @@ pub(crate) mod test { #[tokio::test] async fn test_next_action_changes_if_update_is_called() { - let mut cursor = mock_rate_limited_cursor(None).await; + let mut cursor = mock_rate_limited_cursor::(None).await; let (action_1, _) = cursor.next_action().await.unwrap(); let range = match action_1 { @@ -336,7 +405,7 @@ pub(crate) mod test { #[tokio::test] async fn test_next_action_sleeps_if_tip_is_not_updated() { let chain_tips = vec![10]; - let mut cursor = mock_rate_limited_cursor(Some(chain_tips)).await; + let mut cursor = mock_rate_limited_cursor::(Some(chain_tips)).await; let (action, _) = cursor.next_action().await.unwrap(); assert!(matches!(action, CursorAction::Sleep(_))); } diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/backward.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/backward.rs index 179ae3dd3c..d7c9396ca9 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/backward.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/backward.rs @@ -4,15 +4,19 @@ use std::{collections::HashSet, fmt::Debug, ops::RangeInclusive, sync::Arc, time use async_trait::async_trait; use eyre::Result; -use hyperlane_core::{ - indexed_to_sequence_indexed_array, ContractSyncCursor, CursorAction, - HyperlaneSequenceAwareIndexerStoreReader, IndexMode, Indexed, LogMeta, SequenceIndexed, -}; use itertools::Itertools; +use maplit::hashmap; use tokio::time::sleep; use tracing::{debug, instrument, warn}; -use super::{LastIndexedSnapshot, TargetSnapshot}; +use hyperlane_core::{ + indexed_to_sequence_indexed_array, ContractSyncCursor, CursorAction, HyperlaneDomain, + HyperlaneSequenceAwareIndexerStoreReader, IndexMode, Indexed, LogMeta, SequenceIndexed, +}; + +use crate::cursors::Indexable; + +use super::{CursorMetrics, LastIndexedSnapshot, MetricsData, TargetSnapshot}; const MAX_BACKWARD_SYNC_BLOCKING_TIME: Duration = Duration::from_secs(5); @@ -33,6 +37,10 @@ pub(crate) struct BackwardSequenceAwareSyncCursor { current_indexing_snapshot: Option, /// The mode of indexing to use. index_mode: IndexMode, + /// The domain of the cursor. + domain: HyperlaneDomain, + /// Cursor metrics. + metrics: Arc, } impl Debug for BackwardSequenceAwareSyncCursor { @@ -42,13 +50,14 @@ impl Debug for BackwardSequenceAwareSyncCursor { .field("last_indexed_snapshot", &self.last_indexed_snapshot) .field("current_indexing_snapshot", &self.current_indexing_snapshot) .field("index_mode", &self.index_mode) + .field("domain", &self.domain) .finish() } } -impl BackwardSequenceAwareSyncCursor { +impl BackwardSequenceAwareSyncCursor { #[instrument( - skip(store), + skip(store, metrics_data), fields(chunk_size, next_sequence, start_block, index_mode), ret )] @@ -58,6 +67,7 @@ impl BackwardSequenceAwareSyncCursor { current_sequence_count: u32, start_block: u32, index_mode: IndexMode, + metrics_data: MetricsData, ) -> Self { // If the current sequence count is 0, we haven't indexed anything yet. // Otherwise, consider the current sequence count as the last indexed snapshot, @@ -66,6 +76,7 @@ impl BackwardSequenceAwareSyncCursor { sequence: (current_sequence_count > 0).then_some(current_sequence_count), at_block: start_block, }; + let MetricsData { domain, metrics } = metrics_data; Self { chunk_size, @@ -73,9 +84,16 @@ impl BackwardSequenceAwareSyncCursor { current_indexing_snapshot: last_indexed_snapshot.previous_target(), last_indexed_snapshot, index_mode, + domain, + metrics, } } + /// Get the last indexed sequence or 0 if no logs have been indexed yet. + pub fn last_sequence(&self) -> u32 { + self.last_indexed_snapshot.sequence.unwrap_or(0) + } + /// Gets the next range of logs to query. /// If the cursor is fully synced, this returns None. /// Otherwise, it returns the next range to query, either by block or sequence depending on the mode. @@ -325,10 +343,31 @@ impl BackwardSequenceAwareSyncCursor { fn rewind(&mut self) { self.current_indexing_snapshot = self.last_indexed_snapshot.previous_target(); } + + /// Updates the cursor metrics. + async fn update_metrics(&self) { + let labels = hashmap! { + "event_type" => T::name(), + "chain" => self.domain.name(), + "cursor_type" => "backward_sequenced", + }; + + let latest_block = self.latest_queried_block(); + self.metrics + .cursor_current_block + .with(&labels) + .set(latest_block as i64); + + let sequence = self.last_sequence(); + self.metrics + .cursor_current_sequence + .with(&labels) + .set(sequence as i64); + } } #[async_trait] -impl ContractSyncCursor +impl ContractSyncCursor for BackwardSequenceAwareSyncCursor { async fn next_action(&mut self) -> Result<(CursorAction, Duration)> { @@ -364,6 +403,7 @@ impl ContractSyncCursor logs: Vec<(Indexed, LogMeta)>, range: RangeInclusive, ) -> Result<()> { + self.update_metrics().await; let Some(current_indexing_snapshot) = self.current_indexing_snapshot.clone() else { // We're synced, no need to update at all. return Ok(()); @@ -400,6 +440,8 @@ impl ContractSyncCursor #[cfg(test)] mod test { + use hyperlane_core::HyperlaneDomain; + use super::super::forward::test::*; use super::*; @@ -435,12 +477,17 @@ mod test { ], }); + let metrics_data = MetricsData { + domain: HyperlaneDomain::new_test_domain("test"), + metrics: Arc::new(mock_cursor_metrics()), + }; let mut cursor = BackwardSequenceAwareSyncCursor::new( chunk_size, db, INITIAL_SEQUENCE_COUNT, INITIAL_START_BLOCK, mode, + metrics_data, ); // Skip any already indexed logs and sanity check we start at the correct spot. @@ -767,12 +814,17 @@ mod test { .collect(), }); + let metrics_data = MetricsData { + domain: HyperlaneDomain::new_test_domain("test"), + metrics: Arc::new(mock_cursor_metrics()), + }; let mut cursor = BackwardSequenceAwareSyncCursor::new( CHUNK_SIZE, db, INITIAL_SEQUENCE_COUNT, INITIAL_START_BLOCK, INDEX_MODE, + metrics_data, ); // We're fully synced, so expect no range diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs index 967f4e6053..79917dd663 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs @@ -7,15 +7,19 @@ use std::{ use async_trait::async_trait; use eyre::Result; +use itertools::Itertools; +use maplit::hashmap; +use tracing::{debug, instrument, warn}; + use hyperlane_core::{ - indexed_to_sequence_indexed_array, ContractSyncCursor, CursorAction, + indexed_to_sequence_indexed_array, ContractSyncCursor, CursorAction, HyperlaneDomain, HyperlaneSequenceAwareIndexerStoreReader, IndexMode, Indexed, LogMeta, SequenceAwareIndexer, SequenceIndexed, }; -use itertools::Itertools; -use tracing::{debug, instrument, warn}; -use super::{LastIndexedSnapshot, TargetSnapshot}; +use crate::cursors::Indexable; + +use super::{CursorMetrics, LastIndexedSnapshot, MetricsData, TargetSnapshot}; /// A sequence-aware cursor that syncs forwards in perpetuity. pub(crate) struct ForwardSequenceAwareSyncCursor { @@ -39,6 +43,10 @@ pub(crate) struct ForwardSequenceAwareSyncCursor { target_snapshot: Option, /// The mode of indexing. index_mode: IndexMode, + /// The domain the cursor is indexing. + domain: HyperlaneDomain, + /// Cursor metrics. + metrics: Arc, } impl Debug for ForwardSequenceAwareSyncCursor { @@ -49,13 +57,14 @@ impl Debug for ForwardSequenceAwareSyncCursor { .field("current_indexing_snapshot", &self.current_indexing_snapshot) .field("target_snapshot", &self.target_snapshot) .field("index_mode", &self.index_mode) + .field("domain", &self.domain) .finish() } } -impl ForwardSequenceAwareSyncCursor { +impl ForwardSequenceAwareSyncCursor { #[instrument( - skip(store, latest_sequence_querier), + skip(store, latest_sequence_querier, metrics_data), fields(chunk_size, next_sequence, start_block, index_mode), ret )] @@ -66,6 +75,7 @@ impl ForwardSequenceAwareSyncCursor { next_sequence: u32, start_block: u32, index_mode: IndexMode, + metrics_data: MetricsData, ) -> Self { // If the next sequence is 0, we're starting from the beginning and haven't // indexed anything yet. @@ -73,6 +83,7 @@ impl ForwardSequenceAwareSyncCursor { sequence: (next_sequence > 0).then(|| next_sequence.saturating_sub(1)), at_block: start_block, }; + let MetricsData { domain, metrics } = metrics_data; Self { chunk_size, @@ -85,9 +96,27 @@ impl ForwardSequenceAwareSyncCursor { }, target_snapshot: None, index_mode, + domain, + metrics, } } + /// Get target sequence or return 0 if request failed + pub async fn target_sequence(&self) -> u32 { + let (count, _) = self + .latest_sequence_querier + .latest_sequence_count_and_tip() + .await + .ok() + .unwrap_or((None, 0)); + count.unwrap_or(0).saturating_sub(1) + } + + /// Get the last indexed sequence or 0 if no logs have been indexed yet. + pub fn last_sequence(&self) -> u32 { + self.last_indexed_snapshot.sequence.unwrap_or(0) + } + /// Gets the next range of logs to index. /// If there are no logs to index, returns `None`. /// If there are logs to index, returns the range of logs, either by sequence or block number @@ -401,10 +430,38 @@ impl ForwardSequenceAwareSyncCursor { fn rewind(&mut self) { self.current_indexing_snapshot = self.last_indexed_snapshot.next_target(); } + + // Updates the cursor metrics. + async fn update_metrics(&self) { + let mut labels = hashmap! { + "event_type" => T::name(), + "chain" => self.domain.name(), + "cursor_type" => "forward_sequenced", + }; + + let latest_block = self.latest_queried_block(); + self.metrics + .cursor_current_block + .with(&labels) + .set(latest_block as i64); + + let sequence = self.last_sequence(); + self.metrics + .cursor_current_sequence + .with(&labels) + .set(sequence as i64); + + labels.remove("cursor_type"); + let max_sequence = self.target_sequence().await as i64; + self.metrics + .cursor_max_sequence + .with(&labels) + .set(max_sequence); + } } #[async_trait] -impl ContractSyncCursor +impl ContractSyncCursor for ForwardSequenceAwareSyncCursor { async fn next_action(&mut self) -> Result<(CursorAction, Duration)> { @@ -444,6 +501,7 @@ impl ContractSyncCursor logs: Vec<(Indexed, LogMeta)>, range: RangeInclusive, ) -> Result<()> { + self.update_metrics().await; // Remove any sequence duplicates, filter out any logs preceding our current snapshot, // and sort in ascending order. let logs = indexed_to_sequence_indexed_array(logs)? @@ -469,7 +527,11 @@ impl ContractSyncCursor #[cfg(test)] pub(crate) mod test { use derive_new::new; - use hyperlane_core::{ChainResult, HyperlaneLogStore, Indexed, Indexer, Sequenced}; + use hyperlane_core::{ + ChainResult, HyperlaneDomainProtocol, HyperlaneLogStore, Indexed, Indexer, Sequenced, + }; + + use crate::cursors::CursorType; use super::*; @@ -482,7 +544,7 @@ pub(crate) mod test { #[async_trait] impl SequenceAwareIndexer for MockLatestSequenceQuerier where - T: Sequenced + Debug, + T: Sequenced + Debug + Clone + Send + Sync + Indexable + 'static, { async fn latest_sequence_count_and_tip(&self) -> ChainResult<(Option, u32)> { Ok((self.latest_sequence_count, self.tip)) @@ -492,7 +554,7 @@ pub(crate) mod test { #[async_trait] impl Indexer for MockLatestSequenceQuerier where - T: Sequenced + Debug, + T: Sequenced + Debug + Clone + Send + Sync + Indexable + 'static, { async fn fetch_logs_in_range( &self, @@ -512,15 +574,17 @@ pub(crate) mod test { } #[async_trait] - impl HyperlaneLogStore for MockHyperlaneSequenceAwareIndexerStore { + impl HyperlaneLogStore + for MockHyperlaneSequenceAwareIndexerStore + { async fn store_logs(&self, logs: &[(Indexed, LogMeta)]) -> eyre::Result { Ok(logs.len() as u32) } } #[async_trait] - impl HyperlaneSequenceAwareIndexerStoreReader - for MockHyperlaneSequenceAwareIndexerStore + impl + HyperlaneSequenceAwareIndexerStoreReader for MockHyperlaneSequenceAwareIndexerStore { async fn retrieve_by_sequence(&self, sequence: u32) -> eyre::Result> { Ok(self @@ -547,6 +611,9 @@ pub(crate) mod test { pub sequence: u32, } + unsafe impl Sync for MockSequencedData {} + unsafe impl Send for MockSequencedData {} + impl From for Indexed { fn from(val: MockSequencedData) -> Self { let sequence = val.sequence; @@ -554,12 +621,48 @@ pub(crate) mod test { } } + impl Indexable for MockSequencedData { + fn indexing_cursor(_domain: HyperlaneDomainProtocol) -> CursorType { + CursorType::SequenceAware + } + + fn name() -> &'static str { + "mock_indexable" + } + } + impl Sequenced for MockSequencedData { fn sequence(&self) -> Option { Some(self.sequence) } } + pub fn mock_cursor_metrics() -> CursorMetrics { + CursorMetrics { + cursor_current_block: prometheus::IntGaugeVec::new( + prometheus::Opts::new("cursor_current_block", "Current block of the cursor") + .namespace("mock") + .subsystem("cursor"), + &["event_type", "chain", "cursor_type"], + ) + .unwrap(), + cursor_current_sequence: prometheus::IntGaugeVec::new( + prometheus::Opts::new("cursor_current_sequence", "Current sequence of the cursor") + .namespace("mock") + .subsystem("cursor"), + &["event_type", "chain", "cursor_type"], + ) + .unwrap(), + cursor_max_sequence: prometheus::IntGaugeVec::new( + prometheus::Opts::new("cursor_max_sequence", "Max sequence of the cursor") + .namespace("mock") + .subsystem("cursor"), + &["event_type", "chain"], + ) + .unwrap(), + } + } + pub fn log_meta_with_block(block_number: u64) -> LogMeta { LogMeta { address: Default::default(), @@ -603,6 +706,10 @@ pub(crate) mod test { ], }); + let metrics_data = MetricsData { + domain: HyperlaneDomain::new_test_domain("test"), + metrics: Arc::new(mock_cursor_metrics()), + }; let mut cursor = ForwardSequenceAwareSyncCursor::new( chunk_size, latest_sequence_querier, @@ -611,6 +718,7 @@ pub(crate) mod test { 3, 70, mode, + metrics_data, ); // Skip any already indexed logs and sanity check we start at the correct spot. diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/mod.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/mod.rs index 74e7ebe014..1e48686379 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/mod.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/mod.rs @@ -1,12 +1,13 @@ +use std::ops::RangeInclusive; use std::{fmt::Debug, sync::Arc, time::Duration}; use async_trait::async_trait; use eyre::Result; + use hyperlane_core::{ - ChainCommunicationError, ContractSyncCursor, CursorAction, + ChainCommunicationError, ContractSyncCursor, CursorAction, HyperlaneDomain, HyperlaneSequenceAwareIndexerStoreReader, IndexMode, Indexed, LogMeta, SequenceAwareIndexer, }; -use std::ops::RangeInclusive; mod backward; mod forward; @@ -14,6 +15,8 @@ mod forward; pub(crate) use backward::BackwardSequenceAwareSyncCursor; pub(crate) use forward::ForwardSequenceAwareSyncCursor; +use super::{CursorMetrics, Indexable}; + #[derive(Debug, Clone, PartialEq, Eq)] struct LastIndexedSnapshot { /// The last sequence that was indexed. @@ -26,6 +29,13 @@ struct LastIndexedSnapshot { pub at_block: u32, } +/// Used to avoid going over the `instrument` macro limit. +#[derive(Debug, Clone)] +struct MetricsData { + pub domain: HyperlaneDomain, + pub metrics: Arc, +} + impl LastIndexedSnapshot { fn next_target(&self) -> TargetSnapshot { TargetSnapshot { @@ -69,9 +79,13 @@ pub(crate) struct ForwardBackwardSequenceAwareSyncCursor { last_direction: SyncDirection, } -impl ForwardBackwardSequenceAwareSyncCursor { +impl + ForwardBackwardSequenceAwareSyncCursor +{ /// Construct a new contract sync helper. pub async fn new( + domain: &HyperlaneDomain, + metrics: Arc, latest_sequence_querier: Arc>, store: Arc>, chunk_size: u32, @@ -83,6 +97,10 @@ impl ForwardBackwardSequenceAwareSyncCursor { let sequence_count = sequence_count.ok_or(ChainCommunicationError::from_other_str( "Failed to query sequence", ))?; + let metrics_data = MetricsData { + domain: domain.to_owned(), + metrics, + }; let forward_cursor = ForwardSequenceAwareSyncCursor::new( chunk_size, latest_sequence_querier.clone(), @@ -90,9 +108,16 @@ impl ForwardBackwardSequenceAwareSyncCursor { sequence_count, tip, mode, + metrics_data.clone(), + ); + let backward_cursor = BackwardSequenceAwareSyncCursor::new( + chunk_size, + store, + sequence_count, + tip, + mode, + metrics_data, ); - let backward_cursor = - BackwardSequenceAwareSyncCursor::new(chunk_size, store, sequence_count, tip, mode); Ok(Self { forward: forward_cursor, backward: backward_cursor, @@ -102,7 +127,7 @@ impl ForwardBackwardSequenceAwareSyncCursor { } #[async_trait] -impl ContractSyncCursor +impl ContractSyncCursor for ForwardBackwardSequenceAwareSyncCursor { async fn next_action(&mut self) -> Result<(CursorAction, Duration)> { diff --git a/rust/main/hyperlane-base/src/contract_sync/metrics.rs b/rust/main/hyperlane-base/src/contract_sync/metrics.rs index 30f3fd02bf..54e3c7a2cb 100644 --- a/rust/main/hyperlane-base/src/contract_sync/metrics.rs +++ b/rust/main/hyperlane-base/src/contract_sync/metrics.rs @@ -1,6 +1,11 @@ -use crate::CoreMetrics; +use std::sync::Arc; + use prometheus::{IntCounterVec, IntGaugeVec}; +use crate::CoreMetrics; + +use super::cursors::CursorMetrics; + /// Struct encapsulating prometheus metrics used by the ContractSync. #[derive(Debug, Clone)] pub struct ContractSyncMetrics { @@ -20,6 +25,9 @@ pub struct ContractSyncMetrics { /// See `last_known_message_nonce` in CoreMetrics. pub message_nonce: IntGaugeVec, + + /// Metrics for SequenceAware and RateLimited cursors. + pub cursor_metrics: Arc, } impl ContractSyncMetrics { @@ -42,11 +50,13 @@ impl ContractSyncMetrics { .expect("failed to register stored_events metric"); let message_nonce = metrics.last_known_message_nonce(); + let cursor_metrics = Arc::new(CursorMetrics::new(metrics)); ContractSyncMetrics { indexed_height, stored_events, message_nonce, + cursor_metrics, } } } diff --git a/rust/main/hyperlane-base/src/contract_sync/mod.rs b/rust/main/hyperlane-base/src/contract_sync/mod.rs index df9563d8a7..c9048b4808 100644 --- a/rust/main/hyperlane-base/src/contract_sync/mod.rs +++ b/rust/main/hyperlane-base/src/contract_sync/mod.rs @@ -312,6 +312,8 @@ where Ok(Box::new( RateLimitedContractSyncCursor::new( Arc::new(self.indexer.clone()), + self.metrics.cursor_metrics.clone(), + self.domain(), self.store.clone(), index_settings.chunk_size, index_settings.from, @@ -352,6 +354,8 @@ where ) -> Result>> { Ok(Box::new( ForwardBackwardSequenceAwareSyncCursor::new( + self.domain(), + self.metrics.cursor_metrics.clone(), self.indexer.clone(), Arc::new(self.store.clone()), index_settings.chunk_size, diff --git a/rust/main/hyperlane-base/src/metrics/core.rs b/rust/main/hyperlane-base/src/metrics/core.rs index 5603ece225..d3cbaf3db4 100644 --- a/rust/main/hyperlane-base/src/metrics/core.rs +++ b/rust/main/hyperlane-base/src/metrics/core.rs @@ -38,6 +38,7 @@ pub struct CoreMetrics { span_counts: IntCounterVec, span_events: IntCounterVec, last_known_message_nonce: IntGaugeVec, + latest_leaf_index: IntGaugeVec, submitter_queue_length: IntGaugeVec, operations_processed_count: IntCounterVec, @@ -112,6 +113,16 @@ impl CoreMetrics { registry )?; + let latest_leaf_index = register_int_gauge_vec_with_registry!( + opts!( + namespaced!("latest_leaf_index"), + "Latest leaf index inserted into the merkle tree", + const_labels_ref + ), + &["origin"], + registry + )?; + let observed_validator_latest_index = register_int_gauge_vec_with_registry!( opts!( namespaced!("observed_validator_latest_index"), @@ -177,6 +188,7 @@ impl CoreMetrics { span_counts, span_events, last_known_message_nonce, + latest_leaf_index, submitter_queue_length, @@ -309,6 +321,14 @@ impl CoreMetrics { self.last_known_message_nonce.clone() } + /// Reports the current highest leaf index which was inserted into the merkle tree. + /// + /// Labels: + /// - `origin`: Origin chain the leaf index is being tracked at. + pub fn latest_leaf_index(&self) -> IntGaugeVec { + self.latest_leaf_index.clone() + } + /// Latest message nonce in the validator. /// /// Phase: diff --git a/rust/main/hyperlane-base/src/settings/parser/connection_parser.rs b/rust/main/hyperlane-base/src/settings/parser/connection_parser.rs index 70e1b81835..b3f91ee88e 100644 --- a/rust/main/hyperlane-base/src/settings/parser/connection_parser.rs +++ b/rust/main/hyperlane-base/src/settings/parser/connection_parser.rs @@ -1,4 +1,7 @@ use eyre::eyre; +use hyperlane_sealevel::{ + HeliusPriorityFeeLevel, HeliusPriorityFeeOracleConfig, PriorityFeeOracleConfig, +}; use url::Url; use h_eth::TransactionOverrides; @@ -162,12 +165,24 @@ fn build_sealevel_connection_conf( chain: &ValueParser, err: &mut ConfigParsingError, operation_batch: OperationBatchConfig, -) -> h_sealevel::ConnectionConf { +) -> Option { + let mut local_err = ConfigParsingError::default(); + let native_token = parse_native_token(chain, err, 9); - h_sealevel::ConnectionConf { - url: url.clone(), - operation_batch, - native_token, + let priority_fee_oracle = parse_sealevel_priority_fee_oracle_config(chain, &mut local_err); + let transaction_submitter = parse_transaction_submitter_config(chain, &mut local_err); + + if !local_err.is_ok() { + err.merge(local_err); + None + } else { + Some(ChainConnectionConf::Sealevel(h_sealevel::ConnectionConf { + url: url.clone(), + operation_batch, + native_token, + priority_fee_oracle: priority_fee_oracle.unwrap(), + transaction_submitter: transaction_submitter.unwrap(), + })) } } @@ -196,6 +211,147 @@ fn parse_native_token( } } +fn parse_sealevel_priority_fee_oracle_config( + chain: &ValueParser, + err: &mut ConfigParsingError, +) -> Option { + let value_parser = chain.chain(err).get_opt_key("priorityFeeOracle").end(); + + let priority_fee_oracle = if let Some(value_parser) = value_parser { + let oracle_type = value_parser + .chain(err) + .get_key("type") + .parse_string() + .end() + .or_else(|| { + err.push( + &value_parser.cwp + "type", + eyre!("Missing priority fee oracle type"), + ); + None + }) + .unwrap_or_default(); + + match oracle_type { + "constant" => { + let fee = value_parser + .chain(err) + .get_key("fee") + .parse_u64() + .end() + .unwrap_or(0); + Some(PriorityFeeOracleConfig::Constant(fee)) + } + "helius" => { + let fee_level = parse_helius_priority_fee_level(&value_parser, err); + if !err.is_ok() { + return None; + } + let config = HeliusPriorityFeeOracleConfig { + url: value_parser + .chain(err) + .get_key("url") + .parse_from_str("Invalid url") + .end() + .unwrap(), + fee_level: fee_level.unwrap(), + }; + Some(PriorityFeeOracleConfig::Helius(config)) + } + _ => { + err.push( + &value_parser.cwp + "type", + eyre!("Unknown priority fee oracle type"), + ); + None + } + } + } else { + // If not specified at all, use default + Some(PriorityFeeOracleConfig::default()) + }; + + priority_fee_oracle +} + +fn parse_helius_priority_fee_level( + value_parser: &ValueParser, + err: &mut ConfigParsingError, +) -> Option { + let level = value_parser + .chain(err) + .get_opt_key("feeLevel") + .parse_string() + .end(); + + if let Some(level) = level { + match level.to_lowercase().as_str() { + "recommended" => Some(HeliusPriorityFeeLevel::Recommended), + "min" => Some(HeliusPriorityFeeLevel::Min), + "low" => Some(HeliusPriorityFeeLevel::Low), + "medium" => Some(HeliusPriorityFeeLevel::Medium), + "high" => Some(HeliusPriorityFeeLevel::High), + "veryhigh" => Some(HeliusPriorityFeeLevel::VeryHigh), + "unsafemax" => Some(HeliusPriorityFeeLevel::UnsafeMax), + _ => { + err.push( + &value_parser.cwp + "feeLevel", + eyre!("Unknown priority fee level"), + ); + None + } + } + } else { + // If not specified at all, use the default + Some(HeliusPriorityFeeLevel::default()) + } +} + +fn parse_transaction_submitter_config( + chain: &ValueParser, + err: &mut ConfigParsingError, +) -> Option { + let submitter_type = chain + .chain(err) + .get_opt_key("transactionSubmitter") + .get_opt_key("type") + .parse_string() + .end(); + + if let Some(submitter_type) = submitter_type { + match submitter_type.to_lowercase().as_str() { + "rpc" => { + let url = chain + .chain(err) + .get_opt_key("transactionSubmitter") + .get_opt_key("url") + .parse_from_str("Invalid url") + .end(); + Some(h_sealevel::TransactionSubmitterConfig::Rpc { url }) + } + "jito" => { + let url = chain + .chain(err) + .get_opt_key("transactionSubmitter") + .get_opt_key("url") + .parse_from_str("Invalid url") + .end(); + Some(h_sealevel::TransactionSubmitterConfig::Jito { url }) + } + _ => { + err.push( + &chain.cwp + "transactionSubmitter.type", + eyre!("Unknown transaction submitter type"), + ); + None + } + } + } else { + // If not specified at all, use default + Some(h_sealevel::TransactionSubmitterConfig::default()) + } +} + pub fn build_connection_conf( domain_protocol: HyperlaneDomainProtocol, rpcs: &[Url], @@ -216,14 +372,10 @@ pub fn build_connection_conf( .iter() .next() .map(|url| ChainConnectionConf::Fuel(h_fuel::ConnectionConf { url: url.clone() })), - HyperlaneDomainProtocol::Sealevel => rpcs.iter().next().map(|url| { - ChainConnectionConf::Sealevel(build_sealevel_connection_conf( - url, - chain, - err, - operation_batch, - )) - }), + HyperlaneDomainProtocol::Sealevel => rpcs + .iter() + .next() + .and_then(|url| build_sealevel_connection_conf(url, chain, err, operation_batch)), HyperlaneDomainProtocol::Cosmos => { build_cosmos_connection_conf(rpcs, chain, err, operation_batch) } diff --git a/rust/main/hyperlane-core/src/accumulator/incremental.rs b/rust/main/hyperlane-core/src/accumulator/incremental.rs index 5595bbc8cf..e71b9cbbe1 100644 --- a/rust/main/hyperlane-core/src/accumulator/incremental.rs +++ b/rust/main/hyperlane-core/src/accumulator/incremental.rs @@ -82,7 +82,7 @@ impl IncrementalMerkle { merkle_root_from_branch(item, &branch, 32, index) } - /// Verify a incremental merkle proof of inclusion + /// Verify an incremental merkle proof of inclusion pub fn verify(&self, proof: &Proof) -> bool { let computed = IncrementalMerkle::branch_root(proof.leaf, proof.path, proof.index); computed == self.root() diff --git a/rust/main/hyperlane-core/src/chain.rs b/rust/main/hyperlane-core/src/chain.rs index 134881bf71..97637fafa5 100644 --- a/rust/main/hyperlane-core/src/chain.rs +++ b/rust/main/hyperlane-core/src/chain.rs @@ -171,11 +171,15 @@ pub enum KnownHyperlaneDomain { SolanaMainnet = 1399811149, Taiko = 167000, Tangle = 5845, + Treasure = 61166, Viction = 88, Worldchain = 480, Xai = 660279, Xlayer = 196, Zetachain = 7000, + Zeronetwork = 543210, + Zklink = 810180, + Zksync = 324, Zircuit = 48900, ZoraMainnet = 7777777, @@ -192,6 +196,7 @@ pub enum KnownHyperlaneDomain { // -- Test chains -- // + Abstracttestnet = 11124, Alfajores = 44787, #[cfg_attr(feature = "strum", strum(serialize = "bsctestnet"))] BinanceSmartChainTestnet = 97, @@ -203,6 +208,7 @@ pub enum KnownHyperlaneDomain { ScrollSepolia = 534351, Sepolia = 11155111, SuperpositionTestnet = 98985, + Treasuretopaz = 978658, } #[derive(Clone, Serialize)] @@ -319,12 +325,12 @@ impl KnownHyperlaneDomain { DegenChain, EclipseMainnet, Endurance, Ethereum, Fraxtal, FuseMainnet, Gnosis, InEvm, Injective, Kroma, Linea, Lisk, Lukso, MantaPacific, Mantle, Merlin, Metis, Mint, Mode, Moonbeam, Neutron, Optimism, Osmosis, Polygon, ProofOfPlay, - ReAl, Redstone, Sanko, Sei, SolanaMainnet, Taiko, Tangle, Viction, Worldchain, Xai, - Xlayer, Zetachain, Zircuit, ZoraMainnet, + ReAl, Redstone, Sanko, Sei, SolanaMainnet, Taiko, Tangle, Treasure, Viction, Worldchain, Xai, + Xlayer, Zeronetwork, Zetachain, Zircuit, Zklink, Zksync, ZoraMainnet, ], Testnet: [ Alfajores, BinanceSmartChainTestnet, Chiado, ConnextSepolia, Fuji, Holesky, MoonbaseAlpha, - PlumeTestnet, ScrollSepolia, Sepolia, SuperpositionTestnet + PlumeTestnet, ScrollSepolia, Sepolia, SuperpositionTestnet, Abstracttestnet, Treasuretopaz ], LocalTestChain: [ Test1, Test2, Test3, FuelTest1, SealevelTest1, SealevelTest2, CosmosTest99990, @@ -338,11 +344,12 @@ impl KnownHyperlaneDomain { many_to_one!(match self { HyperlaneDomainProtocol::Ethereum: [ - Ancient8, Arbitrum, Avalanche, BinanceSmartChain, Blast, Bob, Celo, Cheesechain, Cyber, + Abstracttestnet, Ancient8, Arbitrum, Avalanche, BinanceSmartChain, Blast, Bob, Celo, Cheesechain, Cyber, DegenChain, Endurance, Ethereum, Fraxtal, Fuji, FuseMainnet, Gnosis, InEvm, Kroma, Linea, Lisk, Lukso, MantaPacific, Mantle, Merlin, Metis, Mint, Mode, Moonbeam, Optimism, Polygon, ProofOfPlay, ReAl, Redstone, Sanko, Sei, Tangle, - Taiko, Viction, Worldchain, Xai, Xlayer, Zetachain, Zircuit, ZoraMainnet, + Taiko, Treasure, Treasuretopaz, Viction, Worldchain, Xai, Xlayer, Zeronetwork, Zetachain, Zircuit, ZoraMainnet, + Zklink, Zksync, // Local chains Test1, Test2, Test3, @@ -383,7 +390,9 @@ impl KnownHyperlaneDomain { HyperlaneDomainTechnicalStack::PolkadotSubstrate: [ Moonbeam, Tangle ], - HyperlaneDomainTechnicalStack::ZkSync: [], + HyperlaneDomainTechnicalStack::ZkSync: [ + Abstracttestnet, Treasure, Treasuretopaz, Zeronetwork, Zklink, Zksync, + ], HyperlaneDomainTechnicalStack::Other: [ Avalanche, BinanceSmartChain, Celo, EclipseMainnet, Endurance, Ethereum, FuseMainnet, Gnosis, Injective, Linea, Lukso, Neutron, Osmosis, Polygon, @@ -572,6 +581,13 @@ impl HyperlaneDomain { matches!(self, Self::Known(KnownHyperlaneDomain::Injective)) } + pub const fn is_zksync_stack(&self) -> bool { + matches!( + self.domain_technical_stack(), + HyperlaneDomainTechnicalStack::ZkSync + ) + } + pub const fn index_mode(&self) -> IndexMode { use HyperlaneDomainProtocol::*; let protocol = self.domain_protocol(); diff --git a/rust/main/utils/run-locally/src/invariants/termination_invariants.rs b/rust/main/utils/run-locally/src/invariants/termination_invariants.rs index cb851af8d2..b6e299c1bc 100644 --- a/rust/main/utils/run-locally/src/invariants/termination_invariants.rs +++ b/rust/main/utils/run-locally/src/invariants/termination_invariants.rs @@ -39,7 +39,10 @@ pub fn termination_invariants_met( )?; assert!(!lengths.is_empty(), "Could not find queue length metric"); if lengths.iter().sum::() != ZERO_MERKLE_INSERTION_KATHY_MESSAGES { - log!("Relayer queues not empty. Lengths: {:?}", lengths); + log!( + "Relayer queues contain more messages than the zero-merkle-insertion ones. Lengths: {:?}", + lengths + ); return Ok(false); }; diff --git a/rust/main/utils/run-locally/src/solana.rs b/rust/main/utils/run-locally/src/solana.rs index 022d086a65..6dd137857f 100644 --- a/rust/main/utils/run-locally/src/solana.rs +++ b/rust/main/utils/run-locally/src/solana.rs @@ -159,7 +159,7 @@ pub fn build_solana_programs(solana_cli_tools_path: PathBuf) -> PathBuf { .working_dir(&out_path) .run() .join(); - log!("Remove temporary solana files"); + log!("Removing temporary solana files"); fs::remove_file(concat_path(&out_path, "spl.tar.gz")) .expect("Failed to remove solana program archive"); @@ -232,8 +232,7 @@ pub fn start_solana_test_validator( .arg("environment", SOLANA_ENV_NAME) .arg("environments-dir", SOLANA_ENVS_DIR) .arg("built-so-dir", SBF_OUT_PATH) - .arg("overhead-config-file", SOLANA_OVERHEAD_CONFIG_FILE) - .flag("use-existing-keys"); + .arg("overhead-config-file", SOLANA_OVERHEAD_CONFIG_FILE); sealevel_client_deploy_core .clone() diff --git a/rust/sealevel/client/src/cmd_utils.rs b/rust/sealevel/client/src/cmd_utils.rs index f387d3c4fd..f8e20b4d64 100644 --- a/rust/sealevel/client/src/cmd_utils.rs +++ b/rust/sealevel/client/src/cmd_utils.rs @@ -1,14 +1,17 @@ use std::{ collections::HashMap, fs::File, - io::Write, + io::{self, Write}, path::{Path, PathBuf}, process::{Command, Stdio}, thread::sleep, time::Duration, }; -use solana_client::{client_error::ClientError, rpc_client::RpcClient}; +use solana_client::{ + client_error::{ClientError, ClientErrorKind}, + rpc_client::RpcClient, +}; use solana_sdk::{ commitment_config::CommitmentConfig, pubkey::Pubkey, @@ -44,37 +47,91 @@ pub(crate) fn account_exists(client: &RpcClient, account: &Pubkey) -> Result Result<(), ClientError> { +) -> Result { + let (program_keypair, program_keypair_path) = create_or_get_keypair( + program_key_dir, + format!("{}-keypair.json", program_name).as_str(), + ); + let program_id = program_keypair.pubkey(); + let client = RpcClient::new(url.to_string()); - if !account_exists(&client, &program_keypair.pubkey())? { - deploy_program( + if account_exists(&client, &program_keypair.pubkey())? { + println!("Program {} already deployed", program_keypair.pubkey()); + return Ok(program_id); + } + + let (buffer_keypair, buffer_keypair_path) = create_or_get_keypair( + program_key_dir, + format!("{}-buffer.json", program_name).as_str(), + ); + + let mut compute_unit_price = get_compute_unit_price_micro_lamports_for_id(local_domain); + + for attempt in 0..10 { + println!("Attempting program deploy Program ID: {}, buffer pubkey: {}, compute unit price: {}, attempt number {}", program_id, buffer_keypair.pubkey(), compute_unit_price, attempt); + + if attempt > 0 { + println!( + "As this is not the first deploy attempt, the buffer {} is re-used", + buffer_keypair.pubkey() + ); + } + + if attempt_program_deploy( payer_keypair_path, - program_keypair_path, + program_name, program_path, + &program_keypair_path, + &buffer_keypair_path, url, - local_domain, + compute_unit_price, + ) + .is_ok() + { + // Success! + return Ok(program_id); + } + + // Failed to deploy program, try again with a higher compute unit price + + println!( + "Failed to deploy program with compute unit price {}", + compute_unit_price ); - } else { - println!("Program {} already deployed", program_keypair.pubkey()); + + // Bump by 10% each time if non-zero, otherwise start at 1000 micro lamports + compute_unit_price = if compute_unit_price > 0 { + compute_unit_price * 11 / 10 + } else { + 1000 + }; + + println!( + "Sleeping 1s, then retrying with new compute unit price {}", + compute_unit_price + ); + sleep(Duration::from_secs(1)); } - Ok(()) + Err(ClientErrorKind::Custom(format!("Failed to deploy program {}", program_name)).into()) } -pub(crate) fn deploy_program( +fn attempt_program_deploy( payer_keypair_path: &str, - program_keypair_path: &str, + program_name: &str, program_path: &str, + program_keypair_path: &Path, + buffer_keypair_path: &Path, url: &str, - local_domain: u32, -) { + compute_unit_price: u64, +) -> Result<(), ClientError> { let mut command = vec![ "solana", "--url", @@ -87,19 +144,28 @@ pub(crate) fn deploy_program( "--upgrade-authority", payer_keypair_path, "--program-id", - program_keypair_path, + program_keypair_path.to_str().unwrap(), + "--buffer", + buffer_keypair_path.to_str().unwrap(), ]; - let compute_unit_price = get_compute_unit_price_micro_lamports_for_id(local_domain).to_string(); - if local_domain.eq(&SOLANA_DOMAIN) { - command.extend(vec!["--with-compute-unit-price", &compute_unit_price]); - } + let compute_unit_price_str = compute_unit_price.to_string(); + command.extend(vec!["--with-compute-unit-price", &compute_unit_price_str]); - build_cmd(command.as_slice(), None, None); + // Success! + if let Ok(true) = run_cmd(command.as_slice(), None, None) { + // TODO: use commitment level instead of just sleeping here? + println!("Sleeping for 5 seconds to fully allow program to be deployed"); + sleep(Duration::from_secs(5)); + + return Ok(()); + } - // TODO: use commitment level instead of just sleeping here? - println!("Sleeping for 2 seconds to allow program to be deployed"); - sleep(Duration::from_secs(2)); + Err(ClientErrorKind::Custom(format!( + "Attempted program deploy failed for {}", + program_name + )) + .into()) } pub(crate) fn create_new_directory(parent_dir: &Path, name: &str) -> PathBuf { @@ -109,20 +175,14 @@ pub(crate) fn create_new_directory(parent_dir: &Path, name: &str) -> PathBuf { path } -pub(crate) fn create_and_write_keypair( - key_dir: &Path, - key_name: &str, - use_existing_key: bool, -) -> (Keypair, PathBuf) { +pub(crate) fn create_or_get_keypair(key_dir: &Path, key_name: &str) -> (Keypair, PathBuf) { let path = key_dir.join(key_name); - if use_existing_key { - if let Ok(file) = File::open(path.clone()) { - println!("Using existing key at path {}", path.display()); - let keypair_bytes: Vec = serde_json::from_reader(file).unwrap(); - let keypair = Keypair::from_bytes(&keypair_bytes[..]).unwrap(); - return (keypair, path); - } + if let Ok(file) = File::open(path.clone()) { + println!("Using existing key at path {}", path.display()); + let keypair_bytes: Vec = serde_json::from_reader(file).unwrap(); + let keypair = Keypair::from_bytes(&keypair_bytes[..]).unwrap(); + return (keypair, path); } let keypair = Keypair::new(); @@ -136,8 +196,14 @@ pub(crate) fn create_and_write_keypair( (keypair, path) } -fn build_cmd(cmd: &[&str], wd: Option<&str>, env: Option<&HashMap<&str, &str>>) { +fn run_cmd(cmd: &[&str], wd: Option<&str>, env: Option<&HashMap<&str, &str>>) -> io::Result { assert!(!cmd.is_empty(), "Must specify a command!"); + if cmd.is_empty() { + return Err(io::Error::new( + io::ErrorKind::Other, + "Must specify a command!", + )); + } let mut c = Command::new(cmd[0]); c.args(&cmd[1..]); c.stdout(Stdio::inherit()); @@ -149,10 +215,6 @@ fn build_cmd(cmd: &[&str], wd: Option<&str>, env: Option<&HashMap<&str, &str>>) c.envs(env); } println!("Running command: {:?}", c); - let status = c.status().expect("Failed to run command"); - assert!( - status.success(), - "Command returned non-zero exit code: {}", - cmd.join(" ") - ); + let status = c.status()?; + Ok(status.success()) } diff --git a/rust/sealevel/client/src/core.rs b/rust/sealevel/client/src/core.rs index e3abedf035..72ecfcb5ca 100644 --- a/rust/sealevel/client/src/core.rs +++ b/rust/sealevel/client/src/core.rs @@ -3,7 +3,6 @@ use hyperlane_sealevel_mailbox::protocol_fee::ProtocolFee; use serde::{Deserialize, Serialize}; use solana_program::pubkey::Pubkey; -use solana_sdk::signature::Signer; use solana_sdk::{compute_budget, compute_budget::ComputeBudgetInstruction}; use std::collections::HashMap; @@ -13,7 +12,7 @@ use crate::cmd_utils::get_compute_unit_price_micro_lamports_for_chain_name; use crate::ONE_SOL_IN_LAMPORTS; use crate::{ artifacts::{read_json, write_json}, - cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, + cmd_utils::{create_new_directory, deploy_program}, multisig_ism::deploy_multisig_ism_message_id, Context, CoreCmd, CoreDeploy, CoreSubCmd, }; @@ -89,7 +88,6 @@ pub(crate) fn process_core_cmd(mut ctx: Context, cmd: CoreCmd) { let ism_program_id = deploy_multisig_ism_message_id( &mut ctx, &core.built_so_dir, - core.use_existing_keys, &key_dir, core.local_domain, ); @@ -123,23 +121,18 @@ fn deploy_mailbox( default_ism: Pubkey, local_domain: u32, ) -> Pubkey { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_mailbox-keypair.json", - core.use_existing_keys, - ); - let program_id = keypair.pubkey(); - - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_mailbox", core.built_so_dir .join("hyperlane_sealevel_mailbox.so") .to_str() .unwrap(), &ctx.client.url(), local_domain, - ); + ) + .unwrap(); println!("Deployed Mailbox at program ID {}", program_id); @@ -182,23 +175,18 @@ fn deploy_validator_announce( key_dir: &Path, mailbox_program_id: Pubkey, ) -> Pubkey { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_validator_announce-keypair.json", - core.use_existing_keys, - ); - let program_id = keypair.pubkey(); - - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_validator_announce", core.built_so_dir .join("hyperlane_sealevel_validator_announce.so") .to_str() .unwrap(), &ctx.client.url(), core.local_domain, - ); + ) + .unwrap(); println!("Deployed ValidatorAnnounce at program ID {}", program_id); @@ -225,13 +213,6 @@ fn deploy_igp(ctx: &mut Context, core: &CoreDeploy, key_dir: &Path) -> (Pubkey, instruction::{GasOracleConfig, GasOverheadConfig}, }; - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_igp-keypair.json", - core.use_existing_keys, - ); - let program_id = keypair.pubkey(); - let mut gas_oracle_configs = core .gas_oracle_config_file .as_deref() @@ -275,16 +256,18 @@ fn deploy_igp(ctx: &mut Context, core: &CoreDeploy, key_dir: &Path) -> (Pubkey, .into_values() .collect::>(); - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_igp", core.built_so_dir .join("hyperlane_sealevel_igp.so") .to_str() .unwrap(), &ctx.client.url(), core.local_domain, - ); + ) + .unwrap(); println!("Deployed IGP at program ID {}", program_id); diff --git a/rust/sealevel/client/src/igp.rs b/rust/sealevel/client/src/igp.rs index 0d4c5c0e9e..cf9d6042b2 100644 --- a/rust/sealevel/client/src/igp.rs +++ b/rust/sealevel/client/src/igp.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use crate::{ artifacts::{read_json, try_read_json, write_json, SingularProgramIdArtifact}, - cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, + cmd_utils::{create_new_directory, deploy_program}, read_core_program_ids, router::ChainMetadata, Context, GasOverheadSubCmd, GetSetCmd, IgpCmd, IgpSubCmd, @@ -75,7 +75,7 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { .expect("Invalid chain name"); let program_id = - deploy_igp_program(&mut ctx, &deploy.built_so_dir, true, &key_dir, local_domain); + deploy_igp_program(&mut ctx, &deploy.built_so_dir, &key_dir, local_domain); write_json::( &chain_dir.join("program-ids.json"), @@ -413,27 +413,21 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { fn deploy_igp_program( ctx: &mut Context, built_so_dir: &Path, - use_existing_keys: bool, key_dir: &Path, local_domain: u32, ) -> Pubkey { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_igp-keypair.json", - use_existing_keys, - ); - let program_id = keypair.pubkey(); - - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_igp", built_so_dir .join("hyperlane_sealevel_igp.so") .to_str() .unwrap(), &ctx.client.url(), local_domain, - ); + ) + .unwrap(); println!("Deployed IGP at program ID {}", program_id); diff --git a/rust/sealevel/client/src/main.rs b/rust/sealevel/client/src/main.rs index bf014785c1..4b76a7cf0a 100644 --- a/rust/sealevel/client/src/main.rs +++ b/rust/sealevel/client/src/main.rs @@ -184,8 +184,6 @@ struct CoreDeploy { overhead_config_file: Option, #[arg(long)] chain: String, - #[arg(long)] - use_existing_keys: bool, #[arg(long, num_args = 1.., value_delimiter = ',')] remote_domains: Vec, #[arg(long)] diff --git a/rust/sealevel/client/src/multisig_ism.rs b/rust/sealevel/client/src/multisig_ism.rs index 9f1f2c5c89..753e89c7ab 100644 --- a/rust/sealevel/client/src/multisig_ism.rs +++ b/rust/sealevel/client/src/multisig_ism.rs @@ -3,11 +3,10 @@ use std::{fs::File, path::Path}; use serde::{Deserialize, Serialize}; use solana_program::pubkey::Pubkey; -use solana_sdk::signature::Signer; use crate::{ artifacts::{write_json, SingularProgramIdArtifact}, - cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, + cmd_utils::{create_new_directory, deploy_program}, router::ChainMetadata, Context, MultisigIsmMessageIdCmd, MultisigIsmMessageIdSubCmd, }; @@ -64,7 +63,6 @@ pub(crate) fn process_multisig_ism_message_id_cmd(mut ctx: Context, cmd: Multisi let ism_program_id = deploy_multisig_ism_message_id( &mut ctx, &deploy.built_so_dir, - true, &key_dir, local_domain, ); @@ -168,27 +166,21 @@ pub(crate) fn process_multisig_ism_message_id_cmd(mut ctx: Context, cmd: Multisi pub(crate) fn deploy_multisig_ism_message_id( ctx: &mut Context, built_so_dir: &Path, - use_existing_keys: bool, key_dir: &Path, local_domain: u32, ) -> Pubkey { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_multisig_ism_message_id-keypair.json", - use_existing_keys, - ); - let program_id = keypair.pubkey(); - - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_multisig_ism_message_id", built_so_dir .join("hyperlane_sealevel_multisig_ism_message_id.so") .to_str() .unwrap(), &ctx.client.url(), local_domain, - ); + ) + .unwrap(); println!( "Deployed Multisig ISM Message ID at program ID {}", diff --git a/rust/sealevel/client/src/router.rs b/rust/sealevel/client/src/router.rs index ad7ee36950..80b3e7e970 100644 --- a/rust/sealevel/client/src/router.rs +++ b/rust/sealevel/client/src/router.rs @@ -8,7 +8,7 @@ use std::{ use solana_client::rpc_client::RpcClient; use solana_program::instruction::Instruction; -use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey, signature::Signer}; +use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey}; use account_utils::DiscriminatorData; use hyperlane_sealevel_connection_client::router::RemoteRouterConfig; @@ -17,7 +17,7 @@ use hyperlane_sealevel_igp::accounts::{Igp, InterchainGasPaymasterType, Overhead use crate::{ adjust_gas_price_if_needed, artifacts::{write_json, HexAndBase58ProgramIdArtifact}, - cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program_idempotent}, + cmd_utils::{create_new_directory, deploy_program}, read_core_program_ids, warp_route, Context, CoreProgramIds, }; @@ -183,17 +183,12 @@ pub(crate) trait RouterDeployer: }) }) .unwrap_or_else(|| { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - format!("{}-{}.json", program_name, chain_config.name).as_str(), - true, - ); - let program_id = keypair.pubkey(); + let chain_program_name = format!("{}-{}", program_name, chain_config.name); - deploy_program_idempotent( + let program_id = deploy_program( ctx.payer_keypair_path(), - &keypair, - keypair_path.to_str().unwrap(), + key_dir, + &chain_program_name, built_so_dir .join(format!("{}.so", program_name)) .to_str() @@ -604,6 +599,8 @@ fn enroll_all_remote_routers< .collect::>(); if !router_configs.is_empty() { + adjust_gas_price_if_needed(chain_name.as_str(), ctx); + ctx.new_txn() .add_with_description( deployer.enroll_remote_routers_instruction( diff --git a/rust/sealevel/client/src/warp_route.rs b/rust/sealevel/client/src/warp_route.rs index a185544501..d25dddd1cf 100644 --- a/rust/sealevel/client/src/warp_route.rs +++ b/rust/sealevel/client/src/warp_route.rs @@ -670,7 +670,7 @@ pub fn install_spl_token_cli() { "--branch", "dan/create-token-for-mint", "--rev", - "c1278a3f1", + "ae4c8ac46", ]) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) diff --git a/rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token-sealeveltest2.json b/rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token-sealeveltest2-keypair.json similarity index 100% rename from rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token-sealeveltest2.json rename to rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token-sealeveltest2-keypair.json diff --git a/rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token_native-sealeveltest1.json b/rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token_native-sealeveltest1-keypair.json similarity index 100% rename from rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token_native-sealeveltest1.json rename to rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token_native-sealeveltest1-keypair.json diff --git a/rust/sealevel/environments/mainnet3/chain-config.json b/rust/sealevel/environments/mainnet3/chain-config.json index 37408c6995..0688d72632 100644 --- a/rust/sealevel/environments/mainnet3/chain-config.json +++ b/rust/sealevel/environments/mainnet3/chain-config.json @@ -37,7 +37,7 @@ ], "technicalStack": "opstack" }, - "alephzeroevm": { + "alephzeroevmmainnet": { "blockExplorers": [ { "apiUrl": "https://evm-explorer.alephzero.org/api", @@ -58,12 +58,12 @@ }, "displayName": "Aleph Zero EVM", "displayNameShort": "Aleph Zero EVM", - "domainId": 41455, + "domainId": 1000041455, "gasCurrencyCoinGeckoId": "aleph-zero", "index": { - "from": 3421962 + "from": 4243354 }, - "name": "alephzeroevm", + "name": "alephzeroevmmainnet", "nativeToken": { "decimals": 18, "name": "AZERO", @@ -119,6 +119,45 @@ ], "technicalStack": "arbitrumnitro" }, + "appchain": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.appchain.xyz/api", + "family": "blockscout", + "name": "AppChain Explorer", + "url": "https://explorer.appchain.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 0 + }, + "chainId": 466, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "AppChain", + "domainId": 466, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 190 + }, + "name": "appchain", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://appchain.calderachain.xyz/http" + } + ], + "technicalStack": "arbitrumnitro" + }, "arbitrum": { "blockExplorers": [ { @@ -204,6 +243,45 @@ ], "technicalStack": "arbitrumnitro" }, + "arthera": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.arthera.net/api", + "family": "blockscout", + "name": "Arthera Explorer", + "url": "https://explorer.arthera.net" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 10242, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Arthera", + "domainId": 10242, + "gasCurrencyCoinGeckoId": "arthera", + "name": "arthera", + "nativeToken": { + "decimals": 18, + "name": "Arthera", + "symbol": "AA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.arthera.net", + "pagination": { + "maxBlockRange": 10000 + } + } + ], + "technicalStack": "other" + }, "astar": { "blockExplorers": [ { @@ -279,6 +357,81 @@ ], "technicalStack": "polygoncdk" }, + "aurora": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.mainnet.aurora.dev/api", + "family": "blockscout", + "name": "Aurora Explorer", + "url": "https://explorer.mainnet.aurora.dev" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 1313161554, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Aurora", + "domainId": 1313161554, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "aurora", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.aurora.dev" + }, + { + "http": "https://aurora.drpc.org" + } + ], + "technicalStack": "other" + }, + "flame": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.flame.astria.org/api", + "family": "blockscout", + "name": "Astria Flame Explorer", + "url": "https://explorer.flame.astria.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 253368190, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Flame", + "domainId": 253368190, + "gasCurrencyCoinGeckoId": "celestia", + "name": "flame", + "nativeToken": { + "decimals": 18, + "name": "Celestia", + "symbol": "TIA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.flame.astria.org" + } + ], + "technicalStack": "other" + }, "avalanche": { "blockExplorers": [ { @@ -369,7 +522,7 @@ } ], "blocks": { - "confirmations": 1, + "confirmations": 3, "estimateBlockTime": 2, "reorgPeriod": 10 }, @@ -466,7 +619,7 @@ "displayName": "Blast", "domainId": 81457, "gasCurrencyCoinGeckoId": "ethereum", - "gnosisSafeTransactionServiceUrl": "https://transaction.blast-safe.io", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-blast.safe.global", "name": "blast", "nativeToken": { "decimals": 18, @@ -521,6 +674,42 @@ ], "technicalStack": "opstack" }, + "boba": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/288/etherscan/api", + "family": "routescan", + "name": "bobascan", + "url": "https://bobascan.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 288, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Boba Mainnet", + "domainId": 288, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "boba", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.boba.network" + } + ], + "technicalStack": "opstack" + }, "bsc": { "blockExplorers": [ { @@ -568,6 +757,51 @@ "gasPrice": 3000000000 } }, + "bsquared": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.bsquared.network/api", + "family": "etherscan", + "name": "B² Network Explorer", + "url": "https://explorer.bsquared.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 5 + }, + "chainId": 223, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "B² Network", + "domainId": 223, + "gasCurrencyCoinGeckoId": "bitcoin", + "name": "bsquared", + "nativeToken": { + "decimals": 18, + "name": "Bitcoin", + "symbol": "BTC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.bsquared.network" + }, + { + "http": "https://rpc.ankr.com/b2" + }, + { + "http": "https://mainnet.b2-rpc.com" + }, + { + "http": "https://b2-mainnet.alt.technology" + } + ], + "technicalStack": "other" + }, "celo": { "blockExplorers": [ { @@ -651,7 +885,7 @@ ], "technicalStack": "arbitrumnitro" }, - "chiliz": { + "chilizmainnet": { "blockExplorers": [ { "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/88888/etherscan/api", @@ -671,9 +905,9 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Chiliz", - "domainId": 88888, + "domainId": 1000088888, "gasCurrencyCoinGeckoId": "chiliz", - "name": "chiliz", + "name": "chilizmainnet", "nativeToken": { "decimals": 18, "name": "Chiliz", @@ -693,6 +927,87 @@ "maxPriorityFeePerGas": 1000000000 } }, + "conflux": { + "blockExplorers": [ + { + "apiUrl": "https://evmapi.confluxscan.net/api", + "family": "blockscout", + "name": "ConfluxScan eSpace", + "url": "https://evm.confluxscan.net" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 10 + }, + "chainId": 1030, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Conflux eSpace", + "domainId": 1030, + "gasCurrencyCoinGeckoId": "conflux-token", + "name": "conflux", + "nativeToken": { + "decimals": 18, + "name": "Ethereum", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://evm.confluxrpc.com" + }, + { + "http": "https://conflux-espace-public.unifra.io" + }, + { + "http": "https://conflux-espace.blockpi.network/v1/rpc/public" + } + ], + "technicalStack": "other" + }, + "conwai": { + "blockExplorers": [ + { + "apiUrl": "https://conwai.calderaexplorer.xyz/api", + "family": "blockscout", + "name": "Conwai Explorer", + "url": "https://conwai.calderaexplorer.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 0 + }, + "chainId": 668668, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Conwai", + "domainId": 668668, + "gasCurrencyCoinGeckoId": "conwai", + "index": { + "from": 73 + }, + "name": "conwai", + "nativeToken": { + "decimals": 18, + "name": "Conwai", + "symbol": "CNW" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://conwai.calderachain.xyz/http" + } + ], + "technicalStack": "arbitrumnitro" + }, "coredao": { "blockExplorers": [ { @@ -741,6 +1056,51 @@ ], "technicalStack": "other" }, + "corn": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/21000000/etherscan/api", + "family": "routescan", + "name": "Cornscan", + "url": "https://cornscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 20, + "reorgPeriod": 5 + }, + "chainId": 21000000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Corn", + "domainId": 21000000, + "gasCurrencyCoinGeckoId": "bitcoin", + "index": { + "from": 55636 + }, + "name": "corn", + "nativeToken": { + "decimals": 18, + "name": "Bitcorn", + "symbol": "BTCN" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.corn-rpc.com" + }, + { + "http": "https://maizenet-rpc.usecorn.com" + }, + { + "http": "https://rpc.ankr.com/corn_maizenet" + } + ], + "technicalStack": "arbitrumnitro" + }, "cyber": { "blockExplorers": [ { @@ -855,6 +1215,48 @@ ], "technicalStack": "polygoncdk" }, + "duckchain": { + "blockExplorers": [ + { + "apiUrl": "https://scan.duckchain.io/api", + "family": "blockscout", + "name": "DuckChain Explorer", + "url": "https://scan.duckchain.io" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 5545, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "DuckChain", + "domainId": 5545, + "gasCurrencyCoinGeckoId": "the-open-network", + "index": { + "from": 1149918 + }, + "name": "duckchain", + "nativeToken": { + "decimals": 18, + "name": "Toncoin", + "symbol": "TON" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.duckchain.io" + }, + { + "http": "https://rpc-hk.duckchain.io" + } + ], + "technicalStack": "arbitrumnitro" + }, "eclipsemainnet": { "blockExplorers": [ { @@ -965,6 +1367,9 @@ }, "protocol": "ethereum", "rpcUrls": [ + { + "http": "https://rpc.ankr.com/eth" + }, { "http": "https://ethereum.publicnode.com" }, @@ -1013,6 +1418,51 @@ ], "technicalStack": "arbitrumnitro" }, + "evmos": { + "blockExplorers": [ + { + "apiUrl": "https://www.mintscan.io/evmos/api", + "family": "other", + "name": "Mintscan", + "url": "https://www.mintscan.io/evmos" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 9001, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Evmos EVM", + "domainId": 9001, + "gasCurrencyCoinGeckoId": "evmos", + "name": "evmos", + "nativeToken": { + "decimals": 18, + "name": "Evmos", + "symbol": "EVMOS" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://evmos.lava.build" + }, + { + "http": "https://evmos-json-rpc.stakely.io" + }, + { + "http": "https://rpc-evm.evmos.dragonstake.io" + }, + { + "http": "https://evmos.drpc.org" + } + ], + "technicalStack": "other" + }, "fantom": { "blockExplorers": [ { @@ -1109,7 +1559,7 @@ ], "technicalStack": "other" }, - "flow": { + "flowmainnet": { "blockExplorers": [ { "apiUrl": "https://evm.flowscan.io/api", @@ -1129,10 +1579,10 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "EVM on Flow", - "domainId": 747, + "domainId": 1000000747, "gasCurrencyCoinGeckoId": "flow", "isTestnet": false, - "name": "flow", + "name": "flowmainnet", "nativeToken": { "decimals": 18, "name": "Flow", @@ -1149,6 +1599,42 @@ "gasPrice": 100000000 } }, + "form": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.form.network/api", + "family": "blockscout", + "name": "Form Explorer", + "url": "https://explorer.form.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 478, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Form", + "domainId": 478, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "form", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.form.network/http" + } + ], + "technicalStack": "opstack" + }, "fraxtal": { "blockExplorers": [ { @@ -1361,7 +1847,7 @@ ], "technicalStack": "other" }, - "immutablezkevm": { + "immutablezkevmmainnet": { "blockExplorers": [ { "apiUrl": "https://explorer.immutable.com/api/eth-rpc", @@ -1381,9 +1867,9 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Immutable zkEVM", - "domainId": 13371, + "domainId": 1000013371, "gasCurrencyCoinGeckoId": "immutable-x", - "name": "immutablezkevm", + "name": "immutablezkevmmainnet", "nativeToken": { "decimals": 18, "name": "Immutable", @@ -1447,11 +1933,47 @@ ], "technicalStack": "arbitrumnitro" }, + "ink": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.inkonchain.com/api", + "family": "blockscout", + "name": "Ink Explorer", + "url": "https://explorer.inkonchain.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 57073, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Ink", + "domainId": 57073, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "ink", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc-qnd.inkonchain.com" + } + ], + "technicalStack": "opstack" + }, "injective": { "bech32Prefix": "inj", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/injective", + "apiUrl": "https://apis.mintscan.io/v1/injective", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/injective" @@ -1606,7 +2128,7 @@ "displayName": "Linea", "domainId": 59144, "gasCurrencyCoinGeckoId": "ethereum", - "gnosisSafeTransactionServiceUrl": "https://transaction.safe.linea.build", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-linea.safe.global", "name": "linea", "nativeToken": { "decimals": 18, @@ -1730,6 +2252,9 @@ "displayName": "Lumia Prism", "domainId": 994873017, "gasCurrencyCoinGeckoId": "orion-protocol", + "index": { + "from": 1923136 + }, "name": "lumia", "nativeToken": { "decimals": 18, @@ -1739,8 +2264,41 @@ "protocol": "ethereum", "rpcUrls": [ { - "http": "https://994873017.rpc.thirdweb.com" - }, + "http": "https://mainnet-rpc.lumia.org" + } + ], + "technicalStack": "polygoncdk" + }, + "lumiaprism": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.lumia.org/api/eth-rpc", + "family": "blockscout", + "name": "Lumia Prism Explorer", + "url": "https://explorer.lumia.org" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 4, + "reorgPeriod": 5 + }, + "chainId": 994873017, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Lumia Prism", + "domainId": 1000073017, + "gasCurrencyCoinGeckoId": "lumia", + "name": "lumiaprism", + "nativeToken": { + "decimals": 18, + "name": "Lumia", + "symbol": "LUMIA" + }, + "protocol": "ethereum", + "rpcUrls": [ { "http": "https://mainnet-rpc.lumia.org" } @@ -1865,7 +2423,7 @@ ], "technicalStack": "polygoncdk" }, - "metall2": { + "metal": { "blockExplorers": [ { "apiUrl": "https://explorer.metall2.com/api", @@ -1885,10 +2443,10 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Metal L2", - "domainId": 1750, + "domainId": 1000001750, "gasCurrencyCoinGeckoId": "ethereum", "isTestnet": false, - "name": "metall2", + "name": "metal", "nativeToken": { "decimals": 18, "name": "Ether", @@ -1944,7 +2502,7 @@ "mint": { "blockExplorers": [ { - "apiUrl": "https://explorer.mintchain.io/api/eth-rpc", + "apiUrl": "https://explorer.mintchain.io/api", "family": "blockscout", "name": "Mint Explorer", "url": "https://explorer.mintchain.io" @@ -2138,7 +2696,7 @@ "bech32Prefix": "neutron", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/neutron", + "apiUrl": "https://apis.mintscan.io/v1/neutron", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/neutron" @@ -2315,7 +2873,7 @@ "bech32Prefix": "osmo", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/osmosis", + "apiUrl": "https://apis.mintscan.io/v1/osmosis", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/osmosis" @@ -2415,11 +2973,7 @@ "http": "https://rpc.ankr.com/polygon" } ], - "technicalStack": "other", - "transactionOverrides": { - "maxFeePerGas": 800000000000, - "maxPriorityFeePerGas": 50000000000 - } + "technicalStack": "other" }, "polygonzkevm": { "blockExplorers": [ @@ -2465,7 +3019,7 @@ "gasPrice": 1000000000 } }, - "polynomial": { + "polynomialfi": { "blockExplorers": [ { "apiUrl": "https://polynomialscan.io/api", @@ -2485,9 +3039,9 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Polynomial", - "domainId": 8008, + "domainId": 1000008008, "gasCurrencyCoinGeckoId": "ethereum", - "name": "polynomial", + "name": "polynomialfi", "nativeToken": { "decimals": 18, "name": "Ethereum", @@ -2501,6 +3055,42 @@ ], "technicalStack": "opstack" }, + "prom": { + "blockExplorers": [ + { + "apiUrl": "https://prom-blockscout.eu-north-2.gateway.fm/api/eth-rpc", + "family": "blockscout", + "name": "Prom Explorer", + "url": "https://prom-blockscout.eu-north-2.gateway.fm" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 6, + "reorgPeriod": 5 + }, + "chainId": 227, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Prom", + "domainId": 227, + "gasCurrencyCoinGeckoId": "prometeus", + "name": "prom", + "nativeToken": { + "decimals": 18, + "name": "Prom", + "symbol": "PROM" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://prom-rpc.eu-north-2.gateway.fm" + } + ], + "technicalStack": "polygoncdk" + }, "proofofplay": { "blockExplorers": [ { @@ -2540,7 +3130,7 @@ ], "technicalStack": "arbitrumnitro" }, - "rari": { + "rarichain": { "blockExplorers": [ { "apiUrl": "https://mainnet.explorer.rarichain.org/api", @@ -2560,12 +3150,12 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "RARI Chain", - "domainId": 1380012617, + "domainId": 1000012617, "gasCurrencyCoinGeckoId": "ethereum", "index": { - "from": 541753 + "from": 688784 }, - "name": "rari", + "name": "rarichain", "nativeToken": { "decimals": 18, "name": "Ethereum", @@ -2600,7 +3190,7 @@ }, "displayName": "re.al", "domainId": 111188, - "gasCurrencyCoinGeckoId": "real-ether", + "gasCurrencyCoinGeckoId": "ethereum", "index": { "from": 363159 }, @@ -2655,7 +3245,46 @@ ], "technicalStack": "opstack" }, - "rootstock": { + "rivalz": { + "blockExplorers": [ + { + "apiUrl": "https://rivalz.calderaexplorer.xyz/api", + "family": "blockscout", + "name": "Rivalz Explorer", + "url": "https://rivalz.calderaexplorer.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 0 + }, + "chainId": 753, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Rivalz", + "domainId": 753, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 21 + }, + "name": "rivalz", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rivalz.calderachain.xyz/http" + } + ], + "technicalStack": "arbitrumnitro" + }, + "rootstockmainnet": { "blockExplorers": [ { "apiUrl": "https://rootstock.blockscout.com/api", @@ -2675,9 +3304,9 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Rootstock", - "domainId": 30, + "domainId": 1000000030, "gasCurrencyCoinGeckoId": "rootstock", - "name": "rootstock", + "name": "rootstockmainnet", "nativeToken": { "decimals": 18, "name": "Rootstock Smart Bitcoin", @@ -2771,7 +3400,19 @@ "protocol": "ethereum", "rpcUrls": [ { - "http": "https://scroll.blockpi.network/v1/rpc/public" + "http": "https://rpc.scroll.io" + }, + { + "http": "https://rpc.ankr.com/scroll" + }, + { + "http": "https://scroll-mainnet.chainstacklabs.com" + }, + { + "http": "https://scroll.drpc.org" + }, + { + "http": "https://1rpc.io/scroll" } ], "technicalStack": "other", @@ -2930,11 +3571,119 @@ ], "technicalStack": "other" }, + "soneium": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.soneium.org/api", + "family": "blockscout", + "name": "Soneium Explorer", + "url": "https://explorer.soneium.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 1868, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Soneium", + "domainId": 1868, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "soneium", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.soneium.org" + } + ], + "technicalStack": "opstack" + }, + "sonic": { + "blockExplorers": [ + { + "apiUrl": "https://api.sonicscan.org/api", + "family": "etherscan", + "name": "Sonic Explorer", + "url": "https://sonicscan.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 146, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic", + "domainId": 146, + "gasCurrencyCoinGeckoId": "fantom", + "name": "sonic", + "nativeToken": { + "decimals": 18, + "name": "Sonic", + "symbol": "S" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.soniclabs.com" + } + ], + "technicalStack": "other" + }, + "soon": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.soo.network/", + "family": "other", + "name": "SOON Explorer", + "url": "https://explorer.soo.network/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.05, + "reorgPeriod": 0 + }, + "chainId": 50075007, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "SOON", + "domainId": 50075007, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "soon", + "nativeToken": { + "decimals": 9, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://rpc.mainnet.soo.network/rpc" + } + ], + "technicalStack": "other" + }, "stride": { "bech32Prefix": "stride", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/stride", + "apiUrl": "https://apis.mintscan.io/v1/stride", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/stride" @@ -2991,7 +3740,43 @@ "gasPrice": "0.0025" } }, - "superposition": { + "superseed": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.superseed.xyz/api", + "family": "blockscout", + "name": "Superseed Explorer", + "url": "https://explorer.superseed.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 5330, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Superseed", + "domainId": 5330, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "superseed", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.superseed.xyz" + } + ], + "technicalStack": "opstack" + }, + "superpositionmainnet": { "blockExplorers": [ { "apiUrl": "https://explorer.superposition.so/api", @@ -3011,12 +3796,12 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Superposition", - "domainId": 55244, + "domainId": 1000055244, "gasCurrencyCoinGeckoId": "ethereum", "index": { - "from": 1201 + "from": 2743 }, - "name": "superposition", + "name": "superpositionmainnet", "nativeToken": { "decimals": 18, "name": "Ethereum", @@ -3030,6 +3815,43 @@ ], "technicalStack": "arbitrumnitro" }, + "swell": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.swellnetwork.io/api", + "family": "blockscout", + "name": "Swell Explorer", + "url": "https://explorer.swellnetwork.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 1923, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Swell", + "domainId": 1923, + "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://trx-swell.safe.protofire.io", + "name": "swell", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://swell-mainnet.alt.technology" + } + ], + "technicalStack": "opstack" + }, "taiko": { "blockExplorers": [ { @@ -3104,6 +3926,153 @@ ], "technicalStack": "polkadotsubstrate" }, + "telos": { + "blockExplorers": [ + { + "apiUrl": "https://www.teloscan.io/api", + "family": "other", + "name": "Teloscan", + "url": "https://www.teloscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": "finalized" + }, + "chainId": 40, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Telos EVM", + "domainId": 40, + "gasCurrencyCoinGeckoId": "telos", + "name": "telos", + "nativeToken": { + "decimals": 18, + "name": "Telos", + "symbol": "TLOS" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.telos.net" + }, + { + "http": "https://telos.drpc.org" + } + ], + "technicalStack": "other" + }, + "treasure": { + "blockExplorers": [ + { + "apiUrl": "https://rpc-explorer-verify.treasure.lol/contract_verification", + "family": "etherscan", + "name": "Treasurescan", + "url": "https://treasurescan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 0 + }, + "chainId": 61166, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Treasure", + "domainId": 61166, + "gasCurrencyCoinGeckoId": "magic", + "name": "treasure", + "nativeToken": { + "decimals": 18, + "name": "MAGIC", + "symbol": "MAGIC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.treasure.lol" + } + ], + "technicalStack": "zksync" + }, + "unichain": { + "blockExplorers": [ + { + "apiUrl": "https://unichain.blockscout.com/api", + "family": "blockscout", + "name": "Unichain Explorer", + "url": "https://unichain.blockscout.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 130, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Unichain", + "domainId": 130, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "unichain", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.unichain.org" + } + ], + "technicalStack": "opstack" + }, + "vana": { + "blockExplorers": [ + { + "apiUrl": "https://vanascan.io/api/eth-rpc", + "family": "blockscout", + "name": "Vana Explorer", + "url": "https://vanascan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 6, + "reorgPeriod": 5 + }, + "chainId": 1480, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Vana", + "domainId": 1480, + "gasCurrencyCoinGeckoId": "vana", + "name": "vana", + "nativeToken": { + "decimals": 18, + "name": "Vana", + "symbol": "VANA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.vana.org" + } + ], + "technicalStack": "other" + }, "viction": { "blockExplorers": [ { @@ -3262,7 +4231,7 @@ "zeronetwork": { "blockExplorers": [ { - "apiUrl": "https://zero-network-api.calderaexplorer.xyz/api", + "apiUrl": "https://zero-network.calderaexplorer.xyz/verification/contract_verification", "family": "etherscan", "name": "Zero Network Explorer", "url": "https://zerion-explorer.vercel.app" @@ -3281,6 +4250,7 @@ "displayName": "Zero Network", "domainId": 543210, "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://prod.zeronet-mainnet.transaction.keypersafe.xyz", "name": "zeronetwork", "nativeToken": { "decimals": 18, @@ -3378,10 +4348,50 @@ ], "technicalStack": "opstack" }, + "zklink": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.zklink.io/contract_verification", + "family": "etherscan", + "name": "zkLink Nova Block Explorer", + "url": "https://explorer.zklink.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 0 + }, + "chainId": 810180, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "zkLink Nova", + "displayNameShort": "zkLink", + "domainId": 810180, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "zklink", + "nativeToken": { + "decimals": 18, + "name": "Ethereum", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.zklink.io" + }, + { + "http": "https://rpc.zklink.network" + } + ], + "technicalStack": "zksync" + }, "zksync": { "blockExplorers": [ { - "apiUrl": "https://block-explorer-api.mainnet.zksync.io/api", + "apiUrl": "https://zksync2-mainnet-explorer.zksync.io/contract_verification", "family": "etherscan", "name": "zkSync Explorer", "url": "https://explorer.zksync.io" diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json new file mode 100644 index 0000000000..490a5ab2ba --- /dev/null +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json @@ -0,0 +1,1047 @@ +{ + "alephzeroevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x33f20e6e775747d60301c6ea1c50e51f0389740c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa" + ] + }, + "ancient8": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbb5842ae0e05215b53df4787a29144efb7e67551", + "0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969", + "0x95c7bf235837cb5a609fe6c95870410b9f68bcff" + ] + }, + "apechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "appchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x0531251bbadc1f9f19ccce3ca6b3f79f08eae1be", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arbitrum": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", + "0xec68258a7c882ac2fc46b81ce80380054ffb4ef2", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "arbitrumnova": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd2a5e9123308d187383c87053811a2c21bd8af1f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arthera": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x13710ac11c36c169f62fba95767ae59a1e57098d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "astar": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4d1b2cade01ee3493f44304653d8e352c66ec3e7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "astarzkevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x89ecdd6caf138934bf3a2fb7b323984d72fd66de", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "aurora": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "avalanche": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3fb8263859843bffb02950c492d492cae169f4cf", + "0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" + ] + }, + "b3": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd77b516730a836fc41934e7d5864e72c165b934e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "base": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xcff391b4e516452d424db66beb9052b041a9ed79", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "bitlayer": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "blast": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xf20c0b09f597597c8d2430d3d72dfddaf09177d1", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x1652d8ba766821cf01aeea34306dfc1cab964a32", + "0x54bb0036f777202371429e062fe6aee0d59442f9" + ] + }, + "bob": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x20f283be1eb0e81e22f51705dcb79883cfdd34aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "boba": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xebeb92c94ca8408e73aa16fd554cb3a7df075c59", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "bsc": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x570af9b7b36568c8877eebba6c6727aa9dab7268", + "0x8292b1a53907ece0f76af8a50724e9492bcdc8a3", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "bsquared": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcadc90933c9fbe843358a4e70e46ad2db78e28aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "celo": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x63478422679303c3e4fc611b771fa4a707ef7f4a", + "0x622e43baf06ad808ca8399360d9a2d9a1a12688b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "cheesechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x478fb53c6860ae8fc35235ba0d38d49b13128226", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "chilizmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conflux": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conwai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "coredao": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbd6e158a3f5830d99d7d2bce192695bc4a148de2", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "corn": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc80b2e3e38220e02d194a0effa9d5bfe89894c07", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "cyber": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x94d7119ceeb802173b6924e6cc8c4cd731089a27", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "degenchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x433e311f19524cd64fb2123ad0aa1579a4e1fc83", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "dogechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xe43f742c37858746e6d7e458bc591180d0cba440", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "duckchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x91d55fe6dac596a6735d96365e21ce4bca21d83c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "eclipsemainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0", + "0x3571223e745dc0fcbdefa164c9b826b90c0d2dac", + "0xea83086a62617a7228ce4206fae2ea8b0ab23513", + "0x4d4629f5bfeabe66edc7a78da26ef5273c266f97" + ] + }, + "endurance": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x28c5b322da06f184ebf68693c5d19df4d4af13e5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x7419021c0de2772b763e554480158a82a291c1f2" + ] + }, + "ethereum": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x03c842db86a6a3e524d4a6615390c1ea8e2b9541", + "0x94438a7de38d4548ae54df5c6010c4ebc5239eae", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0xb683b742b378632a5f73a2a5a45801b3489bba44", + "0xbf1023eff3dba21263bf2db2add67a0d6bcda2de" + ] + }, + "everclear": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0xD79DFbF56ee2268f061cc613027a44A880f61Ba2" + ] + }, + "evmos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fantom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa779572028e634e16f26af5dfd4fa685f619457d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flame": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1fa928ce884fa16357d4b8866e096392d4d81f43", + "0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab", + "0x09f9de08f7570c4146caa708dc9f75b56958957f", + "0xf1f4ae9959490380ad7863e79c3faf118c1fbf77", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "flare": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb65e52be342dba3ab2c088ceeb4290c744809134", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flowmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xe132235c958ca1f3f24d772e5970dd58da4c0f6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59" + ] + }, + "form": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x58554b2e76167993b5fc000d0070a2f883cd333a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fraxtal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82", + "0x573e960e07ad74ea2c5f1e3c31b2055994b12797", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91" + ] + }, + "fusemainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9", + "0x6760226b34213d262D41D5291Ed57E81a68b4E0b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "gnosis": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xd4df66a859585678f2ea8357161d896be19cc1ca", + "0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "gravity": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d549bf757a02a6f6068e9363196ecd958c974e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "harmony": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd677803a67651974b1c264171b5d7ca8838db8d5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "immutablezkevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbdda85b19a5efbe09e52a32db1a072f043dd66da", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "inevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf9e35ee88e4448a3673b4676a4e153e3584a08eb", + "0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc", + "0x9ab11f38a609940153850df611c9a2175dcffe0f" + ] + }, + "injective": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbfb8911b72cfb138c7ce517c57d9c691535dc517", + "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", + "0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9" + ] + }, + "ink": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xb533b8b104522958b984fb258e0684dec0f1a6a5", + "0xd207a6dfd887d91648b672727ff1aef6223cb15a", + "0xa40203b5301659f1e201848d92f5e81f64f206f5", + "0xff9c1e7b266a36eda0d9177d4236994d94819dc0", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "kaia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9de0b3abb221d19719882fa4d61f769fdc2be9a4", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "kroma": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x71b83c21342787d758199e4b8634d3a15f02dc6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "linea": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf2d5409a59e0f5ae7635aff73685624904a77d94", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lisk": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e", + "0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf0da628f3fb71652d48260bad4691054045832ce", + "0xead4141b6ea149901ce4f4b556953f66d04b1d0c" + ] + }, + "lukso": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa5e953701dcddc5b958b5defb677a829d908df6d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "lumia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lumiaprism": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb69731640ffd4338a2c9358a935b0274c6463f85", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "mantapacific": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", + "0x521a3e6bf8d24809fde1c1fd3494a859a16f132c", + "0x14025fe092f5f8a401dd9819704d9072196d2125", + "0x25b9a0961c51e74fd83295293bc029131bf1e05a", + "0xa0eE95e280D46C14921e524B075d0C341e7ad1C8", + "0xcc9a0b6de7fe314bd99223687d784730a75bb957", + "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" + ] + }, + "mantle": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "merlin": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "metal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xd9f7f1a05826197a93df51e86cefb41dfbfb896a", + "0x01e3909133d20c05bbc94247769235d30101f748", + "0xaba06266f47e3ef554d218b879bd86114a8dabd4", + "0x05d91f80377ff5e9c6174025ffaf094c57a4766a", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "metis": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc4a3d25107060e800a43842964546db508092260", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "mint": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x0230505530b80186f8cdccfaf9993eb97aebe98a" + ] + }, + "mode": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x65C140e3a05F33192384AffEF985696Fe3cDDE42", + "0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x485a4f0009d9afbbf44521016f9b8cdd718e36ea" + ] + }, + "molten": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "moonbeam": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x2225e2f4e9221049456da93b71d2de41f3b6b2a8", + "0x645428d198d2e76cbd9c1647f5c80740bb750b97", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "morph": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4884535f393151ec419add872100d352f71af380", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "neutron": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "0xb65438a014fb05fbadcfe35bc6e25d372b6ba460", + "0x42fa752defe92459370a052b6387a87f7de9b80c", + "0xc79503a3e3011535a9c60f6d21f76f59823a38bd", + "0x47aa126e05933b95c5eb90b26e6b668d84f4b25a", + "0x54b2cca5091b098a1a993dec03c4d1ee9af65999", + "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" + ] + }, + "oortmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1" + ] + }, + "optimism": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x20349eadc6c72e94ce38268b96692b1a5c20de4f", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB", + "0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12" + ] + }, + "orderly": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "osmosis": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xea483af11c19fa41b16c31d1534c2a486a92bcac" + ] + }, + "polygon": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", + "0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "polygonzkevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x86f2a44592bb98da766e880cfd70d3bbb295e61a", + "0x865818fe1db986036d5fd0466dcd462562436d1a", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" + ] + }, + "polynomialfi": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d348c2d365040e56f3fee07e6897122915f513", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "prom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb0c4042b7c9a95345be8913f4cdbf4043b923d98", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "proofofplay": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcda40baa71970a06e5f55e306474de5ca4e21c3b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rarichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeac012df7530720dd7d6f9b727e4fe39807d1516", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "real": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "redstone": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1400b9737007f7978d8b4bbafb4a69c83f0641a7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "rivalz": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rootstockmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8675eb603d62ab64e3efe90df914e555966e04ac", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "sanko": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x795c37d5babbc44094b084b0c89ed9db9b5fae39", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "scroll": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xad557170a9f2f21c35e03de07cb30dcbcc3dff63", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948" + ] + }, + "sei": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "shibarium": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xfa33391ee38597cbeef72ccde8c9e13e01e78521", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "snaxchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "soneium": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd4b7af853ed6a2bfc329ecef545df90c959cbee8" + ] + }, + "sonic": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "soon": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76" + ] + }, + "stride": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x88f0E5528131b10e3463C4c68108217Dd33462ac", + "0xa3eaa1216827ad63dd9db43f6168258a89177990", + "0x3f869C36110F00D10dC74cca3ac1FB133cf019ad", + "0x502dC6135d16E74056f609FBAF76846814C197D3", + "0xc36979780c1aD43275182600a61Ce41f1C390FbE", + "0x87460dcEd16a75AECdBffD4189111d30B099f5b0", + "0xf54982134e52Eb7253236943FBffE0886C5bde0C", + "0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "superpositionmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "superseed": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88", + "0x68f3a3b244f6ddc135130200a6b8729e290b4240", + "0x6ff4554cffbc2e4e4230b78e526eab255101d05a", + "0x55880ac03fdf15fccff54ed6f8a83455033edd22", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "swell": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4f51e4f4c7fb45d82f91568480a1a2cfb69216ed", + "0x9eadf9217be22d9878e0e464727a2176d5c69ff8", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "taiko": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xa930073c8f2d0b2f7423ea32293e0d1362e65d79", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a" + ] + }, + "tangle": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0xe271ef9a6e312540f099a378865432fa73f26689" + ] + }, + "telos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "treasure": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x6ad994819185553e8baa01533f0cd2c7cadfe6cc", + "0x278460fa51ff448eb53ffa62951b4b8e3e8f74e3", + "0xe92ff70bb463e2aa93426fd2ba51afc39567d426", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "unichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9773a382342ebf604a2e5de0a1f462fb499e28b1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "vana": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xba2f4f89cae6863d8b49e4ca0208ed48ad9ac354" + ] + }, + "viction": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x6D113Ae51bfeA7b63a8828f97e9dcE393B25c189", + "0xa3f93fe365bf99f431d8fde740b140615e24f99b", + "0x1f87c368f8e05a85ef9126d984a980a20930cb9c" + ] + }, + "worldchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x31048785845325b22817448b68d08f8a8fe36854", + "0x11e2a683e83617f186614071e422b857256a9aae", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "xai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "xlayer": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa2ae7c594703e988f23d97220717c513db638ea3", + "0xfed056cC0967F5BC9C6350F6C42eE97d3983394d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "zeronetwork": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zetachain": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zircuit": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb", + "0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061", + "0x0180444c9342BD672867Df1432eb3dA354413a6E", + "0x1da9176C2CE5cC7115340496fa7D1800a98911CE" + ] + }, + "zklink": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x217a8cb4789fc45abf56cb6e2ca96f251a5ac181", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zksync": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x75237d42ce8ea27349a0254ada265db94157e0c1" + ] + }, + "zoramainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x35130945b625bb69b28aee902a3b9a76fa67125f", + "0x7089b6352d37d23fb05a7fee4229c78e038fba09", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + } +} diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json new file mode 100644 index 0000000000..10cbbb91a5 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json @@ -0,0 +1,3 @@ +{ + "program_id": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM" +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/soon/hyperlane/multisig-config.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/soon/hyperlane/multisig-config.json new file mode 100644 index 0000000000..35b1a4e5ac --- /dev/null +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/soon/hyperlane/multisig-config.json @@ -0,0 +1,1051 @@ +{ + "alephzeroevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x33f20e6e775747d60301c6ea1c50e51f0389740c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa" + ] + }, + "ancient8": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbb5842ae0e05215b53df4787a29144efb7e67551", + "0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969", + "0x95c7bf235837cb5a609fe6c95870410b9f68bcff" + ] + }, + "apechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "appchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x0531251bbadc1f9f19ccce3ca6b3f79f08eae1be", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arbitrum": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", + "0xec68258a7c882ac2fc46b81ce80380054ffb4ef2", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "arbitrumnova": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd2a5e9123308d187383c87053811a2c21bd8af1f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arthera": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x13710ac11c36c169f62fba95767ae59a1e57098d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "astar": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4d1b2cade01ee3493f44304653d8e352c66ec3e7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "astarzkevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x89ecdd6caf138934bf3a2fb7b323984d72fd66de", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "aurora": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "avalanche": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3fb8263859843bffb02950c492d492cae169f4cf", + "0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" + ] + }, + "b3": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd77b516730a836fc41934e7d5864e72c165b934e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "base": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xcff391b4e516452d424db66beb9052b041a9ed79", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "bitlayer": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "blast": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xf20c0b09f597597c8d2430d3d72dfddaf09177d1", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x1652d8ba766821cf01aeea34306dfc1cab964a32", + "0x54bb0036f777202371429e062fe6aee0d59442f9" + ] + }, + "bob": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x20f283be1eb0e81e22f51705dcb79883cfdd34aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "boba": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xebeb92c94ca8408e73aa16fd554cb3a7df075c59", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "bsc": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x570af9b7b36568c8877eebba6c6727aa9dab7268", + "0x8292b1a53907ece0f76af8a50724e9492bcdc8a3", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "bsquared": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcadc90933c9fbe843358a4e70e46ad2db78e28aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "celo": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x63478422679303c3e4fc611b771fa4a707ef7f4a", + "0x622e43baf06ad808ca8399360d9a2d9a1a12688b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "cheesechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x478fb53c6860ae8fc35235ba0d38d49b13128226", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "chilizmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conflux": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conwai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "coredao": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbd6e158a3f5830d99d7d2bce192695bc4a148de2", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "corn": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc80b2e3e38220e02d194a0effa9d5bfe89894c07", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "cyber": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x94d7119ceeb802173b6924e6cc8c4cd731089a27", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "degenchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x433e311f19524cd64fb2123ad0aa1579a4e1fc83", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "dogechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xe43f742c37858746e6d7e458bc591180d0cba440", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "duckchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x91d55fe6dac596a6735d96365e21ce4bca21d83c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "eclipsemainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0", + "0x3571223e745dc0fcbdefa164c9b826b90c0d2dac", + "0xea83086a62617a7228ce4206fae2ea8b0ab23513", + "0x4d4629f5bfeabe66edc7a78da26ef5273c266f97" + ] + }, + "endurance": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x28c5b322da06f184ebf68693c5d19df4d4af13e5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x7419021c0de2772b763e554480158a82a291c1f2" + ] + }, + "ethereum": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x03c842db86a6a3e524d4a6615390c1ea8e2b9541", + "0x94438a7de38d4548ae54df5c6010c4ebc5239eae", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0xb683b742b378632a5f73a2a5a45801b3489bba44", + "0xbf1023eff3dba21263bf2db2add67a0d6bcda2de" + ] + }, + "everclear": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0xD79DFbF56ee2268f061cc613027a44A880f61Ba2" + ] + }, + "evmos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fantom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa779572028e634e16f26af5dfd4fa685f619457d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flame": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1fa928ce884fa16357d4b8866e096392d4d81f43", + "0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab", + "0x09f9de08f7570c4146caa708dc9f75b56958957f", + "0xf1f4ae9959490380ad7863e79c3faf118c1fbf77", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "flare": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb65e52be342dba3ab2c088ceeb4290c744809134", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flowmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xe132235c958ca1f3f24d772e5970dd58da4c0f6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59" + ] + }, + "form": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x58554b2e76167993b5fc000d0070a2f883cd333a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fraxtal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82", + "0x573e960e07ad74ea2c5f1e3c31b2055994b12797", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91" + ] + }, + "fusemainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9", + "0x6760226b34213d262D41D5291Ed57E81a68b4E0b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "gnosis": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xd4df66a859585678f2ea8357161d896be19cc1ca", + "0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "gravity": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d549bf757a02a6f6068e9363196ecd958c974e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "harmony": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd677803a67651974b1c264171b5d7ca8838db8d5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "immutablezkevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbdda85b19a5efbe09e52a32db1a072f043dd66da", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "inevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf9e35ee88e4448a3673b4676a4e153e3584a08eb", + "0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc", + "0x9ab11f38a609940153850df611c9a2175dcffe0f" + ] + }, + "injective": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbfb8911b72cfb138c7ce517c57d9c691535dc517", + "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", + "0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9" + ] + }, + "ink": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xb533b8b104522958b984fb258e0684dec0f1a6a5", + "0xd207a6dfd887d91648b672727ff1aef6223cb15a", + "0xa40203b5301659f1e201848d92f5e81f64f206f5", + "0xff9c1e7b266a36eda0d9177d4236994d94819dc0", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "kaia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9de0b3abb221d19719882fa4d61f769fdc2be9a4", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "kroma": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x71b83c21342787d758199e4b8634d3a15f02dc6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "linea": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf2d5409a59e0f5ae7635aff73685624904a77d94", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lisk": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e", + "0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf0da628f3fb71652d48260bad4691054045832ce", + "0xead4141b6ea149901ce4f4b556953f66d04b1d0c" + ] + }, + "lukso": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa5e953701dcddc5b958b5defb677a829d908df6d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "lumia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lumiaprism": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb69731640ffd4338a2c9358a935b0274c6463f85", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "mantapacific": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", + "0x521a3e6bf8d24809fde1c1fd3494a859a16f132c", + "0x14025fe092f5f8a401dd9819704d9072196d2125", + "0x25b9a0961c51e74fd83295293bc029131bf1e05a", + "0xa0eE95e280D46C14921e524B075d0C341e7ad1C8", + "0xcc9a0b6de7fe314bd99223687d784730a75bb957", + "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" + ] + }, + "mantle": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "merlin": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "metal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xd9f7f1a05826197a93df51e86cefb41dfbfb896a", + "0x01e3909133d20c05bbc94247769235d30101f748", + "0xaba06266f47e3ef554d218b879bd86114a8dabd4", + "0x05d91f80377ff5e9c6174025ffaf094c57a4766a", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "metis": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc4a3d25107060e800a43842964546db508092260", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "mint": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x0230505530b80186f8cdccfaf9993eb97aebe98a" + ] + }, + "mode": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x65C140e3a05F33192384AffEF985696Fe3cDDE42", + "0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x485a4f0009d9afbbf44521016f9b8cdd718e36ea" + ] + }, + "molten": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "moonbeam": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x2225e2f4e9221049456da93b71d2de41f3b6b2a8", + "0x645428d198d2e76cbd9c1647f5c80740bb750b97", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "morph": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4884535f393151ec419add872100d352f71af380", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "neutron": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "0xb65438a014fb05fbadcfe35bc6e25d372b6ba460", + "0x42fa752defe92459370a052b6387a87f7de9b80c", + "0xc79503a3e3011535a9c60f6d21f76f59823a38bd", + "0x47aa126e05933b95c5eb90b26e6b668d84f4b25a", + "0x54b2cca5091b098a1a993dec03c4d1ee9af65999", + "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" + ] + }, + "oortmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1" + ] + }, + "optimism": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x20349eadc6c72e94ce38268b96692b1a5c20de4f", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB", + "0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12" + ] + }, + "orderly": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "osmosis": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xea483af11c19fa41b16c31d1534c2a486a92bcac" + ] + }, + "polygon": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", + "0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "polygonzkevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x86f2a44592bb98da766e880cfd70d3bbb295e61a", + "0x865818fe1db986036d5fd0466dcd462562436d1a", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" + ] + }, + "polynomialfi": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d348c2d365040e56f3fee07e6897122915f513", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "prom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb0c4042b7c9a95345be8913f4cdbf4043b923d98", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "proofofplay": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcda40baa71970a06e5f55e306474de5ca4e21c3b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rarichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeac012df7530720dd7d6f9b727e4fe39807d1516", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "real": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "redstone": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1400b9737007f7978d8b4bbafb4a69c83f0641a7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "rivalz": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rootstockmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8675eb603d62ab64e3efe90df914e555966e04ac", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "sanko": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x795c37d5babbc44094b084b0c89ed9db9b5fae39", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "scroll": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xad557170a9f2f21c35e03de07cb30dcbcc3dff63", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948" + ] + }, + "sei": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "shibarium": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xfa33391ee38597cbeef72ccde8c9e13e01e78521", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "snaxchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "solanamainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x28464752829b3ea59a497fca0bdff575c534c3ff", + "0x2b7514a2f77bd86bbf093fe6bb67d8611f51c659", + "0xd90ea26ff731d967c5ea660851f7d63cb04ab820", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xcb6bcbd0de155072a7ff486d9d7286b0f71dcc2d" + ] + }, + "soneium": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd4b7af853ed6a2bfc329ecef545df90c959cbee8" + ] + }, + "sonic": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "stride": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x88f0E5528131b10e3463C4c68108217Dd33462ac", + "0xa3eaa1216827ad63dd9db43f6168258a89177990", + "0x3f869C36110F00D10dC74cca3ac1FB133cf019ad", + "0x502dC6135d16E74056f609FBAF76846814C197D3", + "0xc36979780c1aD43275182600a61Ce41f1C390FbE", + "0x87460dcEd16a75AECdBffD4189111d30B099f5b0", + "0xf54982134e52Eb7253236943FBffE0886C5bde0C", + "0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "superpositionmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "superseed": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88", + "0x68f3a3b244f6ddc135130200a6b8729e290b4240", + "0x6ff4554cffbc2e4e4230b78e526eab255101d05a", + "0x55880ac03fdf15fccff54ed6f8a83455033edd22", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "swell": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4f51e4f4c7fb45d82f91568480a1a2cfb69216ed", + "0x9eadf9217be22d9878e0e464727a2176d5c69ff8", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "taiko": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xa930073c8f2d0b2f7423ea32293e0d1362e65d79", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a" + ] + }, + "tangle": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0xe271ef9a6e312540f099a378865432fa73f26689" + ] + }, + "telos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "treasure": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x6ad994819185553e8baa01533f0cd2c7cadfe6cc", + "0x278460fa51ff448eb53ffa62951b4b8e3e8f74e3", + "0xe92ff70bb463e2aa93426fd2ba51afc39567d426", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "unichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9773a382342ebf604a2e5de0a1f462fb499e28b1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "vana": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xba2f4f89cae6863d8b49e4ca0208ed48ad9ac354" + ] + }, + "viction": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x6D113Ae51bfeA7b63a8828f97e9dcE393B25c189", + "0xa3f93fe365bf99f431d8fde740b140615e24f99b", + "0x1f87c368f8e05a85ef9126d984a980a20930cb9c" + ] + }, + "worldchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x31048785845325b22817448b68d08f8a8fe36854", + "0x11e2a683e83617f186614071e422b857256a9aae", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "xai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "xlayer": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa2ae7c594703e988f23d97220717c513db638ea3", + "0xfed056cC0967F5BC9C6350F6C42eE97d3983394d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "zeronetwork": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zetachain": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zircuit": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb", + "0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061", + "0x0180444c9342BD672867Df1432eb3dA354413a6E", + "0x1da9176C2CE5cC7115340496fa7D1800a98911CE" + ] + }, + "zklink": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x217a8cb4789fc45abf56cb6e2ca96f251a5ac181", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zksync": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x75237d42ce8ea27349a0254ada265db94157e0c1" + ] + }, + "zoramainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x35130945b625bb69b28aee902a3b9a76fa67125f", + "0x7089b6352d37d23fb05a7fee4229c78e038fba09", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + } +} diff --git a/rust/sealevel/environments/mainnet3/solanamainnet/gas-oracle-configs-solanamainnet.json b/rust/sealevel/environments/mainnet3/solanamainnet/gas-oracle-configs-solanamainnet.json index 44f00e80a1..463990b543 100644 --- a/rust/sealevel/environments/mainnet3/solanamainnet/gas-oracle-configs-solanamainnet.json +++ b/rust/sealevel/environments/mainnet3/solanamainnet/gas-oracle-configs-solanamainnet.json @@ -7,5 +7,14 @@ "gasPrice": "2", "tokenDecimals": 9 } + }, + { + "domain": 50075007, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "25036363636360000000", + "gasPrice": "2", + "tokenDecimals": 9 + } } ] diff --git a/rust/sealevel/environments/mainnet3/soon/core/program-ids.json b/rust/sealevel/environments/mainnet3/soon/core/program-ids.json new file mode 100644 index 0000000000..249ca53ab3 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/soon/core/program-ids.json @@ -0,0 +1,8 @@ +{ + "mailbox": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", + "validator_announce": "GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz", + "multisig_ism_message_id": "4fPoa26ayqY1cwY3AcqUPvdLLNHpjJGdDQevtnTLAAnH", + "igp_program_id": "5AAMBemjUrAprKJzi22Si9pyYhK8vTr7Jpti7LEXo6d8", + "overhead_igp_account": "GctmRsKQM5VLPrUPpsQ7Kc7RaVKNC2Fev31n1KtLkj8A", + "igp_account": "Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ" +} diff --git a/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json b/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json new file mode 100644 index 0000000000..5a0f6bc9a9 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json @@ -0,0 +1,20 @@ +[ + { + "domain": 1, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "15000000000000000000", + "gasPrice": "10000000000", + "tokenDecimals": 18 + } + }, + { + "domain": 1399811149, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "887000000000000000", + "gasPrice": "15", + "tokenDecimals": 9 + } + } +] diff --git a/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/program-ids.json new file mode 100644 index 0000000000..4120605fd6 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/program-ids.json @@ -0,0 +1,10 @@ +{ + "solanamainnet": { + "hex": "0x1a44f075753adbb13e07920162d7c78d419c1be1adffe4fd11f66ea6d7816ac3", + "base58": "2mYa5q9chqBxR89Nc5CtAqdy5Wwjev5269GyxNFaT95U" + }, + "soon": { + "hex": "0x99e46b5d78d402b0e056484e6ddc7dd99f873aa7621da7eee6bee7e9eca1307a", + "base58": "BMjPo9Yz9bdiLuKVfHfjuAEE6JgmnMWYaVEv1ehFYnd7" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json new file mode 100644 index 0000000000..9f4972c9c0 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json @@ -0,0 +1,18 @@ +{ + "solanamainnet": { + "type": "collateral", + "decimals": 5, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "interchainSecurityModule": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM", + "token": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", + "splTokenProgram": "token" + }, + "soon": { + "type": "synthetic", + "decimals": 5, + "name": "Bonk", + "symbol": "Bonk", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/9a11b8b53eda0473ea415d63043b13ad92454e82/deployments/warp_routes/Bonk/metadata.json", + "interchainGasPaymaster": "GctmRsKQM5VLPrUPpsQ7Kc7RaVKNC2Fev31n1KtLkj8A" + } +} diff --git a/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json new file mode 100644 index 0000000000..6d68609266 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json @@ -0,0 +1,10 @@ +{ + "solanamainnet": { + "hex": "0xe492f8f3cb623b87d8ae46ecdb541424ae870a39110ad09087a793b0237aaff7", + "base58": "GPFwRQ5Cw6dTWnmappUKJt76DD8yawxPx28QugfCaGaA" + }, + "soon": { + "hex": "0x50c3447854a0cf980f4a562fd34ce4031a0b7fe725521ad21482b74cb2b733ac", + "base58": "6SGK4PnHefm4egyUUeVro8wKBkuPexVehsjuUK8auJ8b" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json new file mode 100644 index 0000000000..e4d638b0fc --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json @@ -0,0 +1,16 @@ +{ + "solanamainnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "interchainSecurityModule": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM" + }, + "soon": { + "type": "synthetic", + "decimals": 9, + "name": "Solana", + "symbol": "SOL", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/77a04c0b7e214ae17853215467f8ddea5e0ac710/deployments/warp_routes/SOL/metadata.json", + "interchainGasPaymaster": "GctmRsKQM5VLPrUPpsQ7Kc7RaVKNC2Fev31n1KtLkj8A" + } +} diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index a0babee028..8dc9db0231 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,17 @@ # @hyperlane-xyz/core +## 5.9.0 + +### Minor Changes + +- 0eb8d52a4: Made releaseValueToRecipient internal + +### Patch Changes + +- Updated dependencies [79f8197f3] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/utils@8.0.0 + ## 5.8.3 ### Patch Changes diff --git a/solidity/contracts/PackageVersioned.sol b/solidity/contracts/PackageVersioned.sol index ced404fe92..325ac0b25a 100644 --- a/solidity/contracts/PackageVersioned.sol +++ b/solidity/contracts/PackageVersioned.sol @@ -7,5 +7,5 @@ pragma solidity >=0.6.11; **/ abstract contract PackageVersioned { // GENERATED CODE - DO NOT EDIT - string public constant PACKAGE_VERSION = "5.8.3"; + string public constant PACKAGE_VERSION = "5.9.0"; } diff --git a/solidity/contracts/client/MailboxClient.sol b/solidity/contracts/client/MailboxClient.sol index 9c986a0cce..d5359f1d77 100644 --- a/solidity/contracts/client/MailboxClient.sol +++ b/solidity/contracts/client/MailboxClient.sol @@ -58,7 +58,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { } /** - * @notice Only accept messages from an Hyperlane Mailbox contract + * @notice Only accept messages from a Hyperlane Mailbox contract */ modifier onlyMailbox() { require( diff --git a/solidity/contracts/client/Router.sol b/solidity/contracts/client/Router.sol index 5d98f2cb9c..9ae6310dc5 100644 --- a/solidity/contracts/client/Router.sol +++ b/solidity/contracts/client/Router.sol @@ -145,7 +145,7 @@ abstract contract Router is MailboxClient, IMessageRecipient { } /** - * @notice Assert that the given domain has a Application Router registered and return its address + * @notice Assert that the given domain has an Application Router registered and return its address * @param _domain The domain of the chain for which to get the Application Router * @return _router The address of the remote Application Router on _domain */ diff --git a/solidity/contracts/hooks/README.md b/solidity/contracts/hooks/README.md new file mode 100644 index 0000000000..6c538dfd4c --- /dev/null +++ b/solidity/contracts/hooks/README.md @@ -0,0 +1,58 @@ +# Post-Dispatch Hooks + +Post-dispatch hooks allow developers to configure additional origin chain behavior with message content dispatched via the Mailbox. + +```mermaid +flowchart TB + subgraph Origin + Sender + M_O[(Mailbox)] + Hook[IPostDispatchHook] + + Sender -- "dispatch(..., metadata, hook)\n{value}" --> M_O + M_O -- "postDispatch(message, metadata)\n{value}" --> Hook + end +``` + +If the `postDispatch` function receives insufficient payment, it may revert. + +> [!WARNING] +> Post-Dispatch Hooks may be replayable. Developers creating custom hooks should implement safe checks to prevent this behavior. [Here](./warp-route/RateLimitedHook.sol#L16) is an example implementation. + +### Quote Dispatch (Fees) + +Fees are often charged in `postDispatch` to cover costs such as destination chain transaction submission and security provisioning. To receive a quote for a corresponding `postDispatch` call, you can query the `quoteDispatch` function. + +The Mailbox has a `quoteDispatch` function that returns the aggregate fee required for a `dispatch` call to be successful. + +```mermaid +flowchart TB + subgraph Origin + Sender + M_O[(Mailbox)] + R_H[RequiredHook] + Hook[Hook] + + Sender -- "quoteDispatch(..., metadata, hook)" --> M_O + M_O -- "required = quoteDispatch(message, metadata)" --> R_H + M_O -- "fee = hook.quoteDispatch(message, metadata)" --> Hook + M_O -- "required + fee" --> Sender + end +``` + +The custom `metadata` will be passed to the required hook's `quoteDispatch` and `postDispatch` functions, before being passed to the default hook's `postDispatch` function. + +```mermaid +flowchart LR + subgraph Origin Chain + Sender + M_O[(Mailbox)] + R_H[RequiredHook] + D_H[DefaultHook] + Sender -- "dispatch(..., metadata){value}" --> M_O + + M_O -. "fee = quoteDispatch(...)" .- R_H + M_O -- "postDispatch(metadata, ...)\n{fee}" --> R_H + M_O -. "postDispatch(metadata, ...)\n{value - fee}" ..-> D_H + end +``` diff --git a/solidity/contracts/isms/README.md b/solidity/contracts/isms/README.md new file mode 100644 index 0000000000..d9f74f3979 --- /dev/null +++ b/solidity/contracts/isms/README.md @@ -0,0 +1,20 @@ +# Interchain Security Modules + +Interchain security modules allow developers to configure additional security checks for message content dispatched via the Mailbox. + +```mermaid +flowchart LR + subgraph Destination Chain + ISM[InterchainSecurityModule] + Recipient[Recipient] + M_D[(Mailbox)] + + M_D -- "verify(metadata, message)" --> ISM + ISM -. "interchainSecurityModule()" .- Recipient + M_D -- "handle(origin, sender, body)" --> Recipient + + end +``` + +> [!WARNING] +> Interchain security modules may be replayable. Developers creating custom modules should include replay protection if necessary. [Here](./warp-route/RateLimitedIsm.sol#L23) is an example implementation. diff --git a/solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol b/solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol index a133de5d8d..ac5601125d 100644 --- a/solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol +++ b/solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol @@ -27,7 +27,7 @@ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Ini /** * @title AbstractMessageIdAuthorizedIsm - * @notice Uses external verification options to verify interchain messages which need a authorized caller + * @notice Uses external verification options to verify interchain messages which need an authorized caller */ abstract contract AbstractMessageIdAuthorizedIsm is IInterchainSecurityModule, diff --git a/solidity/exportBuildArtifact.sh b/solidity/exportBuildArtifact.sh index b8b27c89dd..04a17a9495 100755 --- a/solidity/exportBuildArtifact.sh +++ b/solidity/exportBuildArtifact.sh @@ -48,7 +48,7 @@ outputFileJs="./dist/zksync/buildArtifact.js" outputFileTsd="./dist/zksync/buildArtifact.d.ts" # log that we're in the script -echo 'Finding and processing hardhat build ZKSync artifact...' +echo 'Finding and processing hardhat build ZkSync artifact...' # Find most recently modified JSON build artifact if [ "$(uname)" = "Darwin" ]; then diff --git a/solidity/package.json b/solidity/package.json index c2e8d572ac..a96b94ac0b 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/core", "description": "Core solidity contracts for Hyperlane", - "version": "5.8.3", + "version": "5.9.0", "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/utils": "8.0.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3", diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index a259236246..9187b81069 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/ccip-server +## 8.0.0 + ## 7.3.0 ## 7.2.0 diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index 0795edf956..540b1d6a3e 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "7.3.0", + "version": "8.0.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 a7d9962b84..460d211bf2 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,42 @@ # @hyperlane-xyz/cli +## 8.0.0 + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 +- bb44f9b51: Add support for deploying Hooks using a HookConfig within a WarpConfig +- c2ca8490d: fix signer strategy init for broken cli commands +- 9f6b8c514: Allow self-relaying of all messages if there are multiple in a given dispatch transaction. +- 3c4bc1cca: Update hyperlane warp send to send a round trip transfer to all chains in WarpCoreConfig, if --origin and/or --destination is not provided. +- 79f8197f3: Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management +- a5ece3b30: Add chain technical stack selector with Arbitrum Nitro support to `hyperlane registry init` command +- d35502fa7: Update single chain selection to be searchable instead of a simple select + +### Patch Changes + +- 472b34670: Bump registry version to v6.3.0. +- 0c8372447: fix: balance check skip confirmation +- 657ac9255: Suppress help on CLI failures +- 9349ef73e: Fix strategy flag propagation +- cd7c41308: Fix yaml resource exhaustion +- 98ee79c17: Added ZKSync signer support using zksync-ethers package +- Updated dependencies [472b34670] +- Updated dependencies [79f8197f3] +- Updated dependencies [fd20bb1e9] +- Updated dependencies [26fbec8f6] +- Updated dependencies [71aefa03e] +- Updated dependencies [9f6b8c514] +- Updated dependencies [82cebabe4] +- Updated dependencies [95cc9571e] +- Updated dependencies [c690ca82f] +- Updated dependencies [5942e9cff] +- Updated dependencies [de1190656] +- Updated dependencies [e9911bb9d] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/sdk@8.0.0 + - @hyperlane-xyz/utils@8.0.0 + ## 7.3.0 ### Minor Changes diff --git a/typescript/cli/package.json b/typescript/cli/package.json index 3a249e154c..b1796610f4 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,16 +1,17 @@ { "name": "@hyperlane-xyz/cli", - "version": "7.3.0", + "version": "8.0.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": "6.6.0", - "@hyperlane-xyz/sdk": "7.3.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/sdk": "8.0.0", + "@hyperlane-xyz/utils": "8.0.0", "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", "@inquirer/prompts": "3.3.2", + "@inquirer/search": "^3.0.1", "ansi-escapes": "^7.0.0", "asn1.js": "^5.4.1", "bignumber.js": "^9.1.1", diff --git a/typescript/cli/src/avs/check.ts b/typescript/cli/src/avs/check.ts index 27055c6848..b2af3f7b73 100644 --- a/typescript/cli/src/avs/check.ts +++ b/typescript/cli/src/avs/check.ts @@ -6,7 +6,12 @@ import { MerkleTreeHook__factory, ValidatorAnnounce__factory, } from '@hyperlane-xyz/core'; -import { ChainMap, ChainName, MultiProvider } from '@hyperlane-xyz/sdk'; +import { + ChainMap, + ChainName, + MultiProvider, + isValidValidatorStorageLocation, +} from '@hyperlane-xyz/sdk'; import { Address, ProtocolType, isObjEmpty } from '@hyperlane-xyz/utils'; import { CommandContext } from '../context/types.js'; @@ -288,19 +293,18 @@ const setValidatorInfo = async ( 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://') - ) { + const lastStorageLocation = + storageLocation.length > 0 ? storageLocation.slice(-1)[0] : ''; + + // Skip if no storage location is found, address is not validating on this chain or if not a valid storage location + if (!isValidValidatorStorageLocation(lastStorageLocation)) { continue; } const [latestValidatorCheckpointIndex, latestCheckpointUrl] = - (await getLatestValidatorCheckpointIndexAndUrl(storageLocation[0])) ?? [ - undefined, - undefined, - ]; + (await getLatestValidatorCheckpointIndexAndUrl( + lastStorageLocation, + )) ?? [undefined, undefined]; if (!latestMerkleTreeCheckpointIndex) { warnings.push( diff --git a/typescript/cli/src/avs/stakeRegistry.ts b/typescript/cli/src/avs/stakeRegistry.ts index a9c50918da..bfe0157021 100644 --- a/typescript/cli/src/avs/stakeRegistry.ts +++ b/typescript/cli/src/avs/stakeRegistry.ts @@ -136,7 +136,7 @@ async function getOperatorSignature( // random salt is ok, because we register the operator right after const salt = utils.hexZeroPad(utils.randomBytes(32), 32); - // give a expiry timestamp 1 hour from now + // give an expiry timestamp 1 hour from now const expiry = utils.hexZeroPad( utils.hexlify(Math.floor(Date.now() / 1000) + 60 * 60), 32, diff --git a/typescript/cli/src/commands/core.ts b/typescript/cli/src/commands/core.ts index a75f6ae61e..51801d9db0 100644 --- a/typescript/cli/src/commands/core.ts +++ b/typescript/cli/src/commands/core.ts @@ -35,7 +35,6 @@ import { fromAddressCommandOption, inputFileCommandOption, outputFileCommandOption, - skipConfirmationOption, } from './options.js'; /** @@ -117,7 +116,6 @@ export const deploy: CommandModuleWithWriteContext<{ ), 'dry-run': dryRunCommandOption, 'from-address': fromAddressCommandOption, - 'skip-confirmation': skipConfirmationOption, }, handler: async ({ context, chain, config: configFilePath, dryRun }) => { logCommandHeader(`Hyperlane Core deployment${dryRun ? ' dry-run' : ''}`); diff --git a/typescript/cli/src/commands/send.ts b/typescript/cli/src/commands/send.ts index 1167b3b559..cddd85810a 100644 --- a/typescript/cli/src/commands/send.ts +++ b/typescript/cli/src/commands/send.ts @@ -17,17 +17,13 @@ export const sendCommand: CommandModule = { }; /** - * Message command + * Base options for all message/warp send/status commands */ export const messageOptions: { [k: string]: Options } = { origin: { type: 'string', description: 'Origin chain to send message from', }, - destination: { - type: 'string', - description: 'Destination chain to send message to', - }, timeout: { type: 'number', description: 'Timeout in seconds', @@ -45,6 +41,21 @@ export const messageOptions: { [k: string]: Options } = { }, }; +/** + * Options for message/warp send command with destination chain specified + */ +export const messageSendOptions: { [k: string]: Options } = { + ...messageOptions, + destination: { + type: 'string', + description: 'Destination chain to send message to', + }, + 'round-trip': { + type: 'boolean', + description: 'Send test transfers to all chains in WarpCoreConfig', + }, +}; + export interface MessageOptionsArgTypes { origin?: string; destination?: string; @@ -59,7 +70,7 @@ const messageCommand: CommandModuleWithWriteContext< command: 'message', describe: 'Send a test message to a remote chain', builder: { - ...messageOptions, + ...messageSendOptions, body: { type: 'string', description: 'Optional Message body', diff --git a/typescript/cli/src/commands/status.ts b/typescript/cli/src/commands/status.ts index 2b4c204880..0875b64675 100644 --- a/typescript/cli/src/commands/status.ts +++ b/typescript/cli/src/commands/status.ts @@ -19,12 +19,11 @@ export const statusCommand: CommandModuleWithWriteContext< description: 'Dispatch transaction hash', }, }, - handler: async ({ context, origin, destination, id, relay, dispatchTx }) => { + handler: async ({ context, origin, id, relay, dispatchTx }) => { await checkMessageStatus({ context, dispatchTx, messageId: id, - destination, origin, selfRelay: relay, }); diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index 3cd99fe6a0..853df8aa19 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -1,7 +1,8 @@ import { stringify as yamlStringify } from 'yaml'; import { CommandModule } from 'yargs'; -import { ChainSubmissionStrategySchema } from '@hyperlane-xyz/sdk'; +import { ChainName, ChainSubmissionStrategySchema } from '@hyperlane-xyz/sdk'; +import { assert, objFilter } from '@hyperlane-xyz/utils'; import { runWarpRouteCheck } from '../check/warp.js'; import { @@ -14,9 +15,10 @@ import { } from '../context/types.js'; import { evaluateIfDryRunFailure } from '../deploy/dry-run.js'; import { runWarpRouteApply, runWarpRouteDeploy } from '../deploy/warp.js'; -import { log, logCommandHeader, logGreen } from '../logger.js'; +import { log, logBlue, logCommandHeader, logGreen } from '../logger.js'; import { runWarpRouteRead } from '../read/warp.js'; import { sendTestTransfer } from '../send/transfer.js'; +import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson, readYamlOrJson, @@ -40,7 +42,7 @@ import { warpCoreConfigCommandOption, warpDeploymentConfigCommandOption, } from './options.js'; -import { MessageOptionsArgTypes, messageOptions } from './send.js'; +import { MessageOptionsArgTypes, messageSendOptions } from './send.js'; /** * Parent command @@ -245,7 +247,7 @@ const send: CommandModuleWithWriteContext< command: 'send', describe: 'Send a test token transfer on a warp route', builder: { - ...messageOptions, + ...messageSendOptions, symbol: { ...symbolCommandOption, demandOption: false, @@ -275,6 +277,7 @@ const send: CommandModuleWithWriteContext< warp, amount, recipient, + roundTrip, }) => { const warpCoreConfig = await getWarpCoreConfigOrExit({ symbol, @@ -282,17 +285,52 @@ const send: CommandModuleWithWriteContext< context, }); + let chains: ChainName[] = warpCoreConfig.tokens.map((t) => t.chainName); + if (roundTrip) { + // Appends the reverse of the array, excluding the 1st (e.g. [1,2,3] becomes [1,2,3,2,1]) + const reversed = [...chains].reverse().slice(1, chains.length + 1); // We make a copy because .reverse() is mutating + chains.push(...reversed); + } else { + // Assume we want to use use `--origin` and `--destination` params, prompt as needed. + const chainMetadata = objFilter( + context.chainMetadata, + (key, _metadata): _metadata is any => chains.includes(key), + ); + + if (!origin) + origin = await runSingleChainSelectionStep( + chainMetadata, + 'Select the origin chain:', + ); + + if (!destination) + destination = await runSingleChainSelectionStep( + chainMetadata, + 'Select the destination chain:', + ); + + chains = [origin, destination].filter((c) => chains.includes(c)); + + assert( + chains.length === 2, + `Origin (${origin}) or destination (${destination}) are not part of the warp route.`, + ); + } + + logBlue(`🚀 Sending a message for chains: ${chains.join(' ➡️ ')}`); await sendTestTransfer({ context, warpCoreConfig, - origin, - destination, + chains, amount, recipient, timeoutSec: timeout, skipWaitForDelivery: quick, selfRelay: relay, }); + logGreen( + `✅ Successfully sent messages for chains: ${chains.join(' ➡️ ')}`, + ); process.exit(0); }, }; diff --git a/typescript/cli/src/config/chain.ts b/typescript/cli/src/config/chain.ts index 65536c15d7..07064b5e87 100644 --- a/typescript/cli/src/config/chain.ts +++ b/typescript/cli/src/config/chain.ts @@ -70,14 +70,6 @@ export async function createChainConfig({ default: name[0].toUpperCase() + name.slice(1), }); - const technicalStack = (await select({ - choices: Object.entries(ChainTechnicalStack).map(([_, value]) => ({ - value, - })), - message: 'Select the correct chain technical stack', - pageSize: 10, - })) as ChainTechnicalStack; - const chainId = parseInt( await detectAndConfirmOrPrompt( async () => { @@ -96,6 +88,30 @@ export async function createChainConfig({ 'Is this chain a testnet (a chain used for testing & development)?', }); + const technicalStack = (await select({ + choices: Object.entries(ChainTechnicalStack).map(([_, value]) => ({ + value, + })), + message: 'Select the chain technical stack', + pageSize: 10, + })) as ChainTechnicalStack; + + const arbitrumNitroMetadata: Pick = {}; + if (technicalStack === ChainTechnicalStack.ArbitrumNitro) { + const indexFrom = await detectAndConfirmOrPrompt( + async () => { + return (await provider.getBlockNumber()).toString(); + }, + `Enter`, + 'starting block number for indexing', + 'JSON RPC provider', + ); + + arbitrumNitroMetadata.index = { + from: parseInt(indexFrom), + }; + } + const metadata: ChainMetadata = { name, displayName, @@ -105,6 +121,7 @@ export async function createChainConfig({ technicalStack, rpcUrls: [{ http: rpcUrl }], isTestnet, + ...arbitrumNitroMetadata, }; await addBlockExplorerConfig(metadata); diff --git a/typescript/cli/src/config/hooks.ts b/typescript/cli/src/config/hooks.ts index 5ad005dc24..1ca07a9a70 100644 --- a/typescript/cli/src/config/hooks.ts +++ b/typescript/cli/src/config/hooks.ts @@ -270,7 +270,7 @@ async function getOwnerAndBeneficiary( async function selectIgpChains(context: CommandContext) { const localChain = await runSingleChainSelectionStep( context.chainMetadata, - 'Select local chain for IGP hook', + 'Select local chain for IGP hook:', ); const isTestnet = context.chainMetadata[localChain].isTestnet; const remoteChains = await runMultiChainSelectionStep({ diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index f57c7d3378..cb2abaf437 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -10,17 +10,15 @@ import { import { ProtocolType, assert, - errorToString, isAddress, isPrivateKeyEvm, } from '@hyperlane-xyz/utils'; import { CommandContext } from '../context/types.js'; -import { errorRed, log, logBlue, logGreen, logRed } from '../logger.js'; +import { errorRed, log, logBlue, logGreen } from '../logger.js'; import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson, - isFile, readYamlOrJson, writeYamlOrJson, } from '../utils/files.js'; @@ -33,38 +31,9 @@ export async function readChainSubmissionStrategyConfig( filePath: string, ): Promise { log(`Reading submission strategy in ${filePath}`); - try { - const strategyConfig = readYamlOrJson(filePath); - - const parseResult = ChainSubmissionStrategySchema.parse(strategyConfig); - - return parseResult; - } catch (error) { - logRed(`⛔️ Error reading strategy config:`, errorToString(error)); - throw error; // Re-throw to let caller handle the error - } -} - -/** - * Safely reads chain submission strategy config, returns empty object if any errors occur - */ -export async function safeReadChainSubmissionStrategyConfig( - filePath: string, -): Promise { - try { - const trimmedFilePath = filePath.trim(); - if (!isFile(trimmedFilePath)) { - logBlue(`File ${trimmedFilePath} does not exist, returning empty config`); - return {}; - } - return await readChainSubmissionStrategyConfig(trimmedFilePath); - } catch (error) { - logRed( - `Failed to read strategy config, defaulting to empty config:`, - errorToString(error), - ); - return {}; - } + const strategyConfig = readYamlOrJson(filePath); + const parseResult = ChainSubmissionStrategySchema.parse(strategyConfig); + return parseResult; } export async function createStrategyConfig({ diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 51af7f8829..f7c7733a86 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -16,9 +16,8 @@ import { } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; -import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; import { isSignCommand } from '../commands/signCommands.js'; -import { safeReadChainSubmissionStrategyConfig } from '../config/strategy.js'; +import { readChainSubmissionStrategyConfig } from '../config/strategy.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; @@ -62,9 +61,9 @@ export async function signerMiddleware(argv: Record) { if (!requiresKey) return argv; - const strategyConfig = await safeReadChainSubmissionStrategyConfig( - strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, - ); + const strategyConfig = strategyPath + ? await readChainSubmissionStrategyConfig(strategyPath) + : {}; /** * Intercepts Hyperlane command to determine chains. @@ -106,6 +105,7 @@ export async function getContext({ requiresKey, skipConfirmation, disableProxy = false, + strategyPath, }: ContextSettings): Promise { const registry = getRegistry(registryUri, registryOverrideUri, !disableProxy); @@ -127,6 +127,7 @@ export async function getContext({ key, skipConfirmation: !!skipConfirmation, signerAddress, + strategyPath, } as CommandContext; } diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts index 31c8dbe052..d6f83572fb 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts @@ -27,7 +27,7 @@ export class MultiProtocolSignerFactory { switch (protocol) { case ProtocolType.Ethereum: - if (technicalStack === ChainTechnicalStack.ZKSync) + if (technicalStack === ChainTechnicalStack.ZkSync) return new ZKSyncSignerStrategy(strategyConfig); return new EthereumSignerStrategy(strategyConfig); default: diff --git a/typescript/cli/src/deploy/agent.ts b/typescript/cli/src/deploy/agent.ts index a36955a3f3..034a2e5136 100644 --- a/typescript/cli/src/deploy/agent.ts +++ b/typescript/cli/src/deploy/agent.ts @@ -25,7 +25,7 @@ export async function runKurtosisAgentDeploy({ if (!originChain) { originChain = await runSingleChainSelectionStep( context.chainMetadata, - 'Select the origin chain', + 'Select the origin chain:', ); } if (!relayChains) { diff --git a/typescript/cli/src/deploy/utils.ts b/typescript/cli/src/deploy/utils.ts index e8c2750a49..0e836eea26 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -45,7 +45,7 @@ export async function runPreflightChecksForChains({ chainsToGasCheck?: ChainName[]; }) { log('Running pre-flight checks for chains...'); - const { multiProvider } = context; + const { multiProvider, skipConfirmation } = context; if (!chains?.length) throw new Error('Empty chain selection'); for (const chain of chains) { @@ -63,6 +63,7 @@ export async function runPreflightChecksForChains({ multiProvider, chainsToGasCheck ?? chains, minGas, + skipConfirmation, ); } @@ -209,7 +210,7 @@ export function isIsmCompatible({ chainTechnicalStack: ChainTechnicalStack | undefined; ismType: IsmType; }): boolean { - // Static deployment is not available on certain chains (e.g., ZKSync) for aggregation ISMs. + // Static deployment is not available on certain chains (e.g., ZkSync) for aggregation ISMs. if (!isIsmStatic[ismType]) return true; return isStaticDeploymentSupported(chainTechnicalStack); } diff --git a/typescript/cli/src/send/message.ts b/typescript/cli/src/send/message.ts index f7d5eb4e15..e43d08fe2c 100644 --- a/typescript/cli/src/send/message.ts +++ b/typescript/cli/src/send/message.ts @@ -33,14 +33,14 @@ export async function sendTestMessage({ if (!origin) { origin = await runSingleChainSelectionStep( chainMetadata, - 'Select the origin chain', + 'Select the origin chain:', ); } if (!destination) { destination = await runSingleChainSelectionStep( chainMetadata, - 'Select the destination chain', + 'Select the destination chain:', ); } diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index 2929b09c6e..8aa4cca59b 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -18,7 +18,6 @@ import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { log, logBlue, logGreen, logRed } from '../logger.js'; -import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson } from '../utils/files.js'; import { stubMerkleTreeConfig } from '../utils/relay.js'; import { runTokenSelectionStep } from '../utils/tokens.js'; @@ -30,8 +29,7 @@ export const WarpSendLogs = { export async function sendTestTransfer({ context, warpCoreConfig, - origin, - destination, + chains, amount, recipient, timeoutSec, @@ -40,51 +38,41 @@ export async function sendTestTransfer({ }: { context: WriteCommandContext; warpCoreConfig: WarpCoreConfig; - origin?: ChainName; // resolved in signerMiddleware - destination?: ChainName; // resolved in signerMiddleware + chains: ChainName[]; amount: string; recipient?: string; timeoutSec: number; skipWaitForDelivery: boolean; selfRelay?: boolean; }) { - const { chainMetadata } = context; - - if (!origin) { - origin = await runSingleChainSelectionStep( - chainMetadata, - 'Select the origin chain', - ); - } - - if (!destination) { - destination = await runSingleChainSelectionStep( - chainMetadata, - 'Select the destination chain', - ); - } - await runPreflightChecksForChains({ context, - chains: [origin, destination], - chainsToGasCheck: [origin], + chains, minGas: MINIMUM_TEST_SEND_GAS, }); - await timeout( - executeDelivery({ - context, - origin, - destination, - warpCoreConfig, - amount, - recipient, - skipWaitForDelivery, - selfRelay, - }), - timeoutSec * 1000, - 'Timed out waiting for messages to be delivered', - ); + for (let i = 0; i < chains.length; i++) { + const origin = chains[i]; + const destination = chains[i + 1]; + + if (destination) { + logBlue(`Sending a message from ${origin} to ${destination}`); + await timeout( + executeDelivery({ + context, + origin, + destination, + warpCoreConfig, + amount, + recipient, + skipWaitForDelivery, + selfRelay, + }), + timeoutSec * 1000, + 'Timed out waiting for messages to be delivered', + ); + } + } } async function executeDelivery({ @@ -199,5 +187,5 @@ async function executeDelivery({ // Max wait 10 minutes await core.waitForMessageProcessed(transferTxReceipt, 10000, 60); - logGreen(`Transfer sent to destination chain!`); + logGreen(`Transfer sent to ${destination} chain!`); } diff --git a/typescript/cli/src/status/message.ts b/typescript/cli/src/status/message.ts index 5e22aec7b0..a63caa4e3e 100644 --- a/typescript/cli/src/status/message.ts +++ b/typescript/cli/src/status/message.ts @@ -2,17 +2,15 @@ import type { TransactionReceipt } from '@ethersproject/providers'; import { input } from '@inquirer/prompts'; import { ChainName, HyperlaneCore, HyperlaneRelayer } from '@hyperlane-xyz/sdk'; -import { assert, parseWarpRouteMessage } from '@hyperlane-xyz/utils'; import { WriteCommandContext } from '../context/types.js'; -import { log, logBlue, logGray, logGreen, logRed } from '../logger.js'; +import { log, logBlue, logGreen, logRed } from '../logger.js'; import { runSingleChainSelectionStep } from '../utils/chains.js'; import { stubMerkleTreeConfig } from '../utils/relay.js'; export async function checkMessageStatus({ context, messageId, - destination, origin, selfRelay, dispatchTx, @@ -20,26 +18,19 @@ export async function checkMessageStatus({ context: WriteCommandContext; dispatchTx?: string; messageId?: string; - destination?: ChainName; origin?: ChainName; selfRelay?: boolean; }) { if (!origin) { origin = await runSingleChainSelectionStep( context.chainMetadata, - 'Select the origin chain', + 'Select the origin chain:', ); } - if (!messageId) { - messageId = await input({ - message: 'Please specify the message id', - }); - } - - const chainAddresses = await context.registry.getAddresses(); + const coreAddresses = await context.registry.getAddresses(); const core = HyperlaneCore.fromAddressesMap( - chainAddresses, + coreAddresses, context.multiProvider, ); @@ -50,6 +41,9 @@ export async function checkMessageStatus({ .getProvider(origin) .getTransactionReceipt(dispatchTx); } else { + messageId ??= await input({ + message: 'Please specify the message id', + }); try { dispatchedReceipt = await core.getDispatchTx(origin, messageId); } catch { @@ -64,48 +58,29 @@ export async function checkMessageStatus({ } } - const messages = core.getDispatchedMessages(dispatchedReceipt!); - const match = messages.find((m) => m.id === messageId); - assert(match, `Message ${messageId} not found in dispatch tx ${dispatchTx}`); - const message = match; - try { - const { amount, recipient } = parseWarpRouteMessage(message.parsed.body); - logGray(`Warping ${amount} to ${recipient}`); - // eslint-disable-next-line no-empty - } catch {} - - let deliveredTx: TransactionReceipt; - - log(`Checking status of message ${messageId} on ${destination}`); - const delivered = await core.isDelivered(message); - if (delivered) { - logGreen(`Message ${messageId} was delivered`); - deliveredTx = await core.getProcessedReceipt(message); - } else { - logBlue(`Message ${messageId} was not yet delivered`); + const messages = core.getDispatchedMessages(dispatchedReceipt); - if (!selfRelay) { - return; + const undelivered = []; + for (const message of messages) { + log( + `Checking status of message ${message.id} on ${message.parsed.destinationChain}`, + ); + const delivered = await core.isDelivered(message); + if (delivered) { + logGreen(`Message ${message.id} was delivered`); + } else { + logBlue(`Message ${message.id} was not yet delivered`); + undelivered.push(message); } + } + if (selfRelay) { const relayer = new HyperlaneRelayer({ core }); - - const hookAddress = await core.getSenderHookAddress(message); - const merkleAddress = chainAddresses[origin].merkleTreeHook; - stubMerkleTreeConfig(relayer, origin, hookAddress, merkleAddress); - - deliveredTx = await relayer.relayMessage( - dispatchedReceipt, - undefined, - message, - ); + for (const message of undelivered) { + const hookAddress = await core.getSenderHookAddress(message); + const merkleAddress = coreAddresses[origin].merkleTreeHook; + stubMerkleTreeConfig(relayer, origin, hookAddress, merkleAddress); + } + await relayer.relayAll(dispatchedReceipt, undelivered); } - - logGreen( - `Message ${messageId} delivered in ${ - context.multiProvider.tryGetExplorerTxUrl(message.parsed.destination, { - hash: deliveredTx.transactionHash, - }) ?? deliveredTx.transactionHash - }`, - ); } diff --git a/typescript/cli/src/tests/commands/core.ts b/typescript/cli/src/tests/commands/core.ts index e47db15e20..d74b310d84 100644 --- a/typescript/cli/src/tests/commands/core.ts +++ b/typescript/cli/src/tests/commands/core.ts @@ -1,11 +1,45 @@ -import { $ } from 'zx'; +import { $, ProcessPromise } from 'zx'; import { DerivedCoreConfig } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; import { readYamlOrJson } from '../../utils/files.js'; import { ANVIL_KEY, REGISTRY_PATH } from './helpers.js'; +/** + * Deploys the Hyperlane core contracts to the specified chain using the provided config. + */ +export function hyperlaneCoreDeployRaw( + coreInputPath: string, + privateKey?: string, + skipConfirmationPrompts?: boolean, + hypKey?: string, +): ProcessPromise { + if (hypKey) { + return $`HYP_KEY=${hypKey} yarn workspace @hyperlane-xyz/cli run hyperlane core deploy \ + --registry ${REGISTRY_PATH} \ + --config ${coreInputPath} \ + --verbosity debug \ + ${skipConfirmationPrompts ? '--yes' : ''}`; + } + + if (privateKey) { + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core deploy \ + --registry ${REGISTRY_PATH} \ + --config ${coreInputPath} \ + --key ${privateKey} \ + --verbosity debug \ + ${skipConfirmationPrompts ? '--yes' : ''}`; + } + + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core deploy \ + --registry ${REGISTRY_PATH} \ + --config ${coreInputPath} \ + --verbosity debug \ + ${skipConfirmationPrompts ? '--yes' : ''}`; +} + /** * Deploys the Hyperlane core contracts to the specified chain using the provided config. */ @@ -36,6 +70,68 @@ export async function hyperlaneCoreRead(chain: string, coreOutputPath: string) { --yes`; } +/** + * Verifies that a Hyperlane core deployment matches the provided config on the specified chain. + */ +export function hyperlaneCoreCheck( + chain: string, + coreOutputPath: string, + mailbox?: Address, +): ProcessPromise { + if (mailbox) { + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core check \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --chain ${chain} \ + --mailbox ${mailbox} \ + --verbosity debug \ + --yes`; + } + + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core check \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --chain ${chain} \ + --verbosity debug \ + --yes`; +} + +/** + * Creates a Hyperlane core deployment config + */ +export function hyperlaneCoreInit( + coreOutputPath: string, + privateKey?: string, + hyp_key?: string, +): ProcessPromise { + if (hyp_key) { + return $`${ + hyp_key ? `HYP_KEY=${hyp_key}` : '' + } yarn workspace @hyperlane-xyz/cli run hyperlane core init \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --verbosity debug \ + --yes`; + } + + if (privateKey) { + return $`${ + hyp_key ? 'HYP_KEY=${hyp_key}' : '' + } yarn workspace @hyperlane-xyz/cli run hyperlane core init \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --verbosity debug \ + --key ${privateKey} \ + --yes`; + } + + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core init \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --verbosity debug \ + --yes`; +} + /** * Updates a Hyperlane core deployment on the specified chain using the provided config. */ diff --git a/typescript/cli/src/tests/commands/helpers.ts b/typescript/cli/src/tests/commands/helpers.ts index 7d21425886..abba68aa2d 100644 --- a/typescript/cli/src/tests/commands/helpers.ts +++ b/typescript/cli/src/tests/commands/helpers.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers'; -import { $ } from 'zx'; +import { $, ProcessOutput, ProcessPromise } from 'zx'; import { ERC20Test__factory, ERC4626Test__factory } from '@hyperlane-xyz/core'; import { ChainAddresses } from '@hyperlane-xyz/registry'; @@ -8,7 +8,7 @@ import { WarpCoreConfig, WarpCoreConfigSchema, } from '@hyperlane-xyz/sdk'; -import { Address } from '@hyperlane-xyz/utils'; +import { Address, sleep } from '@hyperlane-xyz/utils'; import { getContext } from '../../context/context.js'; import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js'; @@ -36,6 +36,7 @@ export const CHAIN_NAME_3 = 'anvil3'; export const EXAMPLES_PATH = './examples'; export const CORE_CONFIG_PATH = `${EXAMPLES_PATH}/core-config.yaml`; +export const CORE_CONFIG_PATH_2 = `${TEMP_PATH}/${CHAIN_NAME_2}/core-config.yaml`; export const CORE_READ_CONFIG_PATH_2 = `${TEMP_PATH}/${CHAIN_NAME_2}/core-config-read.yaml`; export const CHAIN_2_METADATA_PATH = `${REGISTRY_PATH}/chains/${CHAIN_NAME_2}/metadata.yaml`; export const CHAIN_3_METADATA_PATH = `${REGISTRY_PATH}/chains/${CHAIN_NAME_3}/metadata.yaml`; @@ -46,6 +47,105 @@ export const WARP_CORE_CONFIG_PATH_2 = `${REGISTRY_PATH}/deployments/warp_routes export const DEFAULT_E2E_TEST_TIMEOUT = 100_000; // Long timeout since these tests can take a while +export enum KeyBoardKeys { + ARROW_DOWN = '\x1b[B', + ARROW_UP = '\x1b[A', + ENTER = '\n', + TAB = '\t', +} + +export async function asyncStreamInputWrite( + stream: NodeJS.WritableStream, + data: string | Buffer, +): Promise { + stream.write(data); + // Adding a slight delay to allow the buffer to update the output + await sleep(500); +} + +export type TestPromptAction = { + check: (currentOutput: string) => boolean; + input: string; +}; + +/** + * Takes a {@link ProcessPromise} and a list of inputs that will be supplied + * in the provided order when the check in the {@link TestPromptAction} matches the output + * of the {@link ProcessPromise}. + */ +export async function handlePrompts( + processPromise: Readonly, + actions: TestPromptAction[], +): Promise { + let expectedStep = 0; + for await (const out of processPromise.stdout) { + const currentLine: string = out.toString(); + + const currentAction = actions[expectedStep]; + if (currentAction && currentAction.check(currentLine)) { + // Select mainnet chains + await asyncStreamInputWrite(processPromise.stdin, currentAction.input); + expectedStep++; + } + } + + return processPromise; +} + +export const SELECT_ANVIL_2_FROM_MULTICHAIN_PICKER = `${KeyBoardKeys.ARROW_DOWN.repeat( + 3, +)}${KeyBoardKeys.TAB}`; + +export const SELECT_ANVIL_3_AFTER_ANVIL_2_FROM_MULTICHAIN_PICKER = `${KeyBoardKeys.ARROW_DOWN.repeat( + 2, +)}${KeyBoardKeys.TAB}`; + +export const SELECT_MAINNET_CHAIN_TYPE_STEP: TestPromptAction = { + check: (currentOutput: string) => + currentOutput.includes('Select network type'), + // Select mainnet chains + input: KeyBoardKeys.ENTER, +}; + +export const SELECT_ANVIL_2_AND_ANVIL_3_STEPS: ReadonlyArray = + [ + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + input: `${SELECT_ANVIL_2_FROM_MULTICHAIN_PICKER}`, + }, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + input: `${SELECT_ANVIL_3_AFTER_ANVIL_2_FROM_MULTICHAIN_PICKER}${KeyBoardKeys.ENTER}`, + }, + ]; + +export const CONFIRM_DETECTED_OWNER_STEP: Readonly = { + check: (currentOutput: string) => + currentOutput.includes('Detected owner address as'), + input: KeyBoardKeys.ENTER, +}; + +export const SETUP_CHAIN_SIGNERS_MANUALLY_STEPS: ReadonlyArray = + [ + { + check: (currentOutput) => + currentOutput.includes('Please enter the private key for chain'), + input: `${ANVIL_KEY}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Please enter the private key for chain'), + input: `${ANVIL_KEY}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Please enter the private key for chain'), + input: `${ANVIL_KEY}${KeyBoardKeys.ENTER}`, + }, + ]; + /** * Retrieves the deployed Warp address from the Warp core config. */ @@ -199,7 +299,11 @@ export async function getDomainId( return String(chainMetadata?.domainId); } -export async function deployToken(privateKey: string, chain: string) { +export async function deployToken( + privateKey: string, + chain: string, + decimals = 18, +) { const { multiProvider } = await getContext({ registryUri: REGISTRY_PATH, registryOverrideUri: '', @@ -211,7 +315,7 @@ export async function deployToken(privateKey: string, chain: string) { const token = await new ERC20Test__factory( multiProvider.getSigner(chain), - ).deploy('token', 'token', '100000000000000000000', 18); + ).deploy('token', 'token', '100000000000000000000', decimals); await token.deployed(); return token; diff --git a/typescript/cli/src/tests/commands/warp.ts b/typescript/cli/src/tests/commands/warp.ts index 60c5a5d9fd..28de3a3070 100644 --- a/typescript/cli/src/tests/commands/warp.ts +++ b/typescript/cli/src/tests/commands/warp.ts @@ -1,4 +1,4 @@ -import { $ } from 'zx'; +import { $, ProcessPromise } from 'zx'; import { WarpRouteDeployConfig } from '@hyperlane-xyz/sdk'; @@ -8,6 +8,20 @@ import { ANVIL_KEY, REGISTRY_PATH, getDeployedWarpAddress } from './helpers.js'; $.verbose = true; +/** + * Deploys the Warp route to the specified chain using the provided config. + */ +export function hyperlaneWarpInit(warpCorePath: string): ProcessPromise { + // --overrides is " " to allow local testing to work + return $`yarn workspace @hyperlane-xyz/cli run hyperlane warp init \ + --registry ${REGISTRY_PATH} \ + --overrides " " \ + --out ${warpCorePath} \ + --key ${ANVIL_KEY} \ + --verbosity debug \ + --yes`; +} + /** * Deploys the Warp route to the specified chain using the provided config. */ @@ -16,6 +30,7 @@ export async function hyperlaneWarpDeploy( key?: string, registryPath?: string, ) { + // --overrides is " " to allow local testing to work return $`yarn workspace @hyperlane-xyz/cli run hyperlane warp deploy \ --registry ${registryPath ?? REGISTRY_PATH} \ --overrides " " \ diff --git a/typescript/cli/src/tests/core-deploy.e2e-test.ts b/typescript/cli/src/tests/core-deploy.e2e-test.ts deleted file mode 100644 index 192f0121b4..0000000000 --- a/typescript/cli/src/tests/core-deploy.e2e-test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { expect } from 'chai'; -import { Signer, Wallet, ethers } from 'ethers'; - -import { - ChainMetadata, - CoreConfig, - ProtocolFeeHookConfig, - randomAddress, -} from '@hyperlane-xyz/sdk'; -import { Address } from '@hyperlane-xyz/utils'; - -import { readYamlOrJson, writeYamlOrJson } from '../utils/files.js'; - -import { hyperlaneCoreDeploy, readCoreConfig } from './commands/core.js'; -import { - ANVIL_KEY, - CHAIN_2_METADATA_PATH, - CHAIN_NAME_2, - CORE_CONFIG_PATH, - CORE_READ_CONFIG_PATH_2, - DEFAULT_E2E_TEST_TIMEOUT, -} from './commands/helpers.js'; - -describe('hyperlane core deploy e2e tests', async function () { - this.timeout(DEFAULT_E2E_TEST_TIMEOUT); - - let signer: Signer; - let initialOwnerAddress: Address; - - before(async () => { - const chainMetadata: ChainMetadata = readYamlOrJson(CHAIN_2_METADATA_PATH); - - const provider = new ethers.providers.JsonRpcProvider( - chainMetadata.rpcUrls[0].http, - ); - - const wallet = new Wallet(ANVIL_KEY); - signer = wallet.connect(provider); - - initialOwnerAddress = await signer.getAddress(); - }); - - it('should create a core deployment with the signer as the mailbox owner', async () => { - await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_CONFIG_PATH); - - const coreConfig: CoreConfig = await readCoreConfig( - CHAIN_NAME_2, - CORE_READ_CONFIG_PATH_2, - ); - - expect(coreConfig.owner).to.equal(initialOwnerAddress); - expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); - // Assuming that the ProtocolFeeHook is used for deployment - expect((coreConfig.requiredHook as ProtocolFeeHookConfig).owner).to.equal( - initialOwnerAddress, - ); - }); - - it('should create a core deployment with the mailbox owner set to the address in the config', async () => { - const coreConfig: CoreConfig = await readYamlOrJson(CORE_CONFIG_PATH); - - const newOwner = randomAddress().toLowerCase(); - - coreConfig.owner = newOwner; - writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); - - // Deploy the core contracts with the updated mailbox owner - await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); - - // Verify that the owner has been set correctly without modifying any other owner values - const updatedConfig: CoreConfig = await readCoreConfig( - CHAIN_NAME_2, - CORE_READ_CONFIG_PATH_2, - ); - - expect(updatedConfig.owner.toLowerCase()).to.equal(newOwner); - expect(updatedConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); - // Assuming that the ProtocolFeeHook is used for deployment - expect( - (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, - ).to.equal(initialOwnerAddress); - }); - - it('should create a core deployment with ProxyAdmin owner of the mailbox set to the address in the config', async () => { - const coreConfig: CoreConfig = await readYamlOrJson(CORE_CONFIG_PATH); - - const newOwner = randomAddress().toLowerCase(); - - coreConfig.proxyAdmin = { owner: newOwner }; - writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); - - // Deploy the core contracts with the updated mailbox owner - await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); - - // Verify that the owner has been set correctly without modifying any other owner values - const updatedConfig: CoreConfig = await readCoreConfig( - CHAIN_NAME_2, - CORE_READ_CONFIG_PATH_2, - ); - - expect(updatedConfig.owner).to.equal(initialOwnerAddress); - expect(updatedConfig.proxyAdmin?.owner.toLowerCase()).to.equal(newOwner); - // Assuming that the ProtocolFeeHook is used for deployment - expect( - (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, - ).to.equal(initialOwnerAddress); - }); -}); diff --git a/typescript/cli/src/tests/core-apply.e2e-test.ts b/typescript/cli/src/tests/core/core-apply.e2e-test.ts similarity index 98% rename from typescript/cli/src/tests/core-apply.e2e-test.ts rename to typescript/cli/src/tests/core/core-apply.e2e-test.ts index 27667fd719..c062d5b43b 100644 --- a/typescript/cli/src/tests/core-apply.e2e-test.ts +++ b/typescript/cli/src/tests/core/core-apply.e2e-test.ts @@ -11,13 +11,12 @@ import { } from '@hyperlane-xyz/sdk'; import { Address, Domain, addressToBytes32 } from '@hyperlane-xyz/utils'; -import { readYamlOrJson, writeYamlOrJson } from '../utils/files.js'; - +import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js'; import { hyperlaneCoreApply, hyperlaneCoreDeploy, readCoreConfig, -} from './commands/core.js'; +} from '../commands/core.js'; import { ANVIL_KEY, CHAIN_2_METADATA_PATH, @@ -28,7 +27,7 @@ import { CORE_READ_CONFIG_PATH_2, DEFAULT_E2E_TEST_TIMEOUT, TEMP_PATH, -} from './commands/helpers.js'; +} from '../commands/helpers.js'; const CORE_READ_CHAIN_2_CONFIG_PATH = `${TEMP_PATH}/${CHAIN_NAME_2}/core-config-read.yaml`; const CORE_READ_CHAIN_3_CONFIG_PATH = `${TEMP_PATH}/${CHAIN_NAME_3}/core-config-read.yaml`; diff --git a/typescript/cli/src/tests/core/core-check.e2e-test.ts b/typescript/cli/src/tests/core/core-check.e2e-test.ts new file mode 100644 index 0000000000..f1dd609914 --- /dev/null +++ b/typescript/cli/src/tests/core/core-check.e2e-test.ts @@ -0,0 +1,93 @@ +import { expect } from 'chai'; +import { $ } from 'zx'; + +import { randomAddress } from '@hyperlane-xyz/sdk'; + +import { writeYamlOrJson } from '../../utils/files.js'; +import { + hyperlaneCoreCheck, + hyperlaneCoreDeploy, + readCoreConfig, +} from '../commands/core.js'; +import { + ANVIL_KEY, + CHAIN_NAME_2, + CORE_CONFIG_PATH, + CORE_READ_CONFIG_PATH_2, + DEFAULT_E2E_TEST_TIMEOUT, + REGISTRY_PATH, + deployOrUseExistingCore, +} from '../commands/helpers.js'; + +describe('hyperlane core check e2e tests', async function () { + this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT); + + before(async () => { + await deployOrUseExistingCore(CHAIN_NAME_2, CORE_CONFIG_PATH, ANVIL_KEY); + }); + + it('should throw an error if the --chain param is not provided', async () => { + const wrongCommand = + $`yarn workspace @hyperlane-xyz/cli run hyperlane core check \ + --registry ${REGISTRY_PATH} \ + --config ${CORE_CONFIG_PATH} \ + --verbosity debug \ + --yes`.nothrow(); + + const output = await wrongCommand; + + expect(output.exitCode).to.equal(1); + expect(output.text().includes('Missing required argument: chain')).to.be + .true; + }); + + it('should successfully run the core check command', async () => { + await readCoreConfig(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); + + const output = await hyperlaneCoreCheck( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + + expect(output.exitCode).to.equal(0); + expect(output.text().includes('No violations found')).to.be.true; + }); + + it('should find differences between the local and onchain config', async () => { + const coreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + coreConfig.owner = randomAddress(); + writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); + const expectedDiffText = `EXPECTED: "${coreConfig.owner}"\n`; + const expectedActualText = `ACTUAL: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"\n`; + + const output = await hyperlaneCoreCheck( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ).nothrow(); + + expect(output.exitCode).to.equal(1); + expect(output.text().includes(expectedDiffText)).to.be.true; + expect(output.text().includes(expectedActualText)).to.be.true; + }); + + it('should successfully check the config when provided with a custom mailbox', async () => { + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_CONFIG_PATH); + const coreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + expect(coreConfig.interchainAccountRouter?.mailbox).not.to.be.undefined; + + const output = await hyperlaneCoreCheck( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + coreConfig.interchainAccountRouter!.mailbox, + ); + + expect(output.exitCode).to.equal(0); + expect(output.text().includes('No violations found')).to.be.true; + }); +}); diff --git a/typescript/cli/src/tests/core/core-deploy.e2e-test.ts b/typescript/cli/src/tests/core/core-deploy.e2e-test.ts new file mode 100644 index 0000000000..f7544fc8f7 --- /dev/null +++ b/typescript/cli/src/tests/core/core-deploy.e2e-test.ts @@ -0,0 +1,286 @@ +import { expect } from 'chai'; +import { Signer, Wallet, ethers } from 'ethers'; + +import { + ChainMetadata, + CoreConfig, + HookType, + ProtocolFeeHookConfig, + randomAddress, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js'; +import { + hyperlaneCoreDeploy, + hyperlaneCoreDeployRaw, + readCoreConfig, +} from '../commands/core.js'; +import { + ANVIL_KEY, + CHAIN_2_METADATA_PATH, + CHAIN_NAME_2, + CORE_CONFIG_PATH, + CORE_READ_CONFIG_PATH_2, + DEFAULT_E2E_TEST_TIMEOUT, + KeyBoardKeys, + SELECT_MAINNET_CHAIN_TYPE_STEP, + SETUP_CHAIN_SIGNERS_MANUALLY_STEPS, + TestPromptAction, + handlePrompts, +} from '../commands/helpers.js'; + +describe('hyperlane core deploy e2e tests', async function () { + this.timeout(DEFAULT_E2E_TEST_TIMEOUT); + + let signer: Signer; + let initialOwnerAddress: Address; + + before(async () => { + const chainMetadata: ChainMetadata = readYamlOrJson(CHAIN_2_METADATA_PATH); + + const provider = new ethers.providers.JsonRpcProvider( + chainMetadata.rpcUrls[0].http, + ); + + const wallet = new Wallet(ANVIL_KEY); + signer = wallet.connect(provider); + + initialOwnerAddress = await signer.getAddress(); + }); + + describe('hyperlane core deploy', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + const steps: TestPromptAction[] = [ + ...SETUP_CHAIN_SIGNERS_MANUALLY_STEPS, + SELECT_MAINNET_CHAIN_TYPE_STEP, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + // Scroll down through the mainnet chains list and select anvil2 + input: `${KeyBoardKeys.ARROW_DOWN.repeat(2)}}${KeyBoardKeys.ENTER}`, + }, + { + // When running locally the e2e tests, the chains folder might already have the chain contracts + check: (currentOutput) => + currentOutput.includes('Mailbox already exists at') || + currentOutput.includes('Is this deployment plan correct?'), + input: `yes${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Is this deployment plan correct?'), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreDeployRaw(CORE_CONFIG_PATH).stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + const requiredHookConfig = coreConfig.requiredHook as Exclude< + CoreConfig['requiredHook'], + string + >; + expect(requiredHookConfig.type).to.equal(HookType.PROTOCOL_FEE); + expect((requiredHookConfig as ProtocolFeeHookConfig).owner).to.equal( + initialOwnerAddress, + ); + }); + }); + + describe('hyperlane core deploy --yes', () => { + it('should fail if the --chain flag is not provided but the --yes flag is', async () => { + const steps: TestPromptAction[] = [...SETUP_CHAIN_SIGNERS_MANUALLY_STEPS]; + + const output = hyperlaneCoreDeployRaw(CORE_CONFIG_PATH, undefined, true) + .nothrow() + .stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(1); + expect(finalOutput.text().includes('No chain provided')).to.be.true; + }); + }); + + describe('hyperlane core deploy --key ...', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + // Scroll down through the mainnet chains list and select anvil2 + input: `${KeyBoardKeys.ARROW_DOWN.repeat(2)}}${KeyBoardKeys.ENTER}`, + }, + { + // When running locally the e2e tests, the chains folder might already have the chain contracts + check: (currentOutput) => + currentOutput.includes('Mailbox already exists at') || + currentOutput.includes('Is this deployment plan correct?'), + input: `yes${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Is this deployment plan correct?'), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreDeployRaw(CORE_CONFIG_PATH, ANVIL_KEY).stdio( + 'pipe', + ); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + const requiredHookConfig = coreConfig.requiredHook as Exclude< + CoreConfig['requiredHook'], + string + >; + expect(requiredHookConfig.type).to.equal(HookType.PROTOCOL_FEE); + expect((requiredHookConfig as ProtocolFeeHookConfig).owner).to.equal( + initialOwnerAddress, + ); + }); + }); + + describe('HYP_KEY= ... hyperlane core deploy', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + // Scroll down through the mainnet chains list and select anvil2 + input: `${KeyBoardKeys.ARROW_DOWN.repeat(2)}}${KeyBoardKeys.ENTER}`, + }, + { + // When running locally the e2e tests, the chains folder might already have the chain contracts + check: (currentOutput) => + currentOutput.includes('Mailbox already exists at') || + currentOutput.includes('Is this deployment plan correct?'), + input: `yes${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Is this deployment plan correct?'), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreDeployRaw( + CORE_CONFIG_PATH, + undefined, + undefined, + ANVIL_KEY, + ).stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + const requiredHookConfig = coreConfig.requiredHook as Exclude< + CoreConfig['requiredHook'], + string + >; + expect(requiredHookConfig.type).to.equal(HookType.PROTOCOL_FEE); + expect((requiredHookConfig as ProtocolFeeHookConfig).owner).to.equal( + initialOwnerAddress, + ); + }); + }); + + describe('hyperlane core deploy --yes --key ...', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_CONFIG_PATH); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + + expect(coreConfig.owner).to.equal(initialOwnerAddress); + expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + expect((coreConfig.requiredHook as ProtocolFeeHookConfig).owner).to.equal( + initialOwnerAddress, + ); + }); + + it('should create a core deployment with the mailbox owner set to the address in the config', async () => { + const coreConfig: CoreConfig = await readYamlOrJson(CORE_CONFIG_PATH); + + const newOwner = randomAddress().toLowerCase(); + + coreConfig.owner = newOwner; + writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); + + // Deploy the core contracts with the updated mailbox owner + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); + + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + + expect(updatedConfig.owner.toLowerCase()).to.equal(newOwner); + expect(updatedConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + expect( + (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, + ).to.equal(initialOwnerAddress); + }); + + it('should create a core deployment with ProxyAdmin owner of the mailbox set to the address in the config', async () => { + const coreConfig: CoreConfig = await readYamlOrJson(CORE_CONFIG_PATH); + + const newOwner = randomAddress().toLowerCase(); + + coreConfig.proxyAdmin = { owner: newOwner }; + writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); + + // Deploy the core contracts with the updated mailbox owner + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); + + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + + expect(updatedConfig.owner).to.equal(initialOwnerAddress); + expect(updatedConfig.proxyAdmin?.owner.toLowerCase()).to.equal(newOwner); + // Assuming that the ProtocolFeeHook is used for deployment + expect( + (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, + ).to.equal(initialOwnerAddress); + }); + }); +}); diff --git a/typescript/cli/src/tests/core/core-init.e2e-test.ts b/typescript/cli/src/tests/core/core-init.e2e-test.ts new file mode 100644 index 0000000000..5c308df4a5 --- /dev/null +++ b/typescript/cli/src/tests/core/core-init.e2e-test.ts @@ -0,0 +1,216 @@ +import { expect } from 'chai'; +import { Wallet } from 'ethers'; + +import { + CoreConfig, + HookType, + MerkleTreeHookConfig, + ProtocolFeeHookConfig, + randomAddress, +} from '@hyperlane-xyz/sdk'; +import { Address, normalizeAddress } from '@hyperlane-xyz/utils'; + +import { readYamlOrJson } from '../../utils/files.js'; +import { hyperlaneCoreInit } from '../commands/core.js'; +import { + ANVIL_KEY, + CONFIRM_DETECTED_OWNER_STEP, + CORE_CONFIG_PATH_2, + DEFAULT_E2E_TEST_TIMEOUT, + KeyBoardKeys, + TestPromptAction, + handlePrompts, +} from '../commands/helpers.js'; + +describe('hyperlane core init e2e tests', async function () { + this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT); + + function assertCoreInitConfig( + coreConfig: CoreConfig, + owner: Address, + feeHookOwner: Address = owner, + feeHookBeneficiary: Address = feeHookOwner, + ): void { + expect(coreConfig.owner).to.equal(owner); + expect(coreConfig.proxyAdmin?.owner).to.equal(owner); + + const defaultHookConfig = coreConfig.defaultHook as MerkleTreeHookConfig; + expect(defaultHookConfig.type).to.equal(HookType.MERKLE_TREE); + + const requiredHookConfig = coreConfig.requiredHook as ProtocolFeeHookConfig; + expect(requiredHookConfig.type).to.equal(HookType.PROTOCOL_FEE); + expect(normalizeAddress(requiredHookConfig.owner)).to.equal(feeHookOwner); + expect(normalizeAddress(requiredHookConfig.beneficiary)).to.equal( + feeHookBeneficiary, + ); + } + + describe('hyperlane core init', () => { + it('should successfully generate the core contract deployment config', async () => { + const output = hyperlaneCoreInit(CORE_CONFIG_PATH_2).stdio('pipe'); + + const owner = normalizeAddress(randomAddress()); + const feeHookOwner = normalizeAddress(randomAddress()); + const steps: TestPromptAction[] = [ + { + check: (currentOutput) => + currentOutput.includes('Enter the desired owner address:'), + input: `${owner}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes( + 'For trusted relayer ISM, enter relayer address:', + ), + input: `${owner}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes( + 'For Protocol Fee Hook, enter owner address:', + ), + input: `${feeHookOwner}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: KeyBoardKeys.ENTER, + }, + ]; + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig(deploymentCoreConfig, owner, feeHookOwner); + }); + }); + + describe('HYP_KEY=... hyperlane core init', () => { + it('should successfully generate the core contract deployment config when confirming owner prompts', async () => { + const owner = new Wallet(ANVIL_KEY).address; + const steps: TestPromptAction[] = [ + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreInit( + CORE_CONFIG_PATH_2, + undefined, + ANVIL_KEY, + ).stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig(deploymentCoreConfig, owner); + }); + + it('should successfully generate the core contract deployment config when not confirming owner prompts', async () => { + const owner = new Wallet(ANVIL_KEY).address; + const feeHookOwner = normalizeAddress(randomAddress()); + const steps: TestPromptAction[] = [ + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: `no${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Enter beneficiary address for'), + input: `${feeHookOwner}${KeyBoardKeys.ENTER}`, + }, + ]; + + const output = hyperlaneCoreInit( + CORE_CONFIG_PATH_2, + undefined, + ANVIL_KEY, + ).stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig( + deploymentCoreConfig, + owner, + undefined, + feeHookOwner, + ); + }); + }); + + describe('hyperlane core init --key ...', () => { + it('should successfully generate the core contract deployment config when confirming owner prompts', async () => { + const owner = new Wallet(ANVIL_KEY).address; + const steps: TestPromptAction[] = [ + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreInit(CORE_CONFIG_PATH_2, ANVIL_KEY).stdio( + 'pipe', + ); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig(deploymentCoreConfig, owner); + }); + + it('should successfully generate the core contract deployment config when not confirming owner prompts', async () => { + const owner = new Wallet(ANVIL_KEY).address; + const feeHookOwner = normalizeAddress(randomAddress()); + const steps: TestPromptAction[] = [ + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: `no${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Enter beneficiary address for'), + input: `${feeHookOwner}${KeyBoardKeys.ENTER}`, + }, + ]; + + const output = hyperlaneCoreInit(CORE_CONFIG_PATH_2, ANVIL_KEY).stdio( + 'pipe', + ); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig( + deploymentCoreConfig, + owner, + undefined, + feeHookOwner, + ); + }); + }); +}); diff --git a/typescript/cli/src/tests/core-read.e2e-test.ts b/typescript/cli/src/tests/core/core-read.e2e-test.ts similarity index 90% rename from typescript/cli/src/tests/core-read.e2e-test.ts rename to typescript/cli/src/tests/core/core-read.e2e-test.ts index 7390e8dca4..9ed0a3ca01 100644 --- a/typescript/cli/src/tests/core-read.e2e-test.ts +++ b/typescript/cli/src/tests/core/core-read.e2e-test.ts @@ -8,9 +8,8 @@ import { } from '@hyperlane-xyz/sdk'; import { Address } from '@hyperlane-xyz/utils'; -import { readYamlOrJson } from '../utils/files.js'; - -import { hyperlaneCoreDeploy, readCoreConfig } from './commands/core.js'; +import { readYamlOrJson } from '../../utils/files.js'; +import { hyperlaneCoreDeploy, readCoreConfig } from '../commands/core.js'; import { ANVIL_KEY, CHAIN_2_METADATA_PATH, @@ -18,7 +17,7 @@ import { CORE_CONFIG_PATH, CORE_READ_CONFIG_PATH_2, DEFAULT_E2E_TEST_TIMEOUT, -} from './commands/helpers.js'; +} from '../commands/helpers.js'; describe('hyperlane core read e2e tests', async function () { this.timeout(DEFAULT_E2E_TEST_TIMEOUT); diff --git a/typescript/cli/src/tests/warp-deploy.e2e-test.ts b/typescript/cli/src/tests/warp-deploy.e2e-test.ts index d80508eb6a..71dc2e9183 100644 --- a/typescript/cli/src/tests/warp-deploy.e2e-test.ts +++ b/typescript/cli/src/tests/warp-deploy.e2e-test.ts @@ -28,7 +28,11 @@ import { deployToken, sendWarpRouteMessageRoundTrip, } from './commands/helpers.js'; -import { hyperlaneWarpDeploy, readWarpConfig } from './commands/warp.js'; +import { + hyperlaneWarpDeploy, + hyperlaneWarpSendRelay, + readWarpConfig, +} from './commands/warp.js'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -198,4 +202,49 @@ describe('hyperlane warp deploy e2e tests', async function () { normalizeConfig(hook), ); }); + + it('should send a message from origin to destination in the correct order', async function () { + const warpConfig: WarpRouteDeployConfig = { + [CHAIN_NAME_2]: { + type: TokenType.collateralVaultRebase, + token: vault.address, + mailbox: chain2Addresses.mailbox, + owner: chain2Addresses.mailbox, + }, + [CHAIN_NAME_3]: { + type: TokenType.syntheticRebase, + mailbox: chain3Addresses.mailbox, + owner: chain3Addresses.mailbox, + collateralChainName: CHAIN_NAME_2, + }, + }; + + writeYamlOrJson(WARP_CONFIG_PATH, warpConfig); + await hyperlaneWarpDeploy(WARP_CONFIG_PATH); + + // Try to send a transaction with the origin destination + const { stdout: chain2Tochain3Stdout } = await hyperlaneWarpSendRelay( + CHAIN_NAME_2, + CHAIN_NAME_3, + WARP_CORE_CONFIG_PATH_2_3, + ); + expect(chain2Tochain3Stdout).to.include('anvil2 ➡️ anvil3'); + + // Send another message with swapped origin destination + const { stdout: chain3Tochain2Stdout } = await hyperlaneWarpSendRelay( + CHAIN_NAME_3, + CHAIN_NAME_2, + WARP_CORE_CONFIG_PATH_2_3, + ); + expect(chain3Tochain2Stdout).to.include('anvil3 ➡️ anvil2'); + + // Should throw if invalid origin or destination + await hyperlaneWarpSendRelay( + 'anvil1', + CHAIN_NAME_3, + WARP_CORE_CONFIG_PATH_2_3, + ).should.be.rejectedWith( + 'Error: Origin (anvil1) or destination (anvil3) are not part of the warp route.', + ); + }); }); diff --git a/typescript/cli/src/tests/warp-init.e2e-test.ts b/typescript/cli/src/tests/warp-init.e2e-test.ts new file mode 100644 index 0000000000..66cfa3bfc7 --- /dev/null +++ b/typescript/cli/src/tests/warp-init.e2e-test.ts @@ -0,0 +1,182 @@ +import { expect } from 'chai'; +import { Wallet } from 'ethers'; + +import { ChainAddresses } from '@hyperlane-xyz/registry'; +import { + ChainMap, + ChainName, + TokenType, + WarpRouteDeployConfig, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { readYamlOrJson } from '../utils/files.js'; + +import { + ANVIL_KEY, + CHAIN_NAME_2, + CHAIN_NAME_3, + CONFIRM_DETECTED_OWNER_STEP, + CORE_CONFIG_PATH, + DEFAULT_E2E_TEST_TIMEOUT, + KeyBoardKeys, + SELECT_ANVIL_2_AND_ANVIL_3_STEPS, + SELECT_ANVIL_2_FROM_MULTICHAIN_PICKER, + SELECT_MAINNET_CHAIN_TYPE_STEP, + TestPromptAction, + WARP_CONFIG_PATH_2, + deployOrUseExistingCore, + deployToken, + handlePrompts, +} from './commands/helpers.js'; +import { hyperlaneWarpInit } from './commands/warp.js'; + +describe('hyperlane warp init e2e tests', async function () { + this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT); + + let chain2Addresses: ChainAddresses = {}; + let chain3Addresses: ChainAddresses = {}; + let initialOwnerAddress: Address; + let chainMapAddresses: ChainMap = {}; + + before(async function () { + [chain2Addresses, chain3Addresses] = await Promise.all([ + deployOrUseExistingCore(CHAIN_NAME_2, CORE_CONFIG_PATH, ANVIL_KEY), + deployOrUseExistingCore(CHAIN_NAME_3, CORE_CONFIG_PATH, ANVIL_KEY), + ]); + + chainMapAddresses = { + [CHAIN_NAME_2]: chain2Addresses, + [CHAIN_NAME_3]: chain3Addresses, + }; + + const wallet = new Wallet(ANVIL_KEY); + initialOwnerAddress = wallet.address; + }); + + describe('hyperlane warp init --yes', () => { + function assertWarpConfig( + warpConfig: WarpRouteDeployConfig, + chainMapAddresses: ChainMap, + chainName: ChainName, + ) { + expect(warpConfig[chainName]).not.to.be.undefined; + + const chain2TokenConfig = warpConfig[chainName]; + expect(chain2TokenConfig.mailbox).equal( + chainMapAddresses[chainName].mailbox, + ); + expect(chain2TokenConfig.owner).equal(initialOwnerAddress); + expect(chain2TokenConfig.type).equal(TokenType.native); + } + + it('it should generate a warp deploy config with a single chain', async function () { + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + // Scroll down through the mainnet chains list and select anvil2 + input: `${SELECT_ANVIL_2_FROM_MULTICHAIN_PICKER}${KeyBoardKeys.ENTER}`, + }, + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + // Scroll up through the token type list and select native + input: `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, + }, + ]; + + const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); + + await handlePrompts(output, steps); + + const warpConfig: WarpRouteDeployConfig = + readYamlOrJson(WARP_CONFIG_PATH_2); + + assertWarpConfig(warpConfig, chainMapAddresses, CHAIN_NAME_2); + }); + + it('it should generate a warp deploy config with a 2 chains warp route (native->native)', async function () { + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + ...SELECT_ANVIL_2_AND_ANVIL_3_STEPS, + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + input: `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, + }, + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + input: `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, + }, + ]; + + const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); + + await handlePrompts(output, steps); + + const warpConfig: WarpRouteDeployConfig = + readYamlOrJson(WARP_CONFIG_PATH_2); + + [CHAIN_NAME_2, CHAIN_NAME_3].map((chainName) => + assertWarpConfig(warpConfig, chainMapAddresses, chainName), + ); + }); + + it('it should generate a warp deploy config with a 2 chains warp route (collateral->synthetic)', async function () { + const erc20Token = await deployToken(ANVIL_KEY, CHAIN_NAME_2, 6); + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + ...SELECT_ANVIL_2_AND_ANVIL_3_STEPS, + // First chain token config + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + // Scroll down through the token type list and select collateral + input: `${KeyBoardKeys.ARROW_DOWN.repeat(4)}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput: string) => + currentOutput.includes('Enter the existing token address on chain'), + input: `${erc20Token.address}${KeyBoardKeys.ENTER}`, + }, + // Other chain token config + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + // Select the synthetic token type + input: `${KeyBoardKeys.ENTER}`, + }, + ]; + + const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); + + await handlePrompts(output, steps); + + const warpConfig: WarpRouteDeployConfig = + readYamlOrJson(WARP_CONFIG_PATH_2); + + expect(warpConfig[CHAIN_NAME_2]).not.to.be.undefined; + + const chain2TokenConfig = warpConfig[CHAIN_NAME_2]; + expect(chain2TokenConfig.mailbox).equal(chain2Addresses.mailbox); + expect(chain2TokenConfig.owner).equal(initialOwnerAddress); + expect(chain2TokenConfig.type).equal(TokenType.collateral); + expect((chain2TokenConfig as any).token).equal(erc20Token.address); + + expect(warpConfig[CHAIN_NAME_3]).not.to.be.undefined; + + const chain3TokenConfig = warpConfig[CHAIN_NAME_3]; + expect(chain3TokenConfig.mailbox).equal(chain3Addresses.mailbox); + expect(chain3TokenConfig.owner).equal(initialOwnerAddress); + expect(chain3TokenConfig.type).equal(TokenType.synthetic); + }); + }); +}); diff --git a/typescript/cli/src/tests/warp-read-zksync.e2e-test.ts b/typescript/cli/src/tests/warp-read-zksync.e2e-test.ts index 3b14de6d6c..08fb62caf4 100644 --- a/typescript/cli/src/tests/warp-read-zksync.e2e-test.ts +++ b/typescript/cli/src/tests/warp-read-zksync.e2e-test.ts @@ -21,7 +21,7 @@ const WARP_CONFIG_PATH_2 = `${TEMP_PATH}/zksync/warp-route-deployment.yaml`; const WARP_CORE_CONFIG_PATH_2 = `${ZK_REGISTRY_PATH}/deployments/warp_routes/ETH/${CHAIN_NAME_ZK_2}-config.yaml`; const TEST_TIMEOUT = 180_000; // Long timeout since these tests can take a while -describe.skip('WarpRead ZKSync e2e tests', async function () { +describe.skip('WarpRead ZkSync e2e tests', async function () { let zksync2WarpConfig: WarpRouteDeployConfig; this.timeout(TEST_TIMEOUT); before(async function () { diff --git a/typescript/cli/src/utils/balances.ts b/typescript/cli/src/utils/balances.ts index 2a6e6fcb8a..701acceda6 100644 --- a/typescript/cli/src/utils/balances.ts +++ b/typescript/cli/src/utils/balances.ts @@ -1,15 +1,16 @@ -import { confirm } from '@inquirer/prompts'; import { ethers } from 'ethers'; import { ChainName, MultiProvider } from '@hyperlane-xyz/sdk'; import { ProtocolType } from '@hyperlane-xyz/utils'; -import { logGray, logGreen, logRed } from '../logger.js'; +import { autoConfirm } from '../config/prompts.js'; +import { logBlue, logGray, logGreen, logRed, warnYellow } from '../logger.js'; export async function nativeBalancesAreSufficient( multiProvider: MultiProvider, chains: ChainName[], minGas: string, + skipConfirmation: boolean, ) { const sufficientBalances: boolean[] = []; for (const chain of chains) { @@ -42,9 +43,10 @@ export async function nativeBalancesAreSufficient( if (allSufficient) { logGreen('✅ Balances are sufficient'); } else { - const isResume = await confirm({ - message: 'Deployment may fail due to insufficient balance(s). Continue?', - }); + warnYellow(`Deployment may fail due to insufficient balance(s)`); + const isResume = await autoConfirm('Continue?', skipConfirmation, () => + logBlue('Continuing deployment with insufficient balances'), + ); if (!isResume) throw new Error('Canceled deployment due to low balance'); } } diff --git a/typescript/cli/src/utils/chains.ts b/typescript/cli/src/utils/chains.ts index 7e2eaccd0a..7f2f88fad8 100644 --- a/typescript/cli/src/utils/chains.ts +++ b/typescript/cli/src/utils/chains.ts @@ -1,4 +1,5 @@ import { Separator, confirm } from '@inquirer/prompts'; +import search from '@inquirer/search'; import select from '@inquirer/select'; import chalk from 'chalk'; @@ -23,9 +24,21 @@ export async function runSingleChainSelectionStep( chainMetadata, networkType, ); - const chain = (await select({ - message, - choices: [networkTypeSeparator, ...choices], + + const formattedMessage = message.endsWith(':') ? message : `${message}:`; + const options = [networkTypeSeparator, ...choices]; + const chain = (await search({ + message: formattedMessage, + source: (searchTerm) => { + if (!searchTerm) { + return options; + } + + return options.filter( + (value) => + Separator.isSeparator(value) || value.value.includes(searchTerm), + ); + }, pageSize: calculatePageSize(2), })) as string; handleNewChain([chain]); @@ -142,7 +155,9 @@ function getChainChoices( networkType: 'mainnet' | 'testnet', ) { const chainsToChoices = (chains: ChainMetadata[]) => - chains.map((c) => ({ name: c.name, value: c.name })); + chains + .map((c) => ({ name: c.name, value: c.name })) + .sort((a, b) => a.name.localeCompare(b.name)); const chains = Object.values(chainMetadata); const filteredChains = chains.filter((c) => diff --git a/typescript/cli/src/utils/files.ts b/typescript/cli/src/utils/files.ts index 50f56d1b77..b067963d8c 100644 --- a/typescript/cli/src/utils/files.ts +++ b/typescript/cli/src/utils/files.ts @@ -4,9 +4,12 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import { + DocumentOptions, LineCounter, + ParseOptions, + SchemaOptions, + ToJSOptions, parse, - parse as yamlParse, stringify as yamlStringify, } from 'yaml'; @@ -14,6 +17,13 @@ import { objMerge } from '@hyperlane-xyz/utils'; import { log } from '../logger.js'; +const yamlParse = ( + content: string, + options?: ParseOptions & DocumentOptions & SchemaOptions & ToJSOptions, +) => + // See stackoverflow.com/questions/63075256/why-does-the-npm-yaml-library-have-a-max-alias-number + parse(content, { maxAliasCount: -1, ...options }); + export const MAX_READ_LINE_OUTPUT = 250; export type FileFormat = 'yaml' | 'json'; @@ -250,7 +260,7 @@ export function logYamlIfUnderMaxLines( ): void { const asYamlString = yamlStringify(obj, null, margin); const lineCounter = new LineCounter(); - parse(asYamlString, { lineCounter }); + yamlParse(asYamlString, { lineCounter }); log(lineCounter.lineStarts.length < maxLines ? asYamlString : ''); } diff --git a/typescript/cli/src/validator/utils.ts b/typescript/cli/src/validator/utils.ts index c96aa66125..f1218c2b1b 100644 --- a/typescript/cli/src/validator/utils.ts +++ b/typescript/cli/src/validator/utils.ts @@ -1,5 +1,6 @@ import { MerkleTreeHook, ValidatorAnnounce } from '@hyperlane-xyz/core'; -import { S3Validator } from '@hyperlane-xyz/sdk'; +import { getValidatorFromStorageLocation } from '@hyperlane-xyz/sdk'; +import { BaseValidator } from '@hyperlane-xyz/utils'; import { logDebug } from '../logger.js'; @@ -36,23 +37,23 @@ export const getValidatorStorageLocations = async ( }; export const getLatestValidatorCheckpointIndexAndUrl = async ( - s3StorageLocation: string, + storageLocation: string, ): Promise<[number, string] | undefined> => { - let s3Validator: S3Validator; + let validator: BaseValidator; try { - s3Validator = await S3Validator.fromStorageLocation(s3StorageLocation); + validator = await getValidatorFromStorageLocation(storageLocation); } catch (err) { logDebug( - `Failed to instantiate S3Validator at location ${s3StorageLocation}: ${err}`, + `Failed to instantiate Validator at location ${storageLocation}: ${err}`, ); return undefined; } try { - const latestCheckpointIndex = await s3Validator.getLatestCheckpointIndex(); - return [latestCheckpointIndex, s3Validator.getLatestCheckpointUrl()]; + const latestCheckpointIndex = await validator.getLatestCheckpointIndex(); + return [latestCheckpointIndex, validator.getLatestCheckpointUrl()]; } catch (err) { logDebug( - `Failed to get latest checkpoint index from S3Validator at location ${s3StorageLocation}: ${err}`, + `Failed to get latest checkpoint index from Validator at location ${storageLocation}: ${err}`, ); return undefined; } diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index af959132f7..a7df740c2d 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '7.3.0'; +export const VERSION = '8.0.0'; diff --git a/typescript/github-proxy/CHANGELOG.md b/typescript/github-proxy/CHANGELOG.md index a5237280ae..5545013903 100644 --- a/typescript/github-proxy/CHANGELOG.md +++ b/typescript/github-proxy/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/github-proxy +## 8.0.0 + ## 7.3.0 ## 7.2.0 diff --git a/typescript/github-proxy/package.json b/typescript/github-proxy/package.json index 848f3dcafc..698c9f4f0b 100644 --- a/typescript/github-proxy/package.json +++ b/typescript/github-proxy/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/github-proxy", "description": "Github proxy that adds the API key to requests", - "version": "7.3.0", + "version": "8.0.0", "private": true, "scripts": { "deploy": "wrangler deploy", diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index 89cedf4d32..08416584c7 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,29 @@ # @hyperlane-xyz/helloworld +## 8.0.0 + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 + +### Patch Changes + +- 472b34670: Bump registry version to v6.3.0. +- Updated dependencies [472b34670] +- Updated dependencies [fd20bb1e9] +- Updated dependencies [26fbec8f6] +- Updated dependencies [71aefa03e] +- Updated dependencies [9f6b8c514] +- Updated dependencies [82cebabe4] +- Updated dependencies [95cc9571e] +- Updated dependencies [0eb8d52a4] +- Updated dependencies [c690ca82f] +- Updated dependencies [5942e9cff] +- Updated dependencies [de1190656] +- Updated dependencies [e9911bb9d] + - @hyperlane-xyz/sdk@8.0.0 + - @hyperlane-xyz/core@5.9.0 + ## 7.3.0 ### Patch Changes diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 83bc100ac3..54236e1f25 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": "7.3.0", + "version": "8.0.0", "dependencies": { - "@hyperlane-xyz/core": "5.8.3", + "@hyperlane-xyz/core": "5.9.0", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "7.3.0", + "@hyperlane-xyz/sdk": "8.0.0", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" }, diff --git a/typescript/infra/CHANGELOG.md b/typescript/infra/CHANGELOG.md index 1e8ec17676..67b7a15642 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,31 @@ # @hyperlane-xyz/infra +## 8.0.0 + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 +- 0e83758f4: added ubtc route extension config + usdc from appchain to base + +### Patch Changes + +- Updated dependencies [472b34670] +- Updated dependencies [79f8197f3] +- Updated dependencies [fd20bb1e9] +- Updated dependencies [26fbec8f6] +- Updated dependencies [71aefa03e] +- Updated dependencies [9f6b8c514] +- Updated dependencies [82cebabe4] +- Updated dependencies [95cc9571e] +- Updated dependencies [c690ca82f] +- Updated dependencies [5942e9cff] +- Updated dependencies [de1190656] +- Updated dependencies [e9911bb9d] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/helloworld@8.0.0 + - @hyperlane-xyz/sdk@8.0.0 + - @hyperlane-xyz/utils@8.0.0 + ## 7.3.0 ### Minor Changes diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index ad075baccc..19b331cd90 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -1,11 +1,19 @@ import { + AgentSealevelHeliusFeeLevel, + AgentSealevelPriorityFeeOracle, + AgentSealevelPriorityFeeOracleType, + AgentSealevelTransactionSubmitter, + AgentSealevelTransactionSubmitterType, + ChainName, GasPaymentEnforcement, GasPaymentEnforcementPolicyType, + MatchingList, RpcConsensusType, } from '@hyperlane-xyz/sdk'; import { AgentChainConfig, + HELIUS_SECRET_URL_MARKER, RootAgentConfig, getAgentChainNamesFromConfig, } from '../../../src/config/agent/agent.js'; @@ -51,14 +59,18 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< > = { // Generally, we run all production validators in the Hyperlane context. [Role.Validator]: { + // acala: true, ancient8: true, alephzeroevmmainnet: true, apechain: true, appchain: true, arbitrum: true, arbitrumnova: true, + artela: true, + arthera: true, astar: true, astarzkevm: true, + aurora: true, flame: true, avalanche: true, b3: true, @@ -72,7 +84,10 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< celo: true, cheesechain: true, chilizmainnet: true, + conflux: true, + conwai: true, coredao: true, + corn: true, cyber: true, degenchain: true, dogechain: true, @@ -81,17 +96,23 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< endurance: true, ethereum: true, everclear: true, + evmos: true, fantom: true, flare: true, flowmainnet: true, + form: true, + // fractal: false, fraxtal: true, fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, injective: true, + ink: true, kaia: true, kroma: true, linea: true, @@ -109,6 +130,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< molten: true, moonbeam: true, morph: true, + nero: true, neutron: true, oortmainnet: true, optimism: true, @@ -122,6 +144,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< rarichain: true, real: true, redstone: true, + rivalz: true, rootstockmainnet: true, sanko: true, scroll: true, @@ -129,12 +152,18 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< shibarium: true, snaxchain: true, solanamainnet: true, + soneium: true, + sonic: true, + soon: true, stride: false, + // subtensor: true, superseed: true, superpositionmainnet: true, swell: true, taiko: true, tangle: true, + telos: true, + torus: true, treasure: true, unichain: true, vana: true, @@ -142,6 +171,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -150,14 +180,18 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< zoramainnet: true, }, [Role.Relayer]: { + // acala: true, ancient8: true, alephzeroevmmainnet: true, apechain: true, appchain: true, arbitrum: true, arbitrumnova: true, + artela: true, + arthera: true, astar: true, astarzkevm: true, + aurora: true, flame: true, avalanche: true, b3: true, @@ -171,7 +205,10 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< celo: true, cheesechain: true, chilizmainnet: true, + conflux: true, + conwai: true, coredao: true, + corn: true, cyber: true, degenchain: true, dogechain: true, @@ -180,17 +217,23 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< endurance: true, ethereum: true, everclear: true, + evmos: true, fantom: true, flare: true, flowmainnet: true, + form: true, + // fractal: false, fraxtal: true, fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, injective: true, + ink: true, kaia: true, kroma: true, linea: true, @@ -208,6 +251,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< molten: true, moonbeam: true, morph: true, + nero: true, // At the moment, we only relay between Neutron and Manta Pacific on the neutron context. neutron: false, oortmainnet: true, @@ -222,6 +266,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< rarichain: true, real: true, redstone: true, + rivalz: true, rootstockmainnet: true, sanko: true, scroll: true, @@ -229,12 +274,18 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< shibarium: true, snaxchain: true, solanamainnet: true, + soneium: true, + sonic: true, + soon: true, stride: true, + // subtensor: true, superseed: true, superpositionmainnet: true, swell: true, taiko: true, tangle: true, + telos: true, + torus: true, treasure: true, unichain: true, vana: true, @@ -242,6 +293,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -250,15 +302,18 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< zoramainnet: true, }, [Role.Scraper]: { + // acala: true, ancient8: true, alephzeroevmmainnet: true, apechain: true, appchain: true, arbitrum: true, arbitrumnova: true, + artela: true, + arthera: true, astar: true, astarzkevm: true, - flame: true, + aurora: true, avalanche: true, b3: true, base: true, @@ -271,7 +326,10 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< celo: true, cheesechain: true, chilizmainnet: true, + conflux: true, + conwai: true, coredao: true, + corn: true, cyber: true, degenchain: true, dogechain: true, @@ -280,16 +338,23 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< endurance: true, ethereum: true, everclear: true, + evmos: true, fantom: true, + flame: true, flare: true, flowmainnet: true, + form: true, + // fractal: false, fraxtal: true, fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, + ink: true, injective: true, kaia: true, kroma: true, @@ -308,6 +373,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< molten: true, moonbeam: true, morph: true, + nero: true, neutron: true, oortmainnet: true, optimism: true, @@ -321,6 +387,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< rarichain: true, real: true, redstone: true, + rivalz: true, rootstockmainnet: true, sanko: true, scroll: true, @@ -328,12 +395,18 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< shibarium: true, snaxchain: true, solanamainnet: true, + soneium: true, + sonic: true, + soon: false, stride: true, + // subtensor: true, superseed: true, superpositionmainnet: true, swell: true, taiko: true, tangle: true, + telos: true, + torus: true, treasure: true, unichain: true, vana: true, @@ -342,6 +415,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -356,6 +430,56 @@ export const hyperlaneContextAgentChainNames = getAgentChainNamesFromConfig( mainnet3SupportedChainNames, ); +const sealevelPriorityFeeOracleConfigGetter = ( + chain: ChainName, +): AgentSealevelPriorityFeeOracle => { + // Special case for Solana mainnet + if (chain === 'solanamainnet') { + return { + type: AgentSealevelPriorityFeeOracleType.Helius, + feeLevel: AgentSealevelHeliusFeeLevel.Recommended, + // URL is auto populated by the external secrets in the helm chart + url: '', + }; + } else if (chain === 'eclipsemainnet') { + // As of Dec 23: + // Eclipse has recently seen some increased usage with their referral program, + // and we have had intermittent issues landing txs. Not many txs on Eclipse use + // priority fees, so we use a low priority fee. + return { + type: AgentSealevelPriorityFeeOracleType.Constant, + // 2000 micro lamports of ETH, which at a compute unit limit of 400K + // and an ETH price of $3450 (Dec 23, 2024) comes to about $0.00276 USD: + // >>> (((2000 / 1e6) * 400000) / 1e9) * 3450 + // 0.00276 + fee: '2000', + }; + } + + // For all other chains, we use the constant fee oracle with a fee of 0 + return { + type: AgentSealevelPriorityFeeOracleType.Constant, + fee: '0', + }; +}; + +const sealevelTransactionSubmitterConfigGetter = ( + chain: ChainName, +): AgentSealevelTransactionSubmitter => { + // Special case for Solana mainnet + if (chain === 'solanamainnet') { + return { + type: AgentSealevelTransactionSubmitterType.Rpc, + url: HELIUS_SECRET_URL_MARKER, + }; + } + + // For all other chains, use the default RPC transaction submitter + return { + type: AgentSealevelTransactionSubmitterType.Rpc, + }; +}; + const contextBase = { namespace: environment, runEnv: environment, @@ -363,6 +487,10 @@ const contextBase = { aws: { region: 'us-east-1', }, + sealevel: { + priorityFeeOracleConfigGetter: sealevelPriorityFeeOracleConfigGetter, + transactionSubmitterConfigGetter: sealevelTransactionSubmitterConfigGetter, + }, } as const; const gasPaymentEnforcement: GasPaymentEnforcement[] = [ @@ -372,6 +500,10 @@ const gasPaymentEnforcement: GasPaymentEnforcement[] = [ matchingList: [ // Temporary workaround due to funky Mantle gas amounts. { destinationDomain: getDomainId('mantle') }, + // Temporary workaround due to funky Torus gas amounts. + { destinationDomain: getDomainId('torus') }, + // Temporary workaround for some high gas amount estimates on Treasure + ...warpRouteMatchingList(WarpRouteIds.ArbitrumTreasureMAGIC), ], }, { @@ -440,24 +572,77 @@ const metricAppContextsGetter = (): MetricAppContext[] => { const relayerResources = { requests: { cpu: '14000m', - memory: '15Gi', + memory: '20G', }, }; const validatorResources = { requests: { cpu: '500m', - memory: '1Gi', + memory: '1G', }, }; const scraperResources = { requests: { cpu: '2000m', - memory: '4Gi', + memory: '4G', }, }; +const blacklistedMessageIds = [ + // ezETH + '0xb9cfeb4a22b65903ca7cb514fd752feba0622a0495878d508d19a91734d89cc4', + '0x13d6c56781ee9b8811f4e17198bf064baed2682ce44193c750e76c73384466e7', + '0x366520dcd48f19a2cdc806e244d4cea970a587e3932320baee30e710d316b303', + '0x0f9b8849d6dbf5a699e906a6e06044d6cf84ee0ba2174cec28db4fceba52616a', + '0x0e1235105208e7d3a616ac2bb780e7dab30fc289670ba8d6655a4ded73f9b5da', + '0xa6fdecc3f21d081bf3d78da9ddf516b24397a6bff44d7cd4614955f5ca2320b2', + '0x2c3484724a97524fd95aa8aec34a0ae30f79e14e1b228cce9dc1793cea40fc3d', + '0x11ffaeaae5c431501584bc39805ef44b4080e7f90ca7ff609a131d58d1f75ae6', + '0xc18ea74675bc1e5b780e63ac6063c7c39189e1848b8fe52ac40b83fff9268483', + '0xd8040094ab94e44e2b3b57ab0704a33e363f46261a45c9dfc788371c808b8f3a', + '0xf7f0be22f46144793ee3fadccddd4cfb8422d36f5d59bb86fea3782b89160d49', + '0xeda79ab37b4a05d8f318b3a465a70572d819b2c37456c48835a30bb6c016e194', + '0xaf7c7dfc4d19aec283c619a2724d03fbbfeef4a468e84c0573551c1adca40ded', + '0x4a2c42c283755400c0dc7f1be65f6ff026a38aacaa6505302d465268bcd86b21', + '0x0f80e5b8da5a706d6273a622a5c29f83cee5f37e6376c2c8a615b0ef91a540df', + '0x6359232ef1f239d9519104cf47f1e2fbcbe25f8ee68001c5eff7e81bf23b396c', + '0x6a3fb736b952467b814e93fb35edf3a824d35efd1e4b10e3ed465595c55af88a', + + // pzETH + '0x14cb552c08de9f131b750c2f821f90e5ff685e1d3d714e912f7603b2f4b7adb4', + '0xaa5b5021200e66b4a47e5156106c46b6b2bc1e00b088a524a14bb0709cbf733e', + '0x43b4cf52255a7728a3c409f76fd20ba0c36cb42854e0b0a0eefdde848363224b', + '0x047f34405014b117dccd6d8981c846dc3fe746f5e758f90f227581c735f4f11a', + '0x47d60c21abefae928d1c16c5a33cd5a8fcf870cf533c71ab6db49d75a5c4a215', + '0xa2df671fbd4b518c282f9a21e2677fa2a05af33f96ccc9ff113f1a1ffa557667', + '0x1cefa98b6d937333e452a0dbc0654e13416c228682837a8913cb18d612b307dd', + + // MAGIC/ethereum-treasure native funding txs + '0x9d51f4123be816cbaeef2e2b34a5760f633a7cb8a019fe16f88a3227cc22451e', + '0x663c221137028ceeeb102a98e48b362a7b48d626b93c88c7fdf1871a948b1223', + '0xbcc3e52dbc909f75425f4bdd83c94a31d8e3bc816422396dbe1f796ff8a5aadd', + + // txs between unenrolled routers of + // ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet + '0x229a832dfdfa23dfc27eb773e6b34e87f329067393f4f7b616251b3d7d52d294', + '0xcdfd5294e8b1253263908e1919d27675f80a2e9a3bb339b759810efdbb81faa5', + + // txs between unenrolled routers of + // USDT/arbitrum-ethereum-mantle-mode-polygon-scroll-zeronetwork + '0x10159bf1b5b2142b882cb060d1da9f9123d82974ca265ba432138221e52c2a27', + + // test tx when route was first deployed, no merkle tree insertion + // USDC/ethereum-inevm + '0x998746dc822dc15332b8683fb8a29aec22ed3e2f2fb8245c40f56303c5cb6032', +]; + +// Blacklist matching list intended to be used by all contexts. +const blacklist: MatchingList = blacklistedMessageIds.map((messageId) => ({ + messageId, +})); + const hyperlane: RootAgentConfig = { ...contextBase, context: Contexts.Hyperlane, @@ -467,8 +652,9 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'a7f3967-20241205-163733', + tag: 'abb5a8b-20250113-122226', }, + blacklist, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContextsGetter, resources: relayerResources, @@ -476,7 +662,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: 'a7f3967-20241205-163733', + tag: '53fafa6-20250110-125541', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -486,7 +672,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '4b280cd-20241206-130519', + tag: '53fafa6-20250110-125541', }, resources: scraperResources, }, @@ -501,8 +687,9 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '4cb2c9a-20241205-142854', + tag: 'abb5a8b-20250113-122226', }, + blacklist, // We're temporarily (ab)using the RC relayer as a way to increase // message throughput. // whitelist: releaseCandidateHelloworldMatchingList, @@ -534,8 +721,9 @@ const neutron: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '25a927d-20241114-171323', + tag: '234704d-20241226-192528', }, + blacklist, gasPaymentEnforcement, metricAppContextsGetter, resources: relayerResources, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index 9e39d900ce..f187ecc3b2 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -21,12 +21,21 @@ "arbitrumnova": { "validators": ["0xd2a5e9123308d187383c87053811a2c21bd8af1f"] }, + "artela": { + "validators": ["0x8fcc1ebd4c0b463618db13f83e4565af3e166b00"] + }, + "arthera": { + "validators": ["0x13710ac11c36c169f62fba95767ae59a1e57098d"] + }, "astar": { "validators": ["0x4d1b2cade01ee3493f44304653d8e352c66ec3e7"] }, "astarzkevm": { "validators": ["0x89ecdd6caf138934bf3a2fb7b323984d72fd66de"] }, + "aurora": { + "validators": ["0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86"] + }, "flame": { "validators": ["0x1fa928ce884fa16357d4b8866e096392d4d81f43"] }, @@ -82,9 +91,18 @@ "chilizmainnet": { "validators": ["0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb"] }, + "conflux": { + "validators": ["0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490"] + }, + "conwai": { + "validators": ["0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3"] + }, "coredao": { "validators": ["0xbd6e158a3f5830d99d7d2bce192695bc4a148de2"] }, + "corn": { + "validators": ["0xc80b2e3e38220e02d194a0effa9d5bfe89894c07"] + }, "cyber": { "validators": ["0x94d7119ceeb802173b6924e6cc8c4cd731089a27"] }, @@ -113,6 +131,9 @@ "everclear": { "validators": ["0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837"] }, + "evmos": { + "validators": ["0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0"] + }, "fantom": { "validators": ["0xa779572028e634e16f26af5dfd4fa685f619457d"] }, @@ -122,6 +143,9 @@ "flowmainnet": { "validators": ["0xe132235c958ca1f3f24d772e5970dd58da4c0f6e"] }, + "form": { + "validators": ["0x58554b2e76167993b5fc000d0070a2f883cd333a"] + }, "fraxtal": { "validators": ["0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1"] }, @@ -138,9 +162,15 @@ "gravity": { "validators": ["0x23d549bf757a02a6f6068e9363196ecd958c974e"] }, + "guru": { + "validators": ["0x0d756d9051f12c4de6aee2ee972193a2adfe00ef"] + }, "harmony": { "validators": ["0xd677803a67651974b1c264171b5d7ca8838db8d5"] }, + "hemi": { + "validators": ["0x312dc72c17d01f3fd0abd31dd9b569bc473266dd"] + }, "immutablezkevmmainnet": { "validators": ["0xbdda85b19a5efbe09e52a32db1a072f043dd66da"] }, @@ -154,6 +184,9 @@ "injective": { "validators": ["0xbfb8911b72cfb138c7ce517c57d9c691535dc517"] }, + "ink": { + "validators": ["0xb533b8b104522958b984fb258e0684dec0f1a6a5"] + }, "kaia": { "validators": ["0x9de0b3abb221d19719882fa4d61f769fdc2be9a4"] }, @@ -213,6 +246,9 @@ "morph": { "validators": ["0x4884535f393151ec419add872100d352f71af380"] }, + "nero": { + "validators": ["0xb86f872df37f11f33acbe75b6ed208b872b57183"] + }, "neutron": { "validators": [ "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", @@ -268,6 +304,9 @@ "redstone": { "validators": ["0x1400b9737007f7978d8b4bbafb4a69c83f0641a7"] }, + "rivalz": { + "validators": ["0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1"] + }, "rootstockmainnet": { "validators": ["0x8675eb603d62ab64e3efe90df914e555966e04ac"] }, @@ -293,6 +332,15 @@ "solanamainnet": { "validators": ["0x28464752829b3ea59a497fca0bdff575c534c3ff"] }, + "soneium": { + "validators": ["0xd4b7af853ed6a2bfc329ecef545df90c959cbee8"] + }, + "sonic": { + "validators": ["0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7"] + }, + "soon": { + "validators": ["0x0e6723b3c1ed3db0c24347aa2cf16d28bc2a1f76"] + }, "superseed": { "validators": ["0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88"] }, @@ -308,6 +356,12 @@ "tangle": { "validators": ["0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b"] }, + "telos": { + "validators": ["0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54"] + }, + "torus": { + "validators": ["0x96982a325c28a842bc8cf61b63000737bb9f1f7d"] + }, "treasure": { "validators": ["0x6ad994819185553e8baa01533f0cd2c7cadfe6cc"] }, @@ -329,6 +383,9 @@ "xlayer": { "validators": ["0xa2ae7c594703e988f23d97220717c513db638ea3"] }, + "xpla": { + "validators": ["0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e"] + }, "zeronetwork": { "validators": ["0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87"] }, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/rc.json b/typescript/infra/config/environments/mainnet3/aw-validators/rc.json index 55638fa670..344c4dedd9 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/rc.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/rc.json @@ -97,6 +97,9 @@ "0xe83d36fd00d9ef86243d9f7147b29e98d11df0ee" ] }, + "injective": { + "validators": ["0xca024623ee6fe281639aee91c4390b0c4e053918"] + }, "kroma": { "validators": ["0x9b3142f04dd67585c9287f1aee42ff9754a955d3"] }, @@ -138,6 +141,13 @@ "0xcaa9c6e6efa35e4a8b47565f3ce98845fa638bf3" ] }, + "neutron": { + "validators": [ + "0x307a8fe091b8273c7ce3d277b161b4a2167279b1", + "0xb825c1bd020cb068f477b320f591b32e26814b5b", + "0x0a5b31090d4c3c207b9ea6708f938e328f895fce" + ] + }, "oortmainnet": { "validators": ["0x83f406ff315e90ae9589fa7786bf700e7c7a06f1"] }, @@ -190,6 +200,9 @@ "solanamainnet": { "validators": ["0x7bd1536cb7505cf2ea1dc6744127d91fbe87a2ad"] }, + "stride": { + "validators": ["0x1edadb2330c77769a7e9b48d990289ccdcafa430"] + }, "tangle": { "validators": ["0xd778d113975b2fe45eda424bf93c28f32a90b076"] }, @@ -211,12 +224,5 @@ }, "zetachain": { "validators": ["0xa13d146b47242671466e4041f5fe68d22a2ffe09"] - }, - "neutron": { - "validators": [ - "0x307a8fe091b8273c7ce3d277b161b4a2167279b1", - "0xb825c1bd020cb068f477b320f591b32e26814b5b", - "0x0a5b31090d4c3c207b9ea6708f938e328f895fce" - ] } } diff --git a/typescript/infra/config/environments/mainnet3/chains.ts b/typescript/infra/config/environments/mainnet3/chains.ts index f0d7f66400..7cdc82abd0 100644 --- a/typescript/infra/config/environments/mainnet3/chains.ts +++ b/typescript/infra/config/environments/mainnet3/chains.ts @@ -1,5 +1,5 @@ import { IRegistry } from '@hyperlane-xyz/registry'; -import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk'; +import { ChainMap, ChainMetadata, ChainName } from '@hyperlane-xyz/sdk'; import { getRegistryForEnvironment } from '../../../src/config/chain.js'; import { isEthereumProtocolChain } from '../../../src/utils/utils.js'; @@ -18,14 +18,6 @@ export const chainMetadataOverrides: ChainMap> = { gasPrice: 3 * 10 ** 9, // 3 gwei }, }, - polygon: { - transactionOverrides: { - // A very high max fee per gas is used as Polygon is susceptible - // to large swings in gas prices. - maxFeePerGas: 800 * 10 ** 9, // 800 gwei - maxPriorityFeePerGas: 50 * 10 ** 9, // 50 gwei - }, - }, polygonzkevm: { transactionOverrides: { gasPrice: 1 * 10 ** 9, // 1 gwei @@ -85,12 +77,29 @@ export const chainMetadataOverrides: ChainMap> = { // gasPrice: 20 * 10 ** 9, // 20 gwei // }, // }, + // degenchain: { + // transactionOverrides: { + // maxFeePerGas: 100 * 10 ** 9, // 100 gwei + // maxPriorityFeePerGas: 10 * 10 ** 9, // 10 gwei + // }, + // }, + // polygon: { + // transactionOverrides: { + // // A very high max fee per gas is used as Polygon is susceptible + // // to large swings in gas prices. + // maxFeePerGas: 800 * 10 ** 9, // 800 gwei + // maxPriorityFeePerGas: 50 * 10 ** 9, // 50 gwei + // }, + // }, }; -export const getRegistry = async (useSecrets = true): Promise => +export const getRegistry = async ( + useSecrets = true, + chains: ChainName[] = supportedChainNames, +): Promise => getRegistryForEnvironment( environment, - supportedChainNames, + chains, chainMetadataOverrides, useSecrets, ); diff --git a/typescript/infra/config/environments/mainnet3/core.ts b/typescript/infra/config/environments/mainnet3/core.ts index b0655ae785..eb8315a690 100644 --- a/typescript/infra/config/environments/mainnet3/core.ts +++ b/typescript/infra/config/environments/mainnet3/core.ts @@ -4,9 +4,11 @@ import { AggregationHookConfig, AggregationIsmConfig, ChainMap, + ChainTechnicalStack, CoreConfig, FallbackRoutingHookConfig, HookType, + IgpConfig, IsmType, MerkleTreeHookConfig, MultisigConfig, @@ -20,10 +22,15 @@ import { } from '@hyperlane-xyz/sdk'; import { Address, objMap } from '@hyperlane-xyz/utils'; +import { getChain } from '../../registry.js'; + import { igp } from './igp.js'; import { DEPLOYER, ethereumChainOwners } from './owners.js'; import { supportedChainNames } from './supportedChainNames.js'; +// There are no static ISMs or hooks for zkSync, this means +// that the default ISM is a routing ISM and the default hook +// is a fallback routing hook. export const core: ChainMap = objMap( ethereumChainOwners, (local, owner) => { @@ -33,11 +40,26 @@ export const core: ChainMap = objMap( .map((origin) => [origin, defaultMultisigConfigs[origin]]), ); + const isZksyncChain = + getChain(local).technicalStack === ChainTechnicalStack.ZkSync; + + // zkSync uses a different ISM for the merkle root const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => - multisigConfigToIsmConfig(IsmType.MERKLE_ROOT_MULTISIG, multisig); + multisigConfigToIsmConfig( + isZksyncChain + ? IsmType.STORAGE_MERKLE_ROOT_MULTISIG + : IsmType.MERKLE_ROOT_MULTISIG, + multisig, + ); + // zkSync uses a different ISM for the message ID const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => - multisigConfigToIsmConfig(IsmType.MESSAGE_ID_MULTISIG, multisig); + multisigConfigToIsmConfig( + isZksyncChain + ? IsmType.STORAGE_MESSAGE_ID_MULTISIG + : IsmType.MESSAGE_ID_MULTISIG, + multisig, + ); const routingIsm: RoutingIsmConfig = { type: IsmType.ROUTING, @@ -52,17 +74,30 @@ export const core: ChainMap = objMap( ...owner, }; + // No static aggregation ISM support on zkSync + const defaultZkSyncIsm = (): RoutingIsmConfig => ({ + type: IsmType.ROUTING, + domains: objMap( + originMultisigs, + (_, multisig): MultisigIsmConfig => messageIdIsm(multisig), + ), + ...owner, + }); + const pausableIsm: PausableIsmConfig = { type: IsmType.PAUSABLE, paused: false, owner: DEPLOYER, // keep pausable hot }; - const defaultIsm: AggregationIsmConfig = { - type: IsmType.AGGREGATION, - modules: [routingIsm, pausableIsm], - threshold: 2, - }; + // No static aggregation ISM support on zkSync + const defaultIsm: AggregationIsmConfig | RoutingIsmConfig = isZksyncChain + ? defaultZkSyncIsm() + : { + type: IsmType.AGGREGATION, + modules: [routingIsm, pausableIsm], + threshold: 2, + }; const merkleHook: MerkleTreeHookConfig = { type: HookType.MERKLE_TREE, @@ -75,30 +110,45 @@ export const core: ChainMap = objMap( paused: false, owner: DEPLOYER, // keep pausable hot }; - const aggregationHooks = objMap( + + // No static aggregation hook support on zkSync + const defaultHookDomains = objMap( originMultisigs, - (_origin, _): AggregationHookConfig => ({ - type: HookType.AGGREGATION, - hooks: [pausableHook, merkleHook, igpHook], - }), + (_origin, _): AggregationHookConfig | IgpConfig => { + return isZksyncChain + ? igpHook + : { + type: HookType.AGGREGATION, + hooks: [pausableHook, merkleHook, igpHook], + }; + }, ); + const defaultHook: FallbackRoutingHookConfig = { type: HookType.FALLBACK_ROUTING, ...owner, - domains: aggregationHooks, + domains: defaultHookDomains, fallback: merkleHook, }; if (typeof owner.owner !== 'string') { throw new Error('beneficiary must be a string'); } - const requiredHook: ProtocolFeeHookConfig = { - type: HookType.PROTOCOL_FEE, - maxProtocolFee: ethers.utils.parseUnits('1', 'gwei').toString(), // 1 gwei of native token - protocolFee: BigNumber.from(0).toString(), // 0 wei - beneficiary: owner.owner as Address, // Owner can be AccountConfig - ...owner, - }; + + // No aggregation hook support on zkSync, so we ignore protocolFee + // and make the merkleTreeHook required + const requiredHook: ProtocolFeeHookConfig | MerkleTreeHookConfig = + isZksyncChain + ? { + type: HookType.MERKLE_TREE, + } + : { + type: HookType.PROTOCOL_FEE, + maxProtocolFee: ethers.utils.parseUnits('1', 'gwei').toString(), // 1 gwei of native token + protocolFee: BigNumber.from(0).toString(), // 0 wei + beneficiary: owner.owner as Address, // Owner can be AccountConfig + ...owner, + }; return { defaultIsm, diff --git a/typescript/infra/config/environments/mainnet3/core/verification.json b/typescript/infra/config/environments/mainnet3/core/verification.json index 44f999186b..26870e4077 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -6122,5 +6122,1247 @@ "constructorArguments": "0000000000000000000000009bbdf86b272d224323136e15594fdce487f40ce7", "isProxy": false } + ], + "aurora": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "ProxyAdmin", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "constructorArguments": "000000000000000000000000000000000000000000000000000000004e454152", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa70000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7" + }, + { + "name": "MerkleTreeHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a8a311b69f688c1d9928259d872c31ca0d473642", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E", + "constructorArguments": "000000000000000000000000df178647cab5e0222f4b53c57274fd2a03beaed60000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6" + }, + { + "name": "ProtocolFee", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x426a3CE72C1586b1867F9339550371E86DB3e396", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39", + "isProxy": false + } + ], + "corn": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000001406f40", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000dc1508844b99c606e16c2ae87f33c373edd4b0f6", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "0000000000000000000000009e8b689e83d929cb8c2d9166e55319a4e6aa83b70000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7" + }, + { + "name": "ProtocolFee", + "address": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "conwai": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000a33fc", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000dc1508844b99c606e16c2ae87f33c373edd4b0f6", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "0000000000000000000000009e8b689e83d929cb8c2d9166e55319a4e6aa83b70000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7" + }, + { + "name": "ProtocolFee", + "address": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "telos": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000028", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000dc1508844b99c606e16c2ae87f33c373edd4b0f6", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "0000000000000000000000009e8b689e83d929cb8c2d9166e55319a4e6aa83b70000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7" + }, + { + "name": "ProtocolFee", + "address": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "arthera": [ + { + "name": "ProxyAdmin", + "address": "0x03cF708E42C89623bd83B281A56935cB562b9258", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xC831271c1fB212012811a91Dd43e5926C1020563", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000002802", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x473884010F0C1742DA8Ad01E7E295624B931076b", + "constructorArguments": "000000000000000000000000c831271c1fb212012811a91dd43e5926c102056300000000000000000000000003cf708e42c89623bd83b281a56935cb562b925800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xC831271c1fB212012811a91Dd43e5926C1020563" + }, + { + "name": "MerkleTreeHook", + "address": "0xdA629E1B79e3420ECd1e80571aDd6a4a3b13AE79", + "constructorArguments": "000000000000000000000000473884010f0c1742da8ad01e7e295624b931076b", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x1fbcCdc677c10671eE50b46C61F0f7d135112450", + "constructorArguments": "000000000000000000000000473884010f0c1742da8ad01e7e295624b931076b000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000da629e1b79e3420ecd1e80571add6a4a3b13ae79", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xe93f2f409ad8B5000431D234472973fe848dcBEC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x8d9Bd7E9ec3cd799a659EE650DfF6C799309fA91", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x2f4Eb04189e11Af642237Da62d163Ab714614498", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xFb7D175d6F53800D68D32C3Fe1416807A394cC24", + "constructorArguments": "0000000000000000000000002f4eb04189e11af642237da62d163ab71461449800000000000000000000000003cf708e42c89623bd83b281a56935cb562b925800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x2f4Eb04189e11Af642237Da62d163Ab714614498" + }, + { + "name": "ProtocolFee", + "address": "0x33AA12b4e8E79cA551Ca9D1F2eC7d2cE02129dd4", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xEe9E0FB6f43913aDBbe5bf89073F4BA590AB8184", + "constructorArguments": "000000000000000000000000473884010f0c1742da8ad01e7e295624b931076b", + "isProxy": false + } + ], + "ink": [ + { + "name": "ProxyAdmin", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000def1", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa70000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7" + }, + { + "name": "MerkleTreeHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a8a311b69f688c1d9928259d872c31ca0d473642", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E", + "constructorArguments": "000000000000000000000000df178647cab5e0222f4b53c57274fd2a03beaed60000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6" + }, + { + "name": "ProtocolFee", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x426a3CE72C1586b1867F9339550371E86DB3e396", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39", + "isProxy": false + } + ], + "evmos": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000002329", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000dc1508844b99c606e16c2ae87f33c373edd4b0f6", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "0000000000000000000000009e8b689e83d929cb8c2d9166e55319a4e6aa83b70000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7" + }, + { + "name": "ProtocolFee", + "address": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "form": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000001de", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000dc1508844b99c606e16c2ae87f33c373edd4b0f6", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "0000000000000000000000009e8b689e83d929cb8c2d9166e55319a4e6aa83b70000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7" + }, + { + "name": "ProtocolFee", + "address": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "sonic": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000092", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000dc1508844b99c606e16c2ae87f33c373edd4b0f6", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "0000000000000000000000009e8b689e83d929cb8c2d9166e55319a4e6aa83b70000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7" + }, + { + "name": "ProtocolFee", + "address": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "soneium": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000074c", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000dc1508844b99c606e16c2ae87f33c373edd4b0f6", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "0000000000000000000000009e8b689e83d929cb8c2d9166e55319a4e6aa83b70000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7" + }, + { + "name": "ProtocolFee", + "address": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "conflux": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000406", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000dc1508844b99c606e16c2ae87f33c373edd4b0f6", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0xA8A311B69f688c1D9928259D872C31ca0d473642", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", + "constructorArguments": "0000000000000000000000009e8b689e83d929cb8c2d9166e55319a4e6aa83b70000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7" + }, + { + "name": "ProtocolFee", + "address": "0x5DdFCA27f9a308c1429A010C4daB291b5534a297", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x84444cE490233CFa76E3F1029bc166aa8c266907", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "rivalz": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000002f1", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000001c6f404800ba49ed581af734ea0d25c0c7d017b2", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", + "constructorArguments": "0000000000000000000000005e8a0fcc0d1df583322943e01f02cb243e5300f60000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6" + }, + { + "name": "ProtocolFee", + "address": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "torus": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000005208", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000001c6f404800ba49ed581af734ea0d25c0c7d017b2", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", + "constructorArguments": "0000000000000000000000005e8a0fcc0d1df583322943e01f02cb243e5300f60000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6" + }, + { + "name": "ProtocolFee", + "address": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "artela": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000002e2c", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000007b032cbb00ad7438e802a66d8b64761a06e5df22", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "constructorArguments": "000000000000000000000000028b04386031b9648a8d78d06c58f6e763be5cd00000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0" + }, + { + "name": "ProtocolFee", + "address": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "guru": [ + { + "name": "ProxyAdmin", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000104", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E" + }, + { + "name": "MerkleTreeHook", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b", + "constructorArguments": "000000000000000000000000f457d831d9f55e87b2f0b35ad6d033fd6b4181ed000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed" + }, + { + "name": "ProtocolFee", + "address": "0xff72A726Ce261846f2dF6F32113e514b5Ddb0E37", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7", + "isProxy": false + } + ], + "xpla": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000025", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "InterchainGasPaymaster", + "address": "0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "constructorArguments": "000000000000000000000000e885941af52eab9e7f4c67392eacd96ea2a65d9b0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B" + }, + { + "name": "ProtocolFee", + "address": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "nero": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000699", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000007b032cbb00ad7438e802a66d8b64761a06e5df22", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "constructorArguments": "000000000000000000000000028b04386031b9648a8d78d06c58f6e763be5cd00000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0" + }, + { + "name": "ProtocolFee", + "address": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "hemi": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000a867", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000007b032cbb00ad7438e802a66d8b64761a06e5df22", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "constructorArguments": "000000000000000000000000028b04386031b9648a8d78d06c58f6e763be5cd00000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0" + }, + { + "name": "ProtocolFee", + "address": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } ] } diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index 74f624ed72..1e764c6707 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'a7f3967-20241205-163749', + tag: 'dc89eb1-20250110-113045', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron @@ -26,14 +26,18 @@ export const keyFunderConfig: KeyFunderConfig< }, // desired balance config, must be set for each chain desiredBalancePerChain: { + // acala: '5', ancient8: '0.5', alephzeroevmmainnet: '100', apechain: '50', appchain: '0.05', arbitrum: '0.5', arbitrumnova: '0.05', + artela: '2', + arthera: '0.1', astar: '100', astarzkevm: '0.05', + aurora: '0.05', flame: '1', avalanche: '5', b3: '0.05', @@ -44,10 +48,13 @@ export const keyFunderConfig: KeyFunderConfig< boba: '0.05', bsc: '5', bsquared: '0.002', - celo: '3', + celo: '4', cheesechain: '50', chilizmainnet: '200', + conflux: '100', + conwai: '5000', coredao: '25', + corn: '0.001', cyber: '0.05', degenchain: '100', dogechain: '100', @@ -55,19 +62,25 @@ export const keyFunderConfig: KeyFunderConfig< endurance: '20', ethereum: '0.5', everclear: '0.05', + evmos: '500', fantom: '100', flare: '500', flowmainnet: '5', + form: '0.05', + // fractal: '500', fraxtal: '0.2', fusemainnet: '20', gnosis: '5', gravity: '500', + guru: '100', harmony: '500', + hemi: '0.05', immutablezkevmmainnet: '25', inevm: '3', + ink: '0.05', kaia: '250', kroma: '0.05', - linea: '0.2', + linea: '1', lisk: '0.05', lukso: '20', lumia: '1', @@ -80,33 +93,40 @@ export const keyFunderConfig: KeyFunderConfig< mint: '0.05', mode: '0.2', molten: '3', - moonbeam: '5', - morph: '0.05', + moonbeam: '100', + morph: '0.1', + nero: '5', oortmainnet: '2000', optimism: '0.5', orderly: '0.05', - polygon: '20', + polygon: '40', polygonzkevm: '0.5', polynomialfi: '0.05', - prom: '5', + prom: '18', proofofplay: '0.05', rarichain: '0.05', real: '0.1', redstone: '0.2', + rivalz: '0.05', rootstockmainnet: '0.002', sanko: '2', scroll: '0.5', sei: '50', shibarium: '50', snaxchain: '0.05', + soneium: '0.05', + sonic: '0.5', // ignore non-evm chains stride: '0', + // subtensor: '0.05', superseed: '0.05', superpositionmainnet: '0.05', swell: '0.05', taiko: '0.2', tangle: '2', - treasure: '100', + telos: '100', + torus: '5', + treasure: '900', unichain: '0.05', // temporarily low until we're able to fund more vana: '0.001', @@ -114,6 +134,7 @@ export const keyFunderConfig: KeyFunderConfig< worldchain: '0.2', xai: '20', xlayer: '0.5', + xpla: '100', zeronetwork: '0.05', zetachain: '20', zircuit: '0.02', @@ -126,6 +147,7 @@ export const keyFunderConfig: KeyFunderConfig< osmosis: '0', solanamainnet: '0', eclipsemainnet: '0', + soon: '0', }, // if not set, keyfunder defaults to 0 desiredKathyBalancePerChain: { @@ -181,6 +203,7 @@ export const keyFunderConfig: KeyFunderConfig< osmosis: '0', eclipsemainnet: '0', solanamainnet: '0', + soon: '0', }, // if not set, keyfunder defaults to using desired balance * 0.2 as the threshold igpClaimThresholdPerChain: { @@ -236,5 +259,6 @@ export const keyFunderConfig: KeyFunderConfig< osmosis: '0', eclipsemainnet: '0', solanamainnet: '0', + soon: '0', }, }; diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index 1c5f05b28a..5703d9e54f 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -1,4 +1,8 @@ { + "acala": { + "amount": "100.007736839", + "decimals": 9 + }, "ancient8": { "amount": "0.001000252", "decimals": 9 @@ -16,19 +20,31 @@ "decimals": 9 }, "arbitrum": { - "amount": "0.123544", + "amount": "0.017143", "decimals": 9 }, "arbitrumnova": { "amount": "0.01", "decimals": 9 }, + "artela": { + "amount": "27.5", + "decimals": 9 + }, + "arthera": { + "amount": "1.025069", + "decimals": 9 + }, "astar": { "amount": "779.371350051", "decimals": 9 }, "astarzkevm": { - "amount": "0.0988", + "amount": "0.165", + "decimals": 9 + }, + "aurora": { + "amount": "0.07", "decimals": 9 }, "flame": { @@ -36,11 +52,11 @@ "decimals": 9 }, "avalanche": { - "amount": "27.735398516", + "amount": "25.000000001", "decimals": 9 }, "b3": { - "amount": "0.001000253", + "amount": "0.001000252", "decimals": 9 }, "base": { @@ -60,7 +76,7 @@ "decimals": 9 }, "boba": { - "amount": "0.001000059", + "amount": "0.001000071", "decimals": 9 }, "bsc": { @@ -83,10 +99,22 @@ "amount": "5000.0", "decimals": 9 }, + "conflux": { + "amount": "20.0", + "decimals": 9 + }, + "conwai": { + "amount": "0.01", + "decimals": 9 + }, "coredao": { "amount": "30.0", "decimals": 9 }, + "corn": { + "amount": "0.0005", + "decimals": 9 + }, "cyber": { "amount": "0.001000252", "decimals": 9 @@ -112,25 +140,33 @@ "decimals": 9 }, "ethereum": { - "amount": "30.088451558", + "amount": "20.047740244", "decimals": 9 }, "everclear": { "amount": "0.1", "decimals": 9 }, + "evmos": { + "amount": "27.5", + "decimals": 9 + }, "fantom": { - "amount": "6.971582929", + "amount": "8.444088778", "decimals": 9 }, "flare": { - "amount": "25.0", + "amount": "25.932675252", "decimals": 9 }, "flowmainnet": { "amount": "0.1", "decimals": 9 }, + "form": { + "amount": "0.001000252", + "decimals": 9 + }, "fraxtal": { "amount": "0.001000253", "decimals": 9 @@ -147,10 +183,18 @@ "amount": "1800.0", "decimals": 9 }, + "guru": { + "amount": "0.001000252", + "decimals": 9 + }, "harmony": { "amount": "100.0", "decimals": 9 }, + "hemi": { + "amount": "0.001000252", + "decimals": 9 + }, "immutablezkevmmainnet": { "amount": "11.00000005", "decimals": 9 @@ -159,6 +203,10 @@ "amount": "0.1", "decimals": 9 }, + "ink": { + "amount": "0.001000252", + "decimals": 9 + }, "injective": { "amount": "700000000", "decimals": 1 @@ -172,11 +220,11 @@ "decimals": 9 }, "linea": { - "amount": "0.548523195", + "amount": "0.67121914", "decimals": 9 }, "lisk": { - "amount": "0.001001147", + "amount": "0.016350221", "decimals": 9 }, "lukso": { @@ -192,7 +240,7 @@ "decimals": 9 }, "mantapacific": { - "amount": "0.003000983", + "amount": "0.003000336", "decimals": 9 }, "mantle": { @@ -208,7 +256,7 @@ "decimals": 9 }, "metis": { - "amount": "1.105835936", + "amount": "1.30558024", "decimals": 9 }, "mint": { @@ -216,7 +264,7 @@ "decimals": 9 }, "mode": { - "amount": "0.001001363", + "amount": "0.001000252", "decimals": 9 }, "molten": { @@ -231,6 +279,10 @@ "amount": "0.201", "decimals": 9 }, + "nero": { + "amount": "1.000000007", + "decimals": 9 + }, "neutron": { "amount": "0.0053", "decimals": 1 @@ -240,7 +292,7 @@ "decimals": 9 }, "optimism": { - "amount": "0.001000469", + "amount": "0.001159749", "decimals": 9 }, "orderly": { @@ -256,7 +308,7 @@ "decimals": 9 }, "polygonzkevm": { - "amount": "0.451", + "amount": "0.48", "decimals": 9 }, "polynomialfi": { @@ -264,7 +316,7 @@ "decimals": 9 }, "prom": { - "amount": "51.9", + "amount": "130.0", "decimals": 9 }, "proofofplay": { @@ -283,6 +335,10 @@ "amount": "0.00010005", "decimals": 9 }, + "rivalz": { + "amount": "0.01", + "decimals": 9 + }, "rootstockmainnet": { "amount": "0.07", "decimals": 9 @@ -296,11 +352,11 @@ "decimals": 9 }, "sei": { - "amount": "3.328028877", + "amount": "7.41885212", "decimals": 9 }, "shibarium": { - "amount": "5.040876434", + "amount": "11.93032412", "decimals": 9 }, "snaxchain": { @@ -311,10 +367,26 @@ "amount": "0.5", "decimals": 1 }, + "soneium": { + "amount": "0.001000251", + "decimals": 9 + }, + "sonic": { + "amount": "5.5", + "decimals": 9 + }, + "soon": { + "amount": "0.0000001", + "decimals": 1 + }, "stride": { "amount": "0.005", "decimals": 1 }, + "subtensor": { + "amount": "10.0", + "decimals": 9 + }, "superseed": { "amount": "0.001000252", "decimals": 9 @@ -335,8 +407,16 @@ "amount": "1.0", "decimals": 9 }, + "telos": { + "amount": "522.109974741", + "decimals": 9 + }, + "torus": { + "amount": "31.25", + "decimals": 9 + }, "treasure": { - "amount": "702.999550885", + "amount": "1601.935300783", "decimals": 9 }, "unichain": { @@ -344,7 +424,7 @@ "decimals": 9 }, "vana": { - "amount": "0.002986", + "amount": "0.312673957", "decimals": 9 }, "viction": { @@ -352,7 +432,7 @@ "decimals": 9 }, "worldchain": { - "amount": "0.001000255", + "amount": "0.001000345", "decimals": 9 }, "xai": { @@ -360,11 +440,15 @@ "decimals": 9 }, "xlayer": { - "amount": "23.05", + "amount": "23.5", + "decimals": 9 + }, + "xpla": { + "amount": "280.0", "decimals": 9 }, "zeronetwork": { - "amount": "0.04525", + "amount": "0.06", "decimals": 9 }, "zetachain": { diff --git a/typescript/infra/config/environments/mainnet3/helloworld.ts b/typescript/infra/config/environments/mainnet3/helloworld.ts index 566bbbac12..d65da8141e 100644 --- a/typescript/infra/config/environments/mainnet3/helloworld.ts +++ b/typescript/infra/config/environments/mainnet3/helloworld.ts @@ -13,7 +13,7 @@ export const hyperlane: HelloWorldConfig = { kathy: { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '857338e-20240716-165320', + tag: '7e520fb-20241215-234731', }, chainsToSkip: [], runEnv: environment, @@ -33,7 +33,7 @@ export const releaseCandidate: HelloWorldConfig = { kathy: { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '857338e-20240716-165320', + tag: '7e520fb-20241215-234731', }, chainsToSkip: [], runEnv: environment, diff --git a/typescript/infra/config/environments/mainnet3/igp.ts b/typescript/infra/config/environments/mainnet3/igp.ts index 2b388afdd2..5c2dfd6efc 100644 --- a/typescript/infra/config/environments/mainnet3/igp.ts +++ b/typescript/infra/config/environments/mainnet3/igp.ts @@ -1,6 +1,7 @@ import { ChainMap, ChainName, + ChainTechnicalStack, HookType, IgpConfig, getTokenExchangeRateFromValues, @@ -14,6 +15,7 @@ import { getOverhead, } from '../../../src/config/gas-oracle.js'; import { mustGetChainNativeToken } from '../../../src/utils/utils.js'; +import { getChain } from '../../registry.js'; import { ethereumChainNames } from './chains.js'; import gasPrices from './gasPrices.json'; @@ -25,9 +27,15 @@ const tokenPrices: ChainMap = rawTokenPrices; export function getOverheadWithOverrides(local: ChainName, remote: ChainName) { let overhead = getOverhead(local, remote, ethereumChainNames); - if (remote === 'moonbeam') { + // Moonbeam/Torus gas usage can be up to 4x higher than vanilla EVM + if (remote === 'moonbeam' || remote === 'torus') { overhead *= 4; } + // ZkSync gas usage is different from the EVM and tends to give high + // estimates. We double the overhead to help account for this. + if (getChain(remote).technicalStack === ChainTechnicalStack.ZkSync) { + overhead *= 2; + } return overhead; } diff --git a/typescript/infra/config/environments/mainnet3/index.ts b/typescript/infra/config/environments/mainnet3/index.ts index d2061134f7..ca7806f443 100644 --- a/typescript/infra/config/environments/mainnet3/index.ts +++ b/typescript/infra/config/environments/mainnet3/index.ts @@ -32,15 +32,18 @@ export const environment: EnvironmentConfig = { role: Role = Role.Deployer, useSecrets?: boolean, chains?: ChainName[], - ) => - getMultiProviderForRole( + ) => { + const providerChains = + chains && chains.length > 0 ? chains : supportedChainNames; + return getMultiProviderForRole( environmentName, - chains && chains.length > 0 ? chains : supportedChainNames, - await getRegistry(useSecrets), + providerChains, + await getRegistry(useSecrets, providerChains), context, role, undefined, - ), + ); + }, getKeys: ( context: Contexts = Contexts.Hyperlane, role: Role = Role.Deployer, diff --git a/typescript/infra/config/environments/mainnet3/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index 5cceb318f4..6c875f658c 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -7690,5 +7690,1565 @@ "constructorArguments": "", "isProxy": true } + ], + "corn": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "conwai": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "telos": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "arthera": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x21005c99F1222f3B7182f3111D1F3753f826B9fE", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0xDa7cECb05C4aeB02c1aFDE277d4306a2da7Bd762", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0x504e5f4694C252C9E0CD10bbEa39763582cD23Bb", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x7E556A80da4F019d38C2e4497694c8fa26513B52", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0x46fa3A5780e5B90Eaf34BDED554d5353B5ABE9E7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x3359298F25e7CF2426720FCCAdbaF47037Abe5e9", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x29B37088724B745C0ABcE591449Cf042772160C2", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0xD7ca12DF39C94281144f68123E36DF5874Ef4FFd", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0xb22E72F31924b7bA11ff01Ae5014cd41B135Af49", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0xCB9f90EE5d83Ea52ABd922BD70898f0155D54798", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x23AD9FF8b97CA75115b91D61ceBd15B833f79f79", + "constructorArguments": "", + "isProxy": true + } + ], + "ink": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x7f51A658837A315134A97ff8B586d71B726B7e61", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0xDFF18Bf286c9cDd0fC653a28616460Cf7443F8EF", + "constructorArguments": "", + "isProxy": true + } + ], + "form": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "sonic": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "soneium": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "conflux": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "evmos": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "aurora": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "rivalz": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "torus": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "artela": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "nero": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "guru": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x7f51A658837A315134A97ff8B586d71B726B7e61", + "constructorArguments": "", + "isProxy": true + } + ], + "hemi": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "xpla": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } ] } diff --git a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json index 07944e2a41..d6951a2ec2 100644 --- a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json +++ b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json @@ -1869,5 +1869,383 @@ "isProxy": true, "expectedimplementation": "0xAE557e108b3336130370aC74836f1356B4b30Cf2" } + ], + "corn": [ + { + "name": "InterchainAccountIsm", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000003881c3e945cbb89ae67c43e82f570badf1c6ea940000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94" + } + ], + "conwai": [ + { + "name": "InterchainAccountIsm", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000003881c3e945cbb89ae67c43e82f570badf1c6ea940000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94" + } + ], + "rivalz": [ + { + "name": "InterchainAccountIsm", + "address": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", + "constructorArguments": "0000000000000000000000005da60220c5dde35b7ae91c042ff5979047fa07850000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d64d126941eac2cf53e0e4e8146cc70449b60d73000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785" + } + ], + "telos": [ + { + "name": "InterchainAccountIsm", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", + "constructorArguments": "00000000000000000000000093d41e41ca545a35a81d11b08d2ee8b852c768df0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df" + } + ], + "arthera": [ + { + "name": "InterchainAccountIsm", + "address": "0xf9609bB22847e0DB5F6fB8f95b84D25A19b46ac5", + "constructorArguments": "000000000000000000000000473884010f0c1742da8ad01e7e295624b931076b", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0xbBc1bd54a03d87e7aDE2089be2090cA5731A44B8", + "constructorArguments": "000000000000000000000000473884010f0c1742da8ad01e7e295624b931076b", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29", + "constructorArguments": "000000000000000000000000bbc1bd54a03d87e7ade2089be2090ca5731a44b800000000000000000000000003cf708e42c89623bd83b281a56935cb562b925800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9609bb22847e0db5f6fb8f95b84d25a19b46ac5000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xbBc1bd54a03d87e7aDE2089be2090cA5731A44B8" + } + ], + "sonic": [ + { + "name": "InterchainAccountIsm", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000003881c3e945cbb89ae67c43e82f570badf1c6ea940000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94" + } + ], + "soneium": [ + { + "name": "InterchainAccountIsm", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000003881c3e945cbb89ae67c43e82f570badf1c6ea940000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94" + } + ], + "evmos": [ + { + "name": "InterchainAccountIsm", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000003881c3e945cbb89ae67c43e82f570badf1c6ea940000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94" + } + ], + "form": [ + { + "name": "InterchainAccountIsm", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000003881c3e945cbb89ae67c43e82f570badf1c6ea940000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94" + } + ], + "aurora": [ + { + "name": "InterchainAccountIsm", + "address": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x021D2810a758c833080DEc2F1Fa8F571Aae97D45", + "constructorArguments": "000000000000000000000000c2466492c451e1ae49d8c874bb9f89293aaad59b0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f457d831d9f55e87b2f0b35ad6d033fd6b4181ed000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b" + } + ], + "conflux": [ + { + "name": "InterchainAccountIsm", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "constructorArguments": "000000000000000000000000028b04386031b9648a8d78d06c58f6e763be5cd00000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093d41e41ca545a35a81d11b08d2ee8b852c768df000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0" + } + ], + "ink": [ + { + "name": "InterchainAccountIsm", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", + "constructorArguments": "00000000000000000000000093d41e41ca545a35a81d11b08d2ee8b852c768df0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060515f328b2c55df63f456d9d839a0082892def8000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df" + } + ], + "torus": [ + { + "name": "InterchainAccountIsm", + "address": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", + "constructorArguments": "0000000000000000000000005da60220c5dde35b7ae91c042ff5979047fa07850000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d64d126941eac2cf53e0e4e8146cc70449b60d73000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785" + } + ], + "artela": [ + { + "name": "InterchainAccountIsm", + "address": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB", + "constructorArguments": "000000000000000000000000b201817dfdd822b75fa9b595457e6ee466a7c1870000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000002351fbe24c1212f253b7a300ff0cbcfd97952a19000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187" + } + ], + "nero": [ + { + "name": "InterchainAccountIsm", + "address": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "constructorArguments": "0000000000000000000000008f23872dab3b166cef411eeb6c391ff6ce4195320000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009629c28990f11c31735765a6fd59e1e1bc197dbd000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532" + } + ], + "guru": [ + { + "name": "InterchainAccountIsm", + "address": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187", + "constructorArguments": "0000000000000000000000007937cb2886f01f38210506491a69b0d107ea0ad9000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f23872dab3b166cef411eeb6c391ff6ce419532000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9" + } + ], + "xpla": [ + { + "name": "InterchainAccountIsm", + "address": "0xE350143242a2F7962F23D71ee9Dd98f6e86D1772", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0xa8a750e0Ac90B3f6C05b11F3C0D7D5372cD1a90e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x5B24EE24049582fF74c1d311d72c70bA5B76a554", + "constructorArguments": "000000000000000000000000a8a750e0ac90b3f6c05b11f3c0d7d5372cd1a90e0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e350143242a2f7962f23d71ee9dd98f6e86d1772000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xa8a750e0Ac90B3f6C05b11F3C0D7D5372cD1a90e" + } + ], + "hemi": [ + { + "name": "InterchainAccountIsm", + "address": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", + "constructorArguments": "0000000000000000000000002351fbe24c1212f253b7a300ff0cbcfd97952a190000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000007937cb2886f01f38210506491a69b0d107ea0ad9000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19" + } ] } diff --git a/typescript/infra/config/environments/mainnet3/owners.ts b/typescript/infra/config/environments/mainnet3/owners.ts index 5b495d316f..27d3d5915c 100644 --- a/typescript/infra/config/environments/mainnet3/owners.ts +++ b/typescript/infra/config/environments/mainnet3/owners.ts @@ -62,7 +62,7 @@ export const safes: ChainMap

= { export const icaOwnerChain = 'ethereum'; // Found by running: -// yarn tsx ./scripts/get-owner-ica.ts -e mainnet3 --ownerChain ethereum --destinationChains ... +// yarn tsx ./scripts/keys/get-owner-ica.ts -e mainnet3 --ownerChain ethereum --destinationChains ... export const icas: Partial< Record<(typeof supportedChainNames)[number], Address> > = { @@ -173,6 +173,21 @@ export const icas: Partial< // swell: '0xff8326468e7AaB51c53D3569cf7C45Dd54c11687', // already has a safe lumiaprism: '0xAFfA863646D1bC74ecEC0dB1070f069Af065EBf5', appchain: '0x4F25DFFd10A6D61C365E1a605d07B2ab0E82A7E6', + + // Dec 13, 2024 batch + // ---------------------------------------------------------- + arthera: '0x962e4E5F5e47e1Ab5361eE0B5108Ebeb9Fa5c99B', + aurora: '0x853f40c807cbb08EDd19B326b9b6A669bf3c274c', + conflux: '0xac8f0e306A126312C273080d149ca01d461603FE', + conwai: '0x5926599B8Aff45f1708b804B30213babdAD78C83', + corn: '0x5926599B8Aff45f1708b804B30213babdAD78C83', + evmos: '0x5926599B8Aff45f1708b804B30213babdAD78C83', + form: '0x5926599B8Aff45f1708b804B30213babdAD78C83', + ink: '0xDde4Ce691d1c0579d48BCdd3491aA71472b6cC38', + rivalz: '0xc1e20A0D78E79B94D71d4bDBC8FD0Af7c856Dd7A', + soneium: '0x5926599B8Aff45f1708b804B30213babdAD78C83', + sonic: '0x5926599B8Aff45f1708b804B30213babdAD78C83', + telos: '0xDde4Ce691d1c0579d48BCdd3491aA71472b6cC38', } as const; export const DEPLOYER = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; @@ -228,4 +243,7 @@ export const chainOwners: ChainMap = { osmosis: { owner: 'n/a - nothing owned here', }, + soon: { + owner: 'n/a - nothing owned here', + }, }; diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index 0b86151222..c3d31269a9 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -1,14 +1,18 @@ // These chains may be any protocol type. // Placing them here instead of adjacent chains file to avoid circular dep export const mainnet3SupportedChainNames = [ + // 'acala', 'ancient8', 'alephzeroevmmainnet', 'apechain', 'appchain', 'arbitrum', 'arbitrumnova', + 'artela', + 'arthera', 'astar', 'astarzkevm', + 'aurora', 'flame', 'avalanche', 'b3', @@ -22,7 +26,10 @@ export const mainnet3SupportedChainNames = [ 'celo', 'cheesechain', 'chilizmainnet', + 'conflux', + 'conwai', 'coredao', + 'corn', 'cyber', 'degenchain', 'dogechain', @@ -31,16 +38,22 @@ export const mainnet3SupportedChainNames = [ 'endurance', 'ethereum', 'everclear', + 'evmos', 'fantom', 'flare', 'flowmainnet', + 'form', + // 'fractal', 'fraxtal', 'fusemainnet', 'gnosis', 'gravity', + 'guru', 'harmony', + 'hemi', 'immutablezkevmmainnet', 'inevm', + 'ink', 'injective', 'kaia', 'kroma', @@ -59,6 +72,7 @@ export const mainnet3SupportedChainNames = [ 'molten', 'moonbeam', 'morph', + 'nero', 'neutron', 'oortmainnet', 'optimism', @@ -72,6 +86,7 @@ export const mainnet3SupportedChainNames = [ 'rarichain', 'real', 'redstone', + 'rivalz', 'rootstockmainnet', 'sanko', 'scroll', @@ -79,12 +94,18 @@ export const mainnet3SupportedChainNames = [ 'shibarium', 'snaxchain', 'solanamainnet', + 'soneium', + 'sonic', + 'soon', 'stride', + // 'subtensor', 'superseed', 'superpositionmainnet', 'swell', 'taiko', 'tangle', + 'telos', + 'torus', 'treasure', 'unichain', 'vana', @@ -92,6 +113,7 @@ export const mainnet3SupportedChainNames = [ 'worldchain', 'xai', 'xlayer', + 'xpla', 'zeronetwork', 'zetachain', 'zircuit', diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 9567a31775..4782b19b88 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,99 +1,120 @@ { - "ancient8": "3849.95", - "alephzeroevmmainnet": "0.563568", - "apechain": "1.66", - "appchain": "3849.95", - "arbitrum": "3849.95", - "arbitrumnova": "3849.95", - "astar": "0.078825", - "astarzkevm": "3849.95", - "flame": "7.62", - "avalanche": "49.4", - "b3": "3849.95", - "base": "3849.95", - "bitlayer": "98047", - "blast": "3849.95", - "bob": "3849.95", - "boba": "3849.95", - "bsc": "714.94", - "bsquared": "98047", - "celo": "0.916567", - "cheesechain": "0.0015485", - "chilizmainnet": "0.119182", - "coredao": "1.42", - "cyber": "3849.95", - "degenchain": "0.01880045", - "dogechain": "0.429424", - "duckchain": "6.4", - "eclipsemainnet": "3849.95", - "endurance": "3.21", - "ethereum": "3849.95", - "everclear": "3849.95", - "fantom": "1.23", - "flare": "0.02912373", - "flowmainnet": "1.048", - "fraxtal": "3847.8", - "fusemainnet": "0.04124996", + "acala": "0.089653", + "ancient8": "3322.32", + "alephzeroevmmainnet": "0.304513", + "apechain": "1.12", + "appchain": "3322.32", + "arbitrum": "3322.32", + "arbitrumnova": "3322.32", + "artela": "1", + "arthera": "0.04381619", + "astar": "0.060902", + "astarzkevm": "3322.32", + "aurora": "3322.32", + "flame": "4.68", + "avalanche": "37.35", + "b3": "3322.32", + "base": "3322.32", + "bitlayer": "94486", + "blast": "3322.32", + "bob": "3322.32", + "boba": "3322.32", + "bsc": "697.34", + "bsquared": "94486", + "celo": "0.654458", + "cheesechain": "0.00095089", + "chilizmainnet": "0.083892", + "conflux": "0.150607", + "conwai": "0.00386317", + "coredao": "1.035", + "corn": "94486", + "cyber": "3322.32", + "degenchain": "0.01036196", + "dogechain": "0.334068", + "duckchain": "5.27", + "eclipsemainnet": "3322.32", + "endurance": "1.85", + "ethereum": "3322.32", + "everclear": "3322.32", + "evmos": "0.02100258", + "fantom": "0.657886", + "flare": "0.02377977", + "flowmainnet": "0.74421", + "form": "3322.32", + "fraxtal": "3305.2", + "fusemainnet": "0.02815644", "gnosis": "1.001", - "gravity": "0.03951512", - "harmony": "0.03939191", - "immutablezkevmmainnet": "1.89", - "inevm": "30.43", - "injective": "30.43", - "kaia": "0.282109", - "kroma": "3849.95", - "linea": "3849.95", - "lisk": "3849.95", - "lukso": "2.81", - "lumia": "2.25", - "lumiaprism": "2.25", - "mantapacific": "3849.95", - "mantle": "1.13", - "merlin": "99320", - "metal": "3849.95", - "metis": "59.74", - "mint": "3849.95", - "mode": "3849.95", - "molten": "0.382952", - "moonbeam": "0.345164", - "morph": "3849.95", - "neutron": "0.571583", - "oortmainnet": "0.22645", - "optimism": "3849.95", - "orderly": "3849.95", - "osmosis": "0.699208", - "polygon": "0.633271", - "polygonzkevm": "3849.95", - "polynomialfi": "3849.95", - "prom": "7.16", - "proofofplay": "3849.95", - "rarichain": "3849.95", - "real": "1", - "redstone": "3849.95", - "rootstockmainnet": "98004", - "sanko": "58.27", - "scroll": "3849.95", - "sei": "0.625869", - "shibarium": "0.670964", - "snaxchain": "3849.95", - "solanamainnet": "226.39", - "stride": "0.779753", - "superseed": "3849.95", - "superpositionmainnet": "3849.95", - "swell": "3849.95", - "taiko": "3849.95", + "gravity": "0.03240489", + "guru": "0.01323541", + "harmony": "0.0248972", + "hemi": "3322.32", + "immutablezkevmmainnet": "1.27", + "inevm": "21.94", + "ink": "3322.32", + "injective": "21.94", + "kaia": "0.208261", + "kroma": "3322.32", + "linea": "3322.32", + "lisk": "3322.32", + "lukso": "2.04", + "lumia": "1.36", + "lumiaprism": "1.18", + "mantapacific": "3322.32", + "mantle": "1.18", + "merlin": "94299", + "metal": "3322.32", + "metis": "39.11", + "mint": "3322.32", + "mode": "3322.32", + "molten": "0.774347", + "moonbeam": "0.229674", + "morph": "3322.32", + "nero": "1", + "neutron": "0.342006", + "oortmainnet": "0.141167", + "optimism": "3322.32", + "orderly": "3322.32", + "osmosis": "0.477102", + "polygon": "0.461528", + "polygonzkevm": "3322.32", + "polynomialfi": "3322.32", + "prom": "5.48", + "proofofplay": "3322.32", + "rarichain": "3322.32", + "real": "3322.32", + "redstone": "3322.32", + "rivalz": "3322.32", + "rootstockmainnet": "92811", + "sanko": "38.08", + "scroll": "3322.32", + "sei": "0.389316", + "shibarium": "0.449375", + "snaxchain": "3322.32", + "solanamainnet": "192.63", + "soneium": "3322.32", + "sonic": "0.657886", + "soon": "3322.32", + "stride": "0.559038", + "subtensor": "464.53", + "superseed": "3322.32", + "superpositionmainnet": "3322.32", + "swell": "3322.32", + "taiko": "3322.32", "tangle": "1", - "treasure": "0.638598", - "unichain": "3849.95", - "vana": "1", - "viction": "0.50166", - "worldchain": "3849.95", - "xai": "0.368066", - "xlayer": "56.38", - "zeronetwork": "3849.95", - "zetachain": "0.805386", - "zircuit": "3849.95", - "zklink": "3849.95", - "zksync": "3849.95", - "zoramainnet": "3849.95" + "telos": "0.198429", + "torus": "1", + "treasure": "0.487988", + "unichain": "3322.32", + "vana": "14.29", + "viction": "0.387143", + "worldchain": "3322.32", + "xai": "0.214185", + "xlayer": "47.19", + "xpla": "0.085456", + "zeronetwork": "3322.32", + "zetachain": "0.539346", + "zircuit": "3322.32", + "zklink": "3322.32", + "zksync": "3322.32", + "zoramainnet": "3322.32" } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 17500268ec..a5daa63692 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -300,7 +300,9 @@ export const validatorChainConfig = ( validators: validatorsConfig( { [Contexts.Hyperlane]: ['0xbfb8911b72cfb138c7ce517c57d9c691535dc517'], - [Contexts.ReleaseCandidate]: [], + [Contexts.ReleaseCandidate]: [ + '0xca024623ee6fe281639aee91c4390b0c4e053918', + ], [Contexts.Neutron]: [], }, 'injective', @@ -1254,5 +1256,241 @@ export const validatorChainConfig = ( 'appchain', ), }, + + arthera: { + interval: 5, + reorgPeriod: getReorgPeriod('arthera'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x13710ac11c36c169f62fba95767ae59a1e57098d'], + }, + 'arthera', + ), + }, + aurora: { + interval: 5, + reorgPeriod: getReorgPeriod('aurora'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86'], + }, + 'aurora', + ), + }, + conflux: { + interval: 5, + reorgPeriod: getReorgPeriod('conflux'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490'], + }, + 'conflux', + ), + }, + conwai: { + interval: 5, + reorgPeriod: getReorgPeriod('conwai'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3'], + }, + 'conwai', + ), + }, + corn: { + interval: 5, + reorgPeriod: getReorgPeriod('corn'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xc80b2e3e38220e02d194a0effa9d5bfe89894c07'], + }, + 'corn', + ), + }, + evmos: { + interval: 5, + reorgPeriod: getReorgPeriod('evmos'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0'], + }, + 'evmos', + ), + }, + form: { + interval: 5, + reorgPeriod: getReorgPeriod('form'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x58554b2e76167993b5fc000d0070a2f883cd333a'], + }, + 'form', + ), + }, + ink: { + interval: 5, + reorgPeriod: getReorgPeriod('ink'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xb533b8b104522958b984fb258e0684dec0f1a6a5'], + }, + 'ink', + ), + }, + soneium: { + interval: 5, + reorgPeriod: getReorgPeriod('soneium'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xd4b7af853ed6a2bfc329ecef545df90c959cbee8'], + }, + 'soneium', + ), + }, + sonic: { + interval: 5, + reorgPeriod: getReorgPeriod('sonic'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7'], + }, + 'sonic', + ), + }, + telos: { + interval: 5, + reorgPeriod: getReorgPeriod('telos'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54'], + }, + 'telos', + ), + }, + rivalz: { + interval: 5, + reorgPeriod: getReorgPeriod('rivalz'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1'], + }, + 'rivalz', + ), + }, + soon: { + interval: 5, + reorgPeriod: getReorgPeriod('soon'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76'], + }, + 'soon', + ), + }, + stride: { + interval: 5, + reorgPeriod: getReorgPeriod('stride'), + validators: validatorsConfig( + { + [Contexts.ReleaseCandidate]: [ + '0x1edadb2330c77769a7e9b48d990289ccdcafa430', + ], + }, + 'stride', + ), + }, + + // fractal: { + // interval: 5, + // reorgPeriod: getReorgPeriod('fractal'), + // validators: validatorsConfig( + // { + // [Contexts.Hyperlane]: ['0x3476c9652d3371bb01bbb4962516fffee5e73754'], + // }, + // 'fractal', + // ), + // }, + + torus: { + interval: 5, + reorgPeriod: getReorgPeriod('torus'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x96982a325c28a842bc8cf61b63000737bb9f1f7d'], + }, + 'torus', + ), + }, + + // acala: { + // interval: 5, + // reorgPeriod: getReorgPeriod('acala'), + // validators: validatorsConfig( + // { + // [Contexts.Hyperlane]: ['0x3229bbeeab163c102d0b1fa15119b9ae0ed37cfa'], + // }, + // 'acala', + // ), + // }, + artela: { + interval: 5, + reorgPeriod: getReorgPeriod('artela'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x8fcc1ebd4c0b463618db13f83e4565af3e166b00'], + }, + 'artela', + ), + }, + guru: { + interval: 5, + reorgPeriod: getReorgPeriod('guru'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x0d756d9051f12c4de6aee2ee972193a2adfe00ef'], + }, + 'guru', + ), + }, + hemi: { + interval: 5, + reorgPeriod: getReorgPeriod('hemi'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x312dc72c17d01f3fd0abd31dd9b569bc473266dd'], + }, + 'hemi', + ), + }, + nero: { + interval: 5, + reorgPeriod: getReorgPeriod('nero'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xb86f872df37f11f33acbe75b6ed208b872b57183'], + }, + 'nero', + ), + }, + // subtensor: { + // interval: 5, + // reorgPeriod: getReorgPeriod('subtensor'), + // validators: validatorsConfig( + // { + // [Contexts.Hyperlane]: ['0xd5f8196d7060b85bea491f0b52a671e05f3d10a2'], + // }, + // 'subtensor', + // ), + // }, + xpla: { + interval: 5, + reorgPeriod: getReorgPeriod('xpla'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e'], + }, + 'xpla', + ), + }, }; }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getAppchainBaseUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getAppchainBaseUSDCWarpConfig.ts new file mode 100644 index 0000000000..fce2c5c6ae --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getAppchainBaseUSDCWarpConfig.ts @@ -0,0 +1,45 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + IsmConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const safeOwners: ChainMap
= { + appchain: '0xe3436b3335fa6d4f1b58153079FB360c6Aa83Fd9', + base: '0xE3b50a565fbcdb6CC67B30bEB112f9e7FC855359', +}; + +export const getAppChainBaseUSDCWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ISM_CONFIG: IsmConfig = ethers.constants.AddressZero; // Use the default ISM + + const appchain: HypTokenRouterConfig = { + mailbox: routerConfig.appchain.mailbox, + owner: safeOwners.appchain, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + const base: HypTokenRouterConfig = { + mailbox: routerConfig.base.mailbox, + owner: safeOwners.base, + type: TokenType.collateral, + token: tokens.base.USDC, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + appchain, + base, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.ts new file mode 100644 index 0000000000..48fac9ebe0 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const formSafes: ChainMap
= { + base: '0xFCdf33C6461fE8476AA0b7aC92D631d58c4e0d84', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getBaseFormAIXBTWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const base: HypTokenRouterConfig = { + ...routerConfig.base, + owner: formSafes.base, + type: TokenType.collateral, + token: tokens.base.AIXBT, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + owner: formSafes.form, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + form, + base, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.ts new file mode 100644 index 0000000000..c6d071e62b --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const formSafes: ChainMap
= { + base: '0xFCdf33C6461fE8476AA0b7aC92D631d58c4e0d84', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getBaseFormGAMEWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const base: HypTokenRouterConfig = { + ...routerConfig.base, + owner: formSafes.base, + type: TokenType.collateral, + token: tokens.base.GAME, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + owner: formSafes.form, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + form, + base, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getBobaBsquaredSwellUBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBobaBsquaredSwellUBTCWarpConfig.ts new file mode 100644 index 0000000000..fcd48c686c --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBobaBsquaredSwellUBTCWarpConfig.ts @@ -0,0 +1,54 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + IsmConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const safeOwners: ChainMap
= { + bsquared: '0x7A363efD42305BeDBA307d25351F8ea157b69A1A', + swell: '0xC11e22A31787394950B31e2DEb1d2b5546689B65', + boba: '0x207FfFa7325fC5d0362aB01605D84B268b61888f', +}; + +export const getBobaBsquaredSwellUBTCWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ISM_CONFIG: IsmConfig = ethers.constants.AddressZero; // Use the default ISM + + const boba: HypTokenRouterConfig = { + mailbox: routerConfig.boba.mailbox, + owner: safeOwners.boba, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + const bsquared: HypTokenRouterConfig = { + mailbox: routerConfig.bsquared.mailbox, + owner: safeOwners.bsquared, + type: TokenType.collateral, + token: tokens.bsquared.uBTC, + interchainSecurityModule: ISM_CONFIG, + }; + + const swell: HypTokenRouterConfig = { + mailbox: routerConfig.swell.mailbox, + owner: safeOwners.swell, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + boba, + bsquared, + swell, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.ts new file mode 100644 index 0000000000..c7a1491fd1 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const formSafes: ChainMap
= { + ethereum: '0xec5ad23e29203301B2C1a765718Cc1de7A8d3FbF', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getEthereumFormWBTCWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: formSafes.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.WBTC, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + owner: formSafes.form, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + form, + ethereum, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.ts new file mode 100644 index 0000000000..b0cce79a35 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const formSafes: ChainMap
= { + ethereum: '0xec5ad23e29203301B2C1a765718Cc1de7A8d3FbF', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getEthereumFormWSTETHWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: formSafes.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.WSTETH, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + owner: formSafes.form, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + form, + ethereum, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.ts new file mode 100644 index 0000000000..7182a2a125 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.ts @@ -0,0 +1,48 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + OwnableConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getEthereumInkUSDCConfig = async ( + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: abacusWorksEnvOwnerConfig.ethereum.owner, + proxyAdmin: { + owner: abacusWorksEnvOwnerConfig.ethereum.owner, + address: '0xd702dCed4DDeC529Ea763ddeBD8fb180C4D1843F', + }, + type: TokenType.collateral, + token: tokens.ethereum.USDC, + interchainSecurityModule: ISM_CONFIG, + }; + + const ink: HypTokenRouterConfig = { + ...routerConfig.ink, + owner: abacusWorksEnvOwnerConfig.ink.owner, + proxyAdmin: { + owner: abacusWorksEnvOwnerConfig.ink.owner, + address: '0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D', + }, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + ethereum, + ink, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts index 73c3a5655d..cb90ba42a8 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts @@ -15,6 +15,7 @@ import { // Elixir const owner = '0x00000000F51340906F767C6999Fe512b1275955C'; +const elixirSafe = '0x738744237b7fd97af670d9ddf54390c24263cea8'; const ownerConfig = getOwnerConfigForAddress(owner); export const getEthereumSeiFastUSDWarpConfig = async ( @@ -34,7 +35,10 @@ export const getEthereumSeiFastUSDWarpConfig = async ( const ethereum: HypTokenRouterConfig = { ...routerConfig.ethereum, - ...ownerConfig, + owner: elixirSafe, + ownerOverrides: { + proxyAdmin: owner, + }, type: TokenType.collateral, token: tokens.ethereum.deUSD, interchainSecurityModule: ethers.constants.AddressZero, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts new file mode 100644 index 0000000000..9d073230a8 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts @@ -0,0 +1,42 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + OwnableConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const ethereumOwner = '0x77A0545Dc1Dc6bAee8d9c1d436c6688a75Ae5777'; +const seiOwner = '0x14A359aE2446eaC89495b3F28b7a29cE2A17f392'; + +export const getEthereumSeiPumpBTCWarpConfig = async ( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), + type: TokenType.collateral, + token: tokens.ethereum.pumpBTCsei, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const sei: HypTokenRouterConfig = { + ...routerConfig.sei, + ...getOwnerConfigForAddress(seiOwner), + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + sei, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRe7LRTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRe7LRTWarpConfig.ts new file mode 100644 index 0000000000..c7ea4e9ac7 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRe7LRTWarpConfig.ts @@ -0,0 +1,44 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + OwnableConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const Re7Safes = { + ethereum: '0x184d597Be309e11650ca6c935B483DcC05551578', + zircuit: '0x7Ac2631B4F87801965Acdad169949D6f865068f7', +}; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getEthereumZircuitRe7LRTWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: Re7Safes.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.Re7LRT, + interchainSecurityModule: ISM_CONFIG, + }; + + const zircuit: HypTokenRouterConfig = { + ...routerConfig.zircuit, + owner: Re7Safes.zircuit, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + ethereum, + zircuit, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.ts new file mode 100644 index 0000000000..755714c719 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.ts @@ -0,0 +1,39 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const RstETHSafes = { + ethereum: '0xDA0d054265bB30F4f32C92066428FE57513E7ee1', + zircuit: '0xA1895dF8AE7b7678E82E76b167A24c82Fb83ec9A', +}; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getEthereumZircuitRstETHWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: RstETHSafes.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.rstETH, + interchainSecurityModule: ISM_CONFIG, + }; + + const zircuit: HypTokenRouterConfig = { + ...routerConfig.zircuit, + owner: RstETHSafes.zircuit, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + ethereum, + zircuit, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.ts new file mode 100644 index 0000000000..e10d681579 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.ts @@ -0,0 +1,55 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const safeOwners: ChainMap
= { + ethereum: '0x11BEBBf509248735203BAAAe90c1a27EEE70D567', + superseed: '0x6652010BaCE855DF870D427daA6141c313994929', + optimism: '0x0D493D7E51212bbBF0F1ca4bcfA1E5514C7fEF10', +}; + +export const getEthereumSuperseedUSDTConfig = async ( + routerConfig: ChainMap, +): Promise> => { + return { + ethereum: { + ...routerConfig.ethereum, + owner: safeOwners.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.USDT, + interchainSecurityModule: ethers.constants.AddressZero, + }, + superseed: { + ...routerConfig.superseed, + owner: safeOwners.superseed, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }, + }; +}; + +export const getOptimismSuperseedOPConfig = async ( + routerConfig: ChainMap, +): Promise> => { + return { + optimism: { + ...routerConfig.optimism, + owner: safeOwners.optimism, + type: TokenType.collateral, + token: tokens.optimism.OP, + interchainSecurityModule: ethers.constants.AddressZero, + }, + superseed: { + ...routerConfig.superseed, + owner: safeOwners.superseed, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 685567e4ad..780ebc079c 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -5,6 +5,7 @@ export enum WarpRouteIds { ArbitrumEthereumZircuitAMPHRETH = 'AMPHRETH/arbitrum-ethereum-zircuit', ArbitrumNeutronEclip = 'ECLIP/arbitrum-neutron', ArbitrumNeutronTIA = 'TIA/arbitrum-neutron', + ArbitrumTreasureMAGIC = 'MAGIC/arbitrum-treasure', EclipseEthereumApxEth = 'APXETH/eclipsemainnet-ethereum', EclipseEthereumSolanaUSDC = 'USDC/eclipsemainnet-ethereum-solanamainnet', EclipseEthereumSolanaUSDT = 'USDT/eclipsemainnet-ethereum-solanamainnet', @@ -13,6 +14,8 @@ export enum WarpRouteIds { EclipseEthereumWeETHs = 'weETHs/eclipsemainnet-ethereum', EclipseSolanaEzSOL = 'EZSOL/eclipsemainnet-solanamainnet', EclipseSolanaORCA = 'ORCA/eclipsemainnet-solanamainnet', + EclipseSolanaJitoSOL = 'jitoSOL/eclipsemainnet-solanamainnet', + EclipseSolanaKySOL = 'kySOL/eclipsemainnet-solanamainnet', EclipseSolanaSOL = 'SOL/eclipsemainnet-solanamainnet', EclipseSolanaWIF = 'WIF/eclipsemainnet-solanamainnet', EclipseStrideSTTIA = 'stTIA/eclipsemainnet-stride', @@ -20,16 +23,30 @@ export enum WarpRouteIds { EthereumFlowCbBTC = 'CBBTC/ethereum-flowmainnet', EthereumInevmUSDC = 'USDC/ethereum-inevm', EthereumInevmUSDT = 'USDT/ethereum-inevm', + EthereumInkUSDC = 'USDC/ethereum-ink', EthereumSeiFastUSD = 'FASTUSD/ethereum-sei', + EthereumSeiPumpBTC = 'pumpBTCsei/ethereum-sei', + EthereumVanaETH = 'ETH/ethereum-vana', + EthereumVanaVANA = 'VANA/ethereum-vana', EthereumVictionETH = 'ETH/ethereum-viction', EthereumVictionUSDC = 'USDC/ethereum-viction', EthereumVictionUSDT = 'USDT/ethereum-viction', EthereumSwellZircuitPZETH = 'PZETH/ethereum-swell-zircuit', EthereumBscLumiaLUMIA = 'LUMIA/bsc-ethereum-lumia', + EthereumZircuitRe7LRT = 'Re7LRT/ethereum-zircuit', InevmInjectiveINJ = 'INJ/inevm-injective', MantapacificNeutronTIA = 'TIA/mantapacific-neutron', BaseZeroNetworkCBBTC = 'CBBTC/base-zeronetwork', ArbitrumEthereumMantleModePolygonScrollZeroNetworkUSDT = 'USDT/arbitrum-ethereum-mantle-mode-polygon-scroll-zeronetwork', ArbitrumBaseEthereumLiskOptimismPolygonZeroNetworkUSDC = 'USDC/arbitrum-base-ethereum-lisk-optimism-polygon-zeronetwork', ArbitrumBaseBlastBscEthereumGnosisLiskMantleModeOptimismPolygonScrollZeroNetworkZoraMainnet = 'ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet', + AppchainBaseUSDC = 'USDC/appchain-base', + BobaBsquaredSwellUBTC = 'UBTC/boba-bsquared-swell', + EthereumSuperseedUSDT = 'USDT/ethereum-superseed', + OptimismSuperseedOP = 'OP/optimism-superseed', + EthereumZircuitRstETH = 'rstETH/ethereum-zircuit', + EthereumFormWBTC = 'WBTC/ethereum-form', + EthereumFormWSTETH = 'WSTETH/ethereum-form', + BaseFormAIXBT = 'AIXBT/base-form', + BaseFormGAME = 'GAME/base-form', } diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index 2bab1291ac..d34e53657d 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -113,7 +113,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< alephzeroevmtestnet: true, alfajores: true, arbitrumsepolia: true, - arcadiatestnet2: true, + arcadiatestnet2: false, basesepolia: true, berabartio: true, bsctestnet: true, @@ -219,7 +219,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'bb4e82b-20241107-190434', + tag: '7c0c967-20241218-173053', }, blacklist: [...releaseCandidateHelloworldMatchingList, ...relayBlacklist], gasPaymentEnforcement, @@ -250,7 +250,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '4b280cd-20241206-130519', + tag: 'd84d8da-20241217-172447', }, resources: scraperResources, }, @@ -265,7 +265,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '5a0d68b-20240916-144115', + tag: '7c0c967-20241218-173053', }, whitelist: [...releaseCandidateHelloworldMatchingList], blacklist: relayBlacklist, diff --git a/typescript/infra/config/environments/testnet4/core.ts b/typescript/infra/config/environments/testnet4/core.ts index e40fafb051..a76ab9fd3c 100644 --- a/typescript/infra/config/environments/testnet4/core.ts +++ b/typescript/infra/config/environments/testnet4/core.ts @@ -4,9 +4,11 @@ import { AggregationHookConfig, AggregationIsmConfig, ChainMap, + ChainTechnicalStack, CoreConfig, FallbackRoutingHookConfig, HookType, + IgpConfig, IsmType, MerkleTreeHookConfig, MultisigConfig, @@ -36,11 +38,26 @@ export const core: ChainMap = objMap( .map((origin) => [origin, defaultMultisigConfigs[origin]]), ); - const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => - multisigConfigToIsmConfig(IsmType.MERKLE_ROOT_MULTISIG, multisig); + const isZksyncChain = + getChain(local).technicalStack === ChainTechnicalStack.ZkSync; + // zkSync uses a different ISM for the merkle root + const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => + multisigConfigToIsmConfig( + isZksyncChain + ? IsmType.STORAGE_MERKLE_ROOT_MULTISIG + : IsmType.MERKLE_ROOT_MULTISIG, + multisig, + ); + + // zkSync uses a different ISM for the message ID const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => - multisigConfigToIsmConfig(IsmType.MESSAGE_ID_MULTISIG, multisig); + multisigConfigToIsmConfig( + isZksyncChain + ? IsmType.STORAGE_MESSAGE_ID_MULTISIG + : IsmType.MESSAGE_ID_MULTISIG, + multisig, + ); const routingIsm: RoutingIsmConfig = { type: IsmType.ROUTING, @@ -55,17 +72,30 @@ export const core: ChainMap = objMap( ...ownerConfig, }; + // No static aggregation ISM support on zkSync + const defaultZkSyncIsm = (): RoutingIsmConfig => ({ + type: IsmType.ROUTING, + domains: objMap( + originMultisigs, + (_, multisig): MultisigIsmConfig => messageIdIsm(multisig), + ), + ...ownerConfig, + }); + const pausableIsm: PausableIsmConfig = { type: IsmType.PAUSABLE, paused: false, ...ownerConfig, }; - const defaultIsm: AggregationIsmConfig = { - type: IsmType.AGGREGATION, - modules: [routingIsm, pausableIsm], - threshold: 2, - }; + // No static aggregation ISM support on zkSync + const defaultIsm: AggregationIsmConfig | RoutingIsmConfig = isZksyncChain + ? defaultZkSyncIsm() + : { + type: IsmType.AGGREGATION, + modules: [routingIsm, pausableIsm], + threshold: 2, + }; const merkleHook: MerkleTreeHookConfig = { type: HookType.MERKLE_TREE, @@ -79,28 +109,44 @@ export const core: ChainMap = objMap( ...ownerConfig, }; - const aggregationHooks = objMap( + // No static aggregation hook support on zkSync + const defaultHookDomains = objMap( originMultisigs, - (_origin, _): AggregationHookConfig => ({ - type: HookType.AGGREGATION, - hooks: [pausableHook, merkleHook, igpHook], - }), + (_origin, _): AggregationHookConfig | IgpConfig => { + return isZksyncChain + ? igpHook + : { + type: HookType.AGGREGATION, + hooks: [pausableHook, merkleHook, igpHook], + }; + }, ); const defaultHook: FallbackRoutingHookConfig = { type: HookType.FALLBACK_ROUTING, ...ownerConfig, - domains: aggregationHooks, + domains: defaultHookDomains, fallback: merkleHook, }; - const requiredHook: ProtocolFeeHookConfig = { - type: HookType.PROTOCOL_FEE, - maxProtocolFee: ethers.utils.parseUnits('1', 'gwei').toString(), // 1 gwei of native token - protocolFee: BigNumber.from(1).toString(), // 1 wei of native token - beneficiary: ownerConfig.owner as Address, - ...ownerConfig, - }; + if (typeof ownerConfig.owner !== 'string') { + throw new Error('beneficiary must be a string'); + } + + // No aggregation hook support on zkSync, so we ignore protocolFee + // and make the merkleTreeHook required + const requiredHook: ProtocolFeeHookConfig | MerkleTreeHookConfig = + isZksyncChain + ? { + type: HookType.MERKLE_TREE, + } + : { + type: HookType.PROTOCOL_FEE, + maxProtocolFee: ethers.utils.parseUnits('1', 'gwei').toString(), // 1 gwei of native token + protocolFee: BigNumber.from(1).toString(), // 1 wei of native token + beneficiary: ownerConfig.owner as Address, + ...ownerConfig, + }; return { defaultIsm, diff --git a/typescript/infra/config/environments/testnet4/index.ts b/typescript/infra/config/environments/testnet4/index.ts index 9ef3436975..03430bbbe4 100644 --- a/typescript/infra/config/environments/testnet4/index.ts +++ b/typescript/infra/config/environments/testnet4/index.ts @@ -26,10 +26,13 @@ import { liquidityLayerRelayerConfig } from './middleware.js'; import { owners } from './owners.js'; import { supportedChainNames } from './supportedChainNames.js'; -const getRegistry = async (useSecrets = true): Promise => +const getRegistry = async ( + useSecrets = true, + chains: ChainName[] = supportedChainNames, +): Promise => getRegistryForEnvironment( environmentName, - supportedChainNames, + chains, chainMetadataOverrides, useSecrets, ); @@ -45,15 +48,18 @@ export const environment: EnvironmentConfig = { role: Role = Role.Deployer, useSecrets?: boolean, chains?: ChainName[], - ) => - getMultiProviderForRole( + ) => { + const providerChains = + chains && chains.length > 0 ? chains : supportedChainNames; + return getMultiProviderForRole( environmentName, - chains && chains.length > 0 ? chains : supportedChainNames, - await getRegistry(useSecrets), + providerChains, + await getRegistry(useSecrets, providerChains), context, role, undefined, - ), + ); + }, getKeys: ( context: Contexts = Contexts.Hyperlane, role: Role = Role.Deployer, diff --git a/typescript/infra/config/environments/testnet4/owners.ts b/typescript/infra/config/environments/testnet4/owners.ts index 00f3b00f96..3fb009a93c 100644 --- a/typescript/infra/config/environments/testnet4/owners.ts +++ b/typescript/infra/config/environments/testnet4/owners.ts @@ -13,4 +13,10 @@ export const owners: ChainMap = { ]), ), // [chainMetadata.solanadevnet.name]: SEALEVEL_DEPLOYER_ADDRESS, + eclipsetestnet: { + owner: 'n/a - nothing owned here', + }, + solanatestnet: { + owner: 'n/a - nothing owned here', + }, }; diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index f9ebeb69c6..5318a9ca2b 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -13,13 +13,17 @@ import { import { RouterConfigWithoutOwner } from '../src/config/warp.js'; import { getAncient8EthereumUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.js'; +import { getAppChainBaseUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getAppchainBaseUSDCWarpConfig.js'; import { getArbitrumBaseBlastBscEthereumGnosisMantleModeOptimismPolygonScrollZeroNetworkZoraMainnetETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumBaseBlastBscEthereumGnosisMantleModeOptimismPolygonScrollZeroNetworkZoraMainnetETHWarpConfig.js'; import { getArbitrumBaseEthereumOptimismPolygonZeroNetworkUSDC } from './environments/mainnet3/warp/configGetters/getArbitrumBaseEthereumOptimismPolygonZeroNetworkUSDCWarpConfig.js'; import { getArbitrumEthereumMantleModePolygonScrollZeroNetworkUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumBscEthereumMantleModePolygonScrollZeronetworkUSDTWarpConfig.js'; import { getArbitrumEthereumZircuitAmphrETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.js'; import { getArbitrumNeutronEclipWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.js'; import { getArbitrumNeutronTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.js'; +import { getBaseFormAIXBTWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.js'; +import { getBaseFormGAMEWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.js'; import { getBaseZeroNetworkCBBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseZeroNetworkCBBTCWarpConfig.js'; +import { getBobaBsquaredSwellUBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBobaBsquaredSwellUBTCWarpConfig.js'; import { getEclipseEthereumApxEthWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.js'; import { getEclipseEthereumSolanaUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.js'; import { getEclipseEthereumWBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.js'; @@ -28,16 +32,26 @@ import { getEclipseStrideTiaWarpConfig } from './environments/mainnet3/warp/conf import { getEclipseStrideStTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.js'; import { getEthereumBscLUMIAWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.js'; import { getEthereumFlowCbBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.js'; +import { getEthereumFormWBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.js'; +import { getEthereumFormWSTETHWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.js'; import { getEthereumInevmUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.js'; import { getEthereumInevmUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.js'; +import { getEthereumInkUSDCConfig } from './environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.js'; import { getEthereumSeiFastUSDWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.js'; +import { getEthereumSeiPumpBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.js'; import { getEthereumVictionETHWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.js'; import { getEthereumVictionUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.js'; import { getEthereumVictionUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.js'; +import { getEthereumZircuitRe7LRTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumZircuitRe7LRTWarpConfig.js'; +import { getEthereumZircuitRstETHWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.js'; import { getInevmInjectiveINJWarpConfig } from './environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.js'; import { getMantapacificNeutronTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.js'; import { getRenzoEZETHWarpConfig } from './environments/mainnet3/warp/configGetters/getRenzoEZETHWarpConfig.js'; import { getRenzoPZETHWarpConfig } from './environments/mainnet3/warp/configGetters/getRenzoPZETHWarpConfig.js'; +import { + getEthereumSuperseedUSDTConfig, + getOptimismSuperseedOPConfig, +} from './environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.js'; import { WarpRouteIds } from './environments/mainnet3/warp/warpIds.js'; type WarpConfigGetter = ( @@ -57,7 +71,9 @@ export const warpConfigGetterMap: Record = { getRenzoEZETHWarpConfig, [WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig, [WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig, + [WarpRouteIds.EthereumInkUSDC]: getEthereumInkUSDCConfig, [WarpRouteIds.EthereumSeiFastUSD]: getEthereumSeiFastUSDWarpConfig, + [WarpRouteIds.EthereumSeiPumpBTC]: getEthereumSeiPumpBTCWarpConfig, [WarpRouteIds.EthereumVictionETH]: getEthereumVictionETHWarpConfig, [WarpRouteIds.EthereumVictionUSDC]: getEthereumVictionUSDCWarpConfig, [WarpRouteIds.EthereumVictionUSDT]: getEthereumVictionUSDTWarpConfig, @@ -78,6 +94,16 @@ export const warpConfigGetterMap: Record = { getArbitrumBaseBlastBscEthereumGnosisMantleModeOptimismPolygonScrollZeroNetworkZoraMainnetETHWarpConfig, [WarpRouteIds.EclipseStrideTIA]: getEclipseStrideTiaWarpConfig, [WarpRouteIds.EclipseStrideSTTIA]: getEclipseStrideStTiaWarpConfig, + [WarpRouteIds.AppchainBaseUSDC]: getAppChainBaseUSDCWarpConfig, + [WarpRouteIds.BobaBsquaredSwellUBTC]: getBobaBsquaredSwellUBTCWarpConfig, + [WarpRouteIds.EthereumZircuitRe7LRT]: getEthereumZircuitRe7LRTWarpConfig, + [WarpRouteIds.EthereumSuperseedUSDT]: getEthereumSuperseedUSDTConfig, + [WarpRouteIds.OptimismSuperseedOP]: getOptimismSuperseedOPConfig, + [WarpRouteIds.EthereumZircuitRstETH]: getEthereumZircuitRstETHWarpConfig, + [WarpRouteIds.EthereumFormWBTC]: getEthereumFormWBTCWarpConfig, + [WarpRouteIds.EthereumFormWSTETH]: getEthereumFormWSTETHWarpConfig, + [WarpRouteIds.BaseFormAIXBT]: getBaseFormAIXBTWarpConfig, + [WarpRouteIds.BaseFormGAME]: getBaseFormGAMEWarpConfig, }; export async function getWarpConfig( @@ -91,7 +117,11 @@ export async function getWarpConfig( ); // Strip the owners from the router config const routerConfigWithoutOwner = objMap(routerConfig, (_chain, config) => { - const { owner, ownerOverrides, ...configWithoutOwner } = config; + const { + owner: _owner, + ownerOverrides: _ownerOverrides, + ...configWithoutOwner + } = config; return configWithoutOwner; }); // Isolate the owners from the router config diff --git a/typescript/infra/package.json b/typescript/infra/package.json index a1aebb8998..07d42bd124 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": "7.3.0", + "version": "8.0.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-iam": "^3.74.0", @@ -13,10 +13,10 @@ "@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/providers": "*", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "7.3.0", + "@hyperlane-xyz/helloworld": "8.0.0", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "7.3.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/sdk": "8.0.0", + "@hyperlane-xyz/utils": "8.0.0", "@inquirer/prompts": "3.3.2", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@safe-global/api-kit": "1.3.0", diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index a1c214208e..0d65657a9f 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -261,6 +261,13 @@ export function withConcurrentDeploy(args: Argv) { .default('concurrentDeploy', false); } +export function withConcurrency(args: Argv) { + return args + .describe('concurrency', 'Number of concurrent deploys') + .number('concurrency') + .default('concurrency', 1); +} + export function withRpcUrls(args: Argv) { return args .describe( @@ -295,9 +302,11 @@ export async function getWarpRouteIdInteractive() { // Interactively gets multiple warp route IDs export async function getWarpRouteIdsInteractive() { - const choices = Object.values(WarpRouteIds).map((id) => ({ - value: id, - })); + const choices = Object.values(WarpRouteIds) + .sort() + .map((id) => ({ + value: id, + })); let selection: WarpRouteIds[] = []; @@ -374,7 +383,7 @@ export async function getAgentConfigsBasedOnArgs(argv?: { } // Sanity check that the validator agent config is valid. - ensureValidatorConfigConsistency(agentConfig); + ensureValidatorConfigConsistency(agentConfig, context); return { agentConfig, @@ -402,12 +411,21 @@ export function getAgentConfig( } // Ensures that the validator context chain names are in sync with the validator config. -export function ensureValidatorConfigConsistency(agentConfig: RootAgentConfig) { +export function ensureValidatorConfigConsistency( + agentConfig: RootAgentConfig, + context: Contexts, +) { const validatorContextChainNames = new Set( agentConfig.contextChainNames.validator, ); const validatorConfigChains = new Set( - Object.keys(agentConfig.validators?.chains || {}), + Object.entries(agentConfig.validators?.chains || {}) + .filter(([_, chainConfig]) => + chainConfig.validators.some((validator) => + validator.name.startsWith(`${context}-`), + ), + ) + .map(([chain]) => chain), ); const symDiff = symmetricDifference( validatorContextChainNames, diff --git a/typescript/infra/scripts/agents/utils.ts b/typescript/infra/scripts/agents/utils.ts index fa3a1da4ce..9621705a00 100644 --- a/typescript/infra/scripts/agents/utils.ts +++ b/typescript/infra/scripts/agents/utils.ts @@ -1,3 +1,5 @@ +import { concurrentMap } from '@hyperlane-xyz/utils'; + import { AgentHelmManager, RelayerHelmManager, @@ -7,12 +9,13 @@ import { import { RootAgentConfig } from '../../src/config/agent/agent.js'; import { EnvironmentConfig } from '../../src/config/environment.js'; import { Role } from '../../src/roles.js'; -import { HelmCommand } from '../../src/utils/helm.js'; +import { HelmCommand, HelmManager } from '../../src/utils/helm.js'; import { assertCorrectKubeContext, getArgs, withAgentRolesRequired, withChains, + withConcurrency, withContext, } from '../agent-utils.js'; import { getConfigsBasedOnArgs } from '../core-utils.js'; @@ -24,6 +27,7 @@ export class AgentCli { initialized = false; dryRun = false; chains?: string[]; + concurrency = 1; public async runHelmCommand(command: HelmCommand) { await this.init(); @@ -63,15 +67,20 @@ export class AgentCli { console.log('Dry run values:\n', JSON.stringify(values, null, 2)); } - for (const m of Object.values(managers)) { - await m.runHelmCommand(command, this.dryRun); - } + await concurrentMap( + this.concurrency, + Object.entries(managers), + async ([key, manager]) => { + console.log(`Running helm command for ${key}`); + await manager.runHelmCommand(command, { dryRun: this.dryRun }); + }, + ); } protected async init() { if (this.initialized) return; - const argv = await withChains( - withAgentRolesRequired(withContext(getArgs())), + const argv = await withConcurrency( + withChains(withAgentRolesRequired(withContext(getArgs()))), ) .describe('dry-run', 'Run through the steps without making any changes') .boolean('dry-run').argv; @@ -92,5 +101,6 @@ export class AgentCli { this.dryRun = argv.dryRun || false; this.initialized = true; this.chains = argv.chains; + this.concurrency = argv.concurrency; } } diff --git a/typescript/infra/scripts/check/check-validator-version.ts b/typescript/infra/scripts/check/check-validator-version.ts index 72df04621d..f87f1d32fd 100644 --- a/typescript/infra/scripts/check/check-validator-version.ts +++ b/typescript/infra/scripts/check/check-validator-version.ts @@ -15,25 +15,30 @@ import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js'; // prettier-ignore const acceptableValidatorVersions: Record = { // Aug 27 deploy - '72d498fa984750b9137c1211fef6c80a3e594ce7': 'aug-27-batch', + '72d498fa984750b9137c1211fef6c80a3e594ce7': 'August 27 2024', // Sep 9 deploy - 'd71dd4e5ed7eb69cc4041813ef444e37d881cdda': 'sep-9-batch', + 'd71dd4e5ed7eb69cc4041813ef444e37d881cdda': 'September 9 2024', // Oct 27 deploy - '45399a314cec85723bbb5d2360531c96a3aa261e': 'oct-27-batch', + '45399a314cec85723bbb5d2360531c96a3aa261e': 'October 27 2024', // Nov 7 deploy - '75d62ae7bbdeb77730c6d343c4fc1df97a08abe4': 'nov-7-batch', + '75d62ae7bbdeb77730c6d343c4fc1df97a08abe4': 'November 7 2024', // Nov 21 deploy - 'e70431a85965d8d21681e6f4856ed3ac9bd2ba27': 'nov-21-batch', + 'e70431a85965d8d21681e6f4856ed3ac9bd2ba27': 'November 21 2024', // Nov 21 bsquared deploy - 'd834d8147628584acd78a81e344bff76472d707e': 'nov-21-bsquared', + 'd834d8147628584acd78a81e344bff76472d707e': 'November 21 2024 (Bsquared)', // Nov 21 swell/lumiaprism deploy - 'b35c105f197267072daa14bb3d83c62410b96fac': 'nov-21-swell', + 'b35c105f197267072daa14bb3d83c62410b96fac': 'November 21 2024 (Swell)', + // Dec 4 deploy + 'a7f3967e047c2c5aabb8cc442e4acad435fa32ab': 'December 4 2024', + // Dec 13 deploy + '05e90bc76e5c8ec2491551ecf1b7880187fa2660': 'December 13 2024', // Rolled out only to AW infra before 1.0.0, just 1 commit behind 1.0.0 - 'a64af8be9a76120d0cfc727bb70660fa07e70cce': 'pre-1.0.0', + 'a64af8be9a76120d0cfc727bb70660fa07e70cce': '1.0.0-beta', // 1.0.0 'ffbe1dd82e2452dbc111b6fb469a34fb870da8f1': '1.0.0', - // Tessellated's Own Build - '9b855686d3e2b3d6b81238ce51a576ff5e0f770f': 'tesselated-special-build', + // Tessellated's Build from December 2024 + // https://github.com/Tessellated-io/hyperlane-monorepo/commit/c0719c7f5387c4801a9dec8edc1227fb33b44ea7 + 'c0719c7f5387c4801a9dec8edc1227fb33b44ea7': 'Tessellated - December 2024', }; type ValidatorInfo = { diff --git a/typescript/infra/scripts/check/check-warp-deploy.ts b/typescript/infra/scripts/check/check-warp-deploy.ts index 2cc11d8f0f..3c2e50e277 100644 --- a/typescript/infra/scripts/check/check-warp-deploy.ts +++ b/typescript/infra/scripts/check/check-warp-deploy.ts @@ -1,6 +1,9 @@ import chalk from 'chalk'; import { Gauge, Registry } from 'prom-client'; +import { ChainName } from '@hyperlane-xyz/sdk'; + +import { getWarpAddresses } from '../../config/registry.js'; import { warpConfigGetterMap } from '../../config/warp.js'; import { submitMetrics } from '../../src/utils/metrics.js'; import { Modules, getWarpRouteIdsInteractive } from '../agent-utils.js'; @@ -24,10 +27,6 @@ async function main() { interactive, } = await getCheckWarpDeployArgs().argv; - const envConfig = getEnvironmentConfig(environment); - // Get the multiprovider once to avoid recreating it for each warp route - const multiProvider = await envConfig.getMultiProvider(); - const metricsRegister = new Registry(); const checkerViolationsGauge = new Gauge( getCheckerViolationsGaugeObj(metricsRegister), @@ -41,6 +40,31 @@ async function main() { warpIdsToCheck = await getWarpRouteIdsInteractive(); } + // Determine which chains have warp configs + const chainsWithWarpConfigs = warpIdsToCheck.reduce((chains, warpRouteId) => { + const warpAddresses = getWarpAddresses(warpRouteId); + Object.keys(warpAddresses).forEach((chain) => chains.add(chain)); + return chains; + }, new Set()); + + console.log( + `Found warp configs for chains: ${Array.from(chainsWithWarpConfigs).join( + ', ', + )}`, + ); + + // Get the multiprovider once to avoid recreating it for each warp route + // We specify the chains to avoid creating a multiprovider for all chains. + // This ensures that we don't fail to fetch secrets for new chains in the cron job. + const envConfig = getEnvironmentConfig(environment); + // Use default values for context, role, and useSecrets + const multiProvider = await envConfig.getMultiProvider( + undefined, + undefined, + undefined, + Array.from(chainsWithWarpConfigs), + ); + // TODO: consider retrying this if check throws an error for (const warpRouteId of warpIdsToCheck) { console.log(`\nChecking warp route ${warpRouteId}...`); diff --git a/typescript/infra/scripts/helloworld/kathy.ts b/typescript/infra/scripts/helloworld/kathy.ts index 678e2bb75d..34b3c4f960 100644 --- a/typescript/infra/scripts/helloworld/kathy.ts +++ b/typescript/infra/scripts/helloworld/kathy.ts @@ -480,8 +480,8 @@ async function sendMessage( }); await timeout( - // Will check for up to 12 minutes - core.waitForMessagesProcessed(origin, destination, receipt, 5000, 144), + // Retry indefinitely, but rely on the timeout to break out + core.waitForMessagesProcessed(origin, destination, receipt, 5000), messageReceiptTimeout, 'Timeout waiting for message to be received', ); diff --git a/typescript/infra/scripts/helloworld/utils.ts b/typescript/infra/scripts/helloworld/utils.ts index 729dd6a4fd..2d95e72d37 100644 --- a/typescript/infra/scripts/helloworld/utils.ts +++ b/typescript/infra/scripts/helloworld/utils.ts @@ -127,7 +127,7 @@ export async function getHelloWorldMultiProtocolApp( ); // TODO we need a MultiProtocolIgp - // Using an standard IGP for just evm chains for now + // Using a standard IGP for just evm chains for now // Unfortunately this requires hacking surgically around certain addresses const filteredAddresses = filterChainMapToProtocol( envAddresses, diff --git a/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts b/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts index 29fd16b9a9..8ede7cdda5 100644 --- a/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts +++ b/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts @@ -35,6 +35,12 @@ async function main() { await helmManager.runHelmCommand(HelmCommand.InstallOrUpgrade); }; + // First try to uninstall any stale Warp Monitors. + // This can happen if a Warp Route ID is changed or removed. + await WarpRouteMonitorHelmManager.uninstallUnknownWarpMonitorReleases( + environment, + ); + for (const id of warpRouteIds) { console.log(`Deploying Warp Monitor for Warp Route ID: ${id}`); await deployWarpMonitor(id); diff --git a/typescript/infra/scripts/warp-routes/monitor/metrics.ts b/typescript/infra/scripts/warp-routes/monitor/metrics.ts index 52c2604f96..4879415f60 100644 --- a/typescript/infra/scripts/warp-routes/monitor/metrics.ts +++ b/typescript/infra/scripts/warp-routes/monitor/metrics.ts @@ -59,6 +59,7 @@ export function updateTokenBalanceMetrics( warpCore: WarpCore, token: Token, balanceInfo: WarpRouteBalance, + collateralTokenSymbol: string, ) { const metrics: WarpRouteMetrics = { chain_name: token.chainName, @@ -67,7 +68,7 @@ export function updateTokenBalanceMetrics( wallet_address: token.addressOrDenom, token_standard: token.standard, warp_route_id: createWarpRouteConfigId( - token.symbol, + collateralTokenSymbol, warpCore.getTokenChains(), ), related_chain_names: warpCore diff --git a/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts index 1591d92b3d..c04ed7418c 100644 --- a/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts +++ b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts @@ -89,12 +89,18 @@ async function pollAndUpdateWarpRouteMetrics( chainMetadata, apiKey: await getCoinGeckoApiKey(), }); + const collateralTokenSymbol = getWarpRouteCollateralTokenSymbol(warpCore); while (true) { await tryFn(async () => { await Promise.all( warpCore.tokens.map((token) => - updateTokenMetrics(warpCore, token, tokenPriceGetter), + updateTokenMetrics( + warpCore, + token, + tokenPriceGetter, + collateralTokenSymbol, + ), ), ); }, 'Updating warp route metrics'); @@ -107,6 +113,7 @@ async function updateTokenMetrics( warpCore: WarpCore, token: Token, tokenPriceGetter: CoinGeckoTokenPriceGetter, + collateralTokenSymbol: string, ) { const promises = [ tryFn(async () => { @@ -118,7 +125,12 @@ async function updateTokenMetrics( if (!balanceInfo) { return; } - updateTokenBalanceMetrics(warpCore, token, balanceInfo); + updateTokenBalanceMetrics( + warpCore, + token, + balanceInfo, + collateralTokenSymbol, + ); }, 'Getting bridged balance and value'), ]; @@ -160,7 +172,7 @@ async function getTokenBridgedBalance( const adapter = token.getHypAdapter(warpCore.multiProvider); const bridgedSupply = await adapter.getBridgedSupply(); - if (!bridgedSupply) { + if (bridgedSupply === undefined) { logger.warn('Bridged supply not found for token', token); return undefined; } @@ -273,7 +285,7 @@ async function tryGetTokenPrice( // We only get a price if the token defines a CoinGecko ID. // This way we can ignore values of certain types of collateralized warp routes, // e.g. Native warp routes on rollups that have been pre-funded. - let coinGeckoId = token.coinGeckoId; + const coinGeckoId = token.coinGeckoId; if (!coinGeckoId) { logger.warn('CoinGecko ID missing for token', token.symbol); @@ -310,6 +322,41 @@ async function getCoinGeckoApiKey(): Promise { return apiKey; } +function getWarpRouteCollateralTokenSymbol(warpCore: WarpCore): string { + // We need to have a deterministic way to determine the symbol of the warp route + // as its used to identify the warp route in metrics. This method should support routes where: + // - All tokens have the same symbol, token standards can be all collateral, all synthetic or a mix + // - All tokens have different symbol, but there is a collateral token to break the tie, where there are multiple collateral tokens, alphabetically first is chosen + // - All tokens have different symbol, but there is no collateral token to break the tie, pick the alphabetically first symbol + + // Get all unique symbols from the tokens array + const uniqueSymbols = new Set(warpCore.tokens.map((token) => token.symbol)); + + // If all tokens have the same symbol, return that symbol + if (uniqueSymbols.size === 1) { + return warpCore.tokens[0].symbol; + } + + // Find all collateralized tokens + const collateralTokens = warpCore.tokens.filter( + (token) => + token.isCollateralized() || + token.standard === TokenStandard.EvmHypXERC20Lockbox, + ); + + if (collateralTokens.length === 0) { + // If there are no collateralized tokens, return the alphabetically first symbol + return [...uniqueSymbols].sort()[0]; + } + + // if there is a single unique collateral symbol return it or + // ifthere are multiple, return the alphabetically first symbol + const collateralSymbols = collateralTokens.map((token) => token.symbol); + const uniqueCollateralSymbols = [...new Set(collateralSymbols)]; + + return uniqueCollateralSymbols.sort()[0]; +} + main().catch((err) => { logger.error('Error in main:', err); process.exit(1); diff --git a/typescript/infra/src/agents/index.ts b/typescript/infra/src/agents/index.ts index b7be0e0098..24fccbac07 100644 --- a/typescript/infra/src/agents/index.ts +++ b/typescript/infra/src/agents/index.ts @@ -1,8 +1,14 @@ import fs from 'fs'; import { join } from 'path'; -import { ChainName, RelayerConfig, RpcConsensusType } from '@hyperlane-xyz/sdk'; -import { objOmitKeys } from '@hyperlane-xyz/utils'; +import { + AgentSealevelPriorityFeeOracle, + AgentSealevelTransactionSubmitter, + ChainName, + RelayerConfig, + RpcConsensusType, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType, objOmitKeys } from '@hyperlane-xyz/utils'; import { Contexts } from '../../config/contexts.js'; import { getChain } from '../../config/registry.js'; @@ -87,12 +93,33 @@ export abstract class AgentHelmManager extends HelmManager if (reorgPeriod === undefined) { throw new Error(`No reorg period found for chain ${chain}`); } + + let priorityFeeOracle: AgentSealevelPriorityFeeOracle | undefined; + if (getChain(chain).protocol === ProtocolType.Sealevel) { + priorityFeeOracle = + this.config.rawConfig.sealevel?.priorityFeeOracleConfigGetter?.( + chain, + ); + } + + let transactionSubmitter: + | AgentSealevelTransactionSubmitter + | undefined; + if (getChain(chain).protocol === ProtocolType.Sealevel) { + transactionSubmitter = + this.config.rawConfig.sealevel?.transactionSubmitterConfigGetter?.( + chain, + ); + } + return { name: chain, rpcConsensusType: this.rpcConsensusType(chain), protocol: metadata.protocol, blocks: { reorgPeriod }, maxBatchSize: 32, + priorityFeeOracle, + transactionSubmitter, }; }), }, diff --git a/typescript/infra/src/config/agent/agent.ts b/typescript/infra/src/config/agent/agent.ts index 987a05f0ea..7d2dbe54b6 100644 --- a/typescript/infra/src/config/agent/agent.ts +++ b/typescript/infra/src/config/agent/agent.ts @@ -1,5 +1,7 @@ import { AgentChainMetadata, + AgentSealevelPriorityFeeOracle, + AgentSealevelTransactionSubmitter, AgentSignerAwsKey, AgentSignerKeyType, ChainName, @@ -85,8 +87,21 @@ export interface AgentContextConfig extends AgentEnvConfig { rolesWithKeys: Role[]; // Names of chains this context cares about (subset of environmentChainNames) contextChainNames: AgentChainNames; + sealevel?: SealevelAgentConfig; } +export interface SealevelAgentConfig { + priorityFeeOracleConfigGetter?: ( + chain: ChainName, + ) => AgentSealevelPriorityFeeOracle; + transactionSubmitterConfigGetter?: ( + chain: ChainName, + ) => AgentSealevelTransactionSubmitter; +} + +// An ugly way to mark a URL as a the secret Helius URL when Helm templating +export const HELIUS_SECRET_URL_MARKER = 'helius'; + // incomplete common agent configuration for a role interface AgentRoleConfig { // K8s-specific diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 2ee4314cbe..48e3425701 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -12,6 +12,10 @@ export const tokens: ChainMap> = { USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88', + pumpBTCsei: '0xe9ebd666954B7F0B5B044704c86B126651f6235d', + Re7LRT: '0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a', + rstETH: '0x7a4EffD87C2f3C55CA251080b1343b605f327E3a', + WSTETH: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', }, sei: { fastUSD: '0x37a4dD9CED2b19Cfe8FAC251cd727b5787E45269', @@ -19,6 +23,11 @@ export const tokens: ChainMap> = { base: { cbBTC: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', USDC: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', + AIXBT: '0x4F9Fd6Be4a90f2620860d680c0d4d5Fb53d1A825', + GAME: '0x1C4CcA7C5DB003824208aDDA61Bd749e55F463a3', + }, + bsquared: { + uBTC: '0x796e4D53067FF374B89b2Ac101ce0c1f72ccaAc2', }, arbitrum: { USDT: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9', @@ -45,6 +54,7 @@ export const tokens: ChainMap> = { }, optimism: { USDC: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', + OP: '0x4200000000000000000000000000000000000042', }, gnosis: { WETH: '0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1', diff --git a/typescript/infra/src/helloworld/kathy.ts b/typescript/infra/src/helloworld/kathy.ts index 47dafc851c..dbb8aded61 100644 --- a/typescript/infra/src/helloworld/kathy.ts +++ b/typescript/infra/src/helloworld/kathy.ts @@ -15,6 +15,7 @@ import { import { Role } from '../roles.js'; import { HelmCommand, + HelmCommandOptions, HelmManager, HelmValues, helmifyValues, @@ -90,7 +91,10 @@ export class KathyHelmManager extends HelmManager { }; } - async runHelmCommand(action: HelmCommand, dryRun?: boolean): Promise { + async runHelmCommand( + action: HelmCommand, + options?: HelmCommandOptions, + ): Promise { // If using AWS keys, ensure the Kathy user and key has been created if (this.agentConfig.aws) { const awsUser = new AgentAwsUser( @@ -112,6 +116,6 @@ export class KathyHelmManager extends HelmManager { ); await kathyKey.createIfNotExists(); - super.runHelmCommand(action, dryRun); + await super.runHelmCommand(action, options); } } diff --git a/typescript/infra/src/utils/helm.ts b/typescript/infra/src/utils/helm.ts index 2ec09385ea..4bd23f1047 100644 --- a/typescript/infra/src/utils/helm.ts +++ b/typescript/infra/src/utils/helm.ts @@ -13,12 +13,13 @@ export enum HelmCommand { } export function helmifyValues(config: any, prefix?: string): string[] { + if (config === null || config === undefined) { + return []; + } + if (typeof config !== 'object') { // Helm incorrectly splits on unescaped commas. - const value = - config !== undefined - ? JSON.stringify(config).replaceAll(',', '\\,') - : undefined; + const value = JSON.stringify(config).replaceAll(',', '\\,'); return [`--set ${prefix}=${value}`]; } @@ -89,12 +90,31 @@ export function getDeployableHelmChartName(helmChartConfig: HelmChartConfig) { return helmChartConfig.name; } -export function buildHelmChartDependencies(chartPath: string) { - return execCmd(`cd ${chartPath} && helm dependency build`, {}, false, true); +export function buildHelmChartDependencies( + chartPath: string, + updateRepoCache: boolean, +) { + const flags = updateRepoCache ? '' : '--skip-refresh'; + return execCmd( + `cd ${chartPath} && helm dependency build ${flags}`, + {}, + false, + true, + ); +} + +// Convenience function to remove a helm release without having a HelmManger for it. +export function removeHelmRelease(releaseName: string, namespace: string) { + return execCmd(`helm uninstall ${releaseName} --namespace ${namespace}`); } export type HelmValues = Record; +export interface HelmCommandOptions { + dryRun?: boolean; + updateRepoCache?: boolean; +} + export abstract class HelmManager { abstract readonly helmReleaseName: string; abstract readonly helmChartPath: string; @@ -106,7 +126,13 @@ export abstract class HelmManager { */ abstract helmValues(): Promise; - async runHelmCommand(action: HelmCommand, dryRun?: boolean): Promise { + async runHelmCommand( + action: HelmCommand, + options?: HelmCommandOptions, + ): Promise { + const dryRun = options?.dryRun ?? false; + const updateRepoCache = options?.updateRepoCache ?? false; + const cmd = ['helm', action]; if (dryRun) cmd.push('--dry-run'); @@ -136,7 +162,7 @@ export abstract class HelmManager { } } - await buildHelmChartDependencies(this.helmChartPath); + await buildHelmChartDependencies(this.helmChartPath, updateRepoCache); cmd.push( this.helmReleaseName, this.helmChartPath, diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index ce6c901203..be9b752f88 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -1,10 +1,16 @@ +import { confirm } from '@inquirer/prompts'; import path from 'path'; +import { difference } from '@hyperlane-xyz/utils'; + +import { WarpRouteIds } from '../../config/environments/mainnet3/warp/warpIds.js'; import { DeployEnvironment } from '../../src/config/environment.js'; -import { HelmManager } from '../../src/utils/helm.js'; -import { getInfraPath } from '../../src/utils/utils.js'; +import { HelmManager, removeHelmRelease } from '../../src/utils/helm.js'; +import { execCmdAndParseJson, getInfraPath } from '../../src/utils/utils.js'; export class WarpRouteMonitorHelmManager extends HelmManager { + static helmReleasePrefix: string = 'hyperlane-warp-route-'; + readonly helmChartPath: string = path.join( getInfraPath(), './helm/warp-routes', @@ -22,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'aac6787-20241128-103715', + tag: '20a0c4b-20250109-221853', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, @@ -37,8 +43,12 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return this.runEnv; } - get helmReleaseName(): string { - let name = `hyperlane-warp-route-${this.warpRouteId + get helmReleaseName() { + return WarpRouteMonitorHelmManager.getHelmReleaseName(this.warpRouteId); + } + + static getHelmReleaseName(warpRouteId: string): string { + let name = `${WarpRouteMonitorHelmManager.helmReleasePrefix}${warpRouteId .toLowerCase() .replaceAll('/', '-')}`; @@ -53,4 +63,46 @@ export class WarpRouteMonitorHelmManager extends HelmManager { } return name; } + + // Gets all Warp Monitor Helm Releases in the given namespace. + static async getWarpMonitorHelmReleases( + namespace: string, + ): Promise { + const results = await execCmdAndParseJson( + `helm list --filter '${WarpRouteMonitorHelmManager.helmReleasePrefix}.+' -o json -n ${namespace}`, + ); + return results.map((r: any) => r.name); + } + + // This method is used to uninstall any stale Warp Monitors. + // This can happen if a Warp Route ID is changed or removed. + // Any warp monitor helm releases found that do not relate to known warp route ids + // will be prompted for uninstallation. + static async uninstallUnknownWarpMonitorReleases(namespace: string) { + const allExpectedHelmReleaseNames = Object.values(WarpRouteIds).map( + WarpRouteMonitorHelmManager.getHelmReleaseName, + ); + const helmReleases = + await WarpRouteMonitorHelmManager.getWarpMonitorHelmReleases(namespace); + + const unknownHelmReleases = difference( + new Set(helmReleases), + new Set(allExpectedHelmReleaseNames), + ); + for (const helmRelease of unknownHelmReleases) { + console.log( + `Unknown Warp Monitor Helm Release: ${helmRelease} (possibly a release from a stale Warp Route ID).`, + ); + const uninstall = await confirm({ + message: + "Would you like to uninstall this Helm Release? Make extra sure it shouldn't exist!", + }); + if (uninstall) { + console.log(`Uninstalling Helm Release: ${helmRelease}`); + await removeHelmRelease(helmRelease, namespace); + } else { + console.log(`Skipping uninstall of Helm Release: ${helmRelease}`); + } + } + } } diff --git a/typescript/infra/test/environment.test.ts b/typescript/infra/test/environment.test.ts new file mode 100644 index 0000000000..665832a6d9 --- /dev/null +++ b/typescript/infra/test/environment.test.ts @@ -0,0 +1,16 @@ +import { expect } from 'chai'; + +import { environments } from '../config/environments/index.js'; + +describe('Environment', () => { + for (const env of Object.values(environments)) { + it(`Has owners configured for ${env.environment}`, () => { + for (const chain of env.supportedChainNames) { + expect( + env.owners[chain], + `Missing owner for chain ${chain} in environment ${env.environment}`, + ).to.not.be.undefined; + } + }); + } +}); diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index 97f1f2a252..e5339996dc 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,33 @@ # @hyperlane-xyz/sdk +## 8.0.0 + +### Major Changes + +- 26fbec8f6: Rename TokenConfig related types and utilities for clarity. E.g. `CollateralConfig` to `CollateralTokenConfig`. + Export more config types and zod schemas + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 +- 9f6b8c514: Allow self-relaying of all messages if there are multiple in a given dispatch transaction. +- 82cebabe4: Call google storage API directly and remove @google-cloud/storage dependency from the SDK. +- 95cc9571e: Deploy to new chains: arthera, aurora, conflux, conwai, corn, evmos, form, ink, rivalz, soneium, sonic, telos. +- c690ca82f: Deploy to torus. +- e9911bb9d: Added new Sealevel tx submission and priority fee oracle params to agent config types + +### Patch Changes + +- 472b34670: Bump registry version to v6.3.0. +- 71aefa03e: export BaseMetadataBuilder +- 5942e9cff: Update default validator sets for alephzeroevmmainnet, appchain, lisk, lumiaprism, swell, treasure, vana, zklink. +- de1190656: Export TOKEN_STANDARD_TO_PROVIDER_TYPE, XERC20_STANDARDS, and MINT_LIMITED_STANDARDS maps +- Updated dependencies [79f8197f3] +- Updated dependencies [0eb8d52a4] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/utils@8.0.0 + - @hyperlane-xyz/core@5.9.0 + ## 7.3.0 ### Minor Changes diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 6415bb0e2b..e78dbb869e 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,16 +1,15 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "7.3.0", + "version": "8.0.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-s3": "^3.577.0", "@chain-registry/types": "^0.50.14", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@google-cloud/storage": "7.14.0", - "@hyperlane-xyz/core": "5.8.3", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/core": "5.9.0", + "@hyperlane-xyz/utils": "8.0.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-deployments": "1.37.8", diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 867059be1d..9340fa0c71 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -44,6 +44,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + // acala: { + // threshold: 1, + // validators: [ + // { + // address: '0x3229bbeeab163c102d0b1fa15119b9ae0ed37cfa', + // alias: AW_VALIDATOR_ALIAS, + // }, + // ], + // }, + alephzeroevmmainnet: { threshold: 3, validators: [ @@ -176,6 +186,28 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + artela: { + threshold: 1, + validators: [ + { + address: '0x8fcc1ebd4c0b463618db13f83e4565af3e166b00', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + + arthera: { + threshold: 2, + validators: [ + { + address: '0x13710ac11c36c169f62fba95767ae59a1e57098d', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + astar: { threshold: 2, validators: [ @@ -200,6 +232,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + aurora: { + threshold: 2, + validators: [ + { + address: '0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + avalanche: { threshold: 2, validators: [ @@ -271,7 +315,7 @@ export const defaultMultisigConfigs: ChainMap = { }, blast: { - threshold: 2, + threshold: 3, validators: [ { address: '0xf20c0b09f597597c8d2430d3d72dfddaf09177d1', @@ -279,9 +323,10 @@ export const defaultMultisigConfigs: ChainMap = { }, DEFAULT_MITOSIS_VALIDATOR, { - address: '0xae53467a5c2a9d9420c188d10fef5e1d9b9a5b80', - alias: 'Superform', + address: '0x1652d8ba766821cf01aeea34306dfc1cab964a32', + alias: 'Everclear', }, + { address: '0x54bb0036f777202371429e062fe6aee0d59442f9', alias: 'Renzo' }, ], }, @@ -431,6 +476,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + conflux: { + threshold: 2, + validators: [ + { + address: '0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + connextsepolia: { threshold: 1, validators: [ @@ -441,6 +498,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + conwai: { + threshold: 2, + validators: [ + { + address: '0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + coredao: { threshold: 2, validators: [ @@ -453,6 +522,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + corn: { + threshold: 2, + validators: [ + { + address: '0xc80b2e3e38220e02d194a0effa9d5bfe89894c07', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + cyber: { threshold: 2, validators: [ @@ -595,6 +676,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + evmos: { + threshold: 2, + validators: [ + { + address: '0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + fantom: { threshold: 2, validators: [ @@ -658,6 +751,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + form: { + threshold: 2, + validators: [ + { + address: '0x58554b2e76167993b5fc000d0070a2f883cd333a', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + formtestnet: { threshold: 1, validators: [ @@ -668,6 +773,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + fractal: { + threshold: 1, + validators: [ + { + address: '0x3476c9652d3371bb01bbb4962516fffee5e73754', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + fraxtal: { threshold: 4, validators: [ @@ -747,6 +862,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + guru: { + threshold: 1, + validators: [ + { + address: '0x0d756d9051f12c4de6aee2ee972193a2adfe00ef', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + harmony: { threshold: 2, validators: [ @@ -759,6 +884,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + hemi: { + threshold: 1, + validators: [ + { + address: '0x312dc72c17d01f3fd0abd31dd9b569bc473266dd', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + holesky: { threshold: 1, validators: [ @@ -827,6 +962,31 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + ink: { + threshold: 4, + validators: [ + { + address: '0xb533b8b104522958b984fb258e0684dec0f1a6a5', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xd207a6dfd887d91648b672727ff1aef6223cb15a', + alias: 'Imperator', + }, + + { + address: '0xa40203b5301659f1e201848d92f5e81f64f206f5', + alias: 'Enigma', + }, + { + address: '0xff9c1e7b266a36eda0d9177d4236994d94819dc0', + alias: 'Luganodes', + }, + DEFAULT_BWARE_LABS_VALIDATOR, + DEFAULT_TESSELLATED_VALIDATOR, + ], + }, + inksepolia: { threshold: 1, validators: [ @@ -1099,6 +1259,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + nero: { + threshold: 1, + validators: [ + { + address: '0xb86f872df37f11f33acbe75b6ed208b872b57183', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + neutron: { threshold: 4, validators: [ @@ -1323,6 +1493,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + rivalz: { + threshold: 2, + validators: [ + { + address: '0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + rootstockmainnet: { threshold: 2, validators: [ @@ -1484,6 +1666,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + soneium: { + threshold: 1, + validators: [ + { + address: '0xd4b7af853ed6a2bfc329ecef545df90c959cbee8', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + soneiumtestnet: { threshold: 1, validators: [ @@ -1494,6 +1686,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + sonic: { + threshold: 2, + validators: [ + { + address: '0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + sonictestnet: { threshold: 1, validators: [ @@ -1504,6 +1708,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + soon: { + threshold: 1, + validators: [ + { + address: '0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + stride: { threshold: 6, validators: [ @@ -1548,6 +1762,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + subtensor: { + threshold: 1, + validators: [ + { + address: '0xd5f8196d7060b85bea491f0b52a671e05f3d10a2', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + superpositionmainnet: { threshold: 2, validators: [ @@ -1607,6 +1831,10 @@ export const defaultMultisigConfigs: ChainMap = { }, DEFAULT_MERKLY_VALIDATOR, DEFAULT_MITOSIS_VALIDATOR, + { + address: '0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb', + alias: 'Hashkey Cloud', + }, ], }, @@ -1641,6 +1869,28 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + telos: { + threshold: 2, + validators: [ + { + address: '0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + + torus: { + threshold: 1, + validators: [ + { + address: '0x96982a325c28a842bc8cf61b63000737bb9f1f7d', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + treasure: { threshold: 3, validators: [ @@ -1657,6 +1907,10 @@ export const defaultMultisigConfigs: ChainMap = { alias: 'Treasure', }, DEFAULT_MITOSIS_VALIDATOR, + { + address: '0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb', + alias: 'Hashkey Cloud', + }, ], }, @@ -1765,6 +2019,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + xpla: { + threshold: 1, + validators: [ + { + address: '0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + zeronetwork: { threshold: 2, validators: [ diff --git a/typescript/sdk/src/core/HyperlaneCore.ts b/typescript/sdk/src/core/HyperlaneCore.ts index 43940105db..110b55148b 100644 --- a/typescript/sdk/src/core/HyperlaneCore.ts +++ b/typescript/sdk/src/core/HyperlaneCore.ts @@ -14,6 +14,7 @@ import { ProtocolType, addBufferToGasLimit, addressToBytes32, + assert, bytes32ToAddress, isZeroishAddress, messageId, @@ -257,7 +258,7 @@ export class HyperlaneCore extends HyperlaneApp { // transaction.from must be a signer on zksync if ( this.multiProvider.getChainMetadata(this.getDestination(message)) - .technicalStack === ChainTechnicalStack.ZKSync + .technicalStack === ChainTechnicalStack.ZkSync ) return '0'; return ( @@ -322,7 +323,7 @@ export class HyperlaneCore extends HyperlaneApp { message: DispatchedMessage, ): Promise { const destinationChain = this.getDestination(message); - const mailbox = this.contractsMap[destinationChain].mailbox; + const mailbox = this.getContracts(destinationChain).mailbox; const processedBlock = await mailbox.processedAt(message.id); const events = await mailbox.queryFilter( @@ -330,6 +331,11 @@ export class HyperlaneCore extends HyperlaneApp { processedBlock, processedBlock, ); + + assert( + events.length === 1, + `Expected exactly one process event, got ${events.length}`, + ); const processedEvent = events[0]; return processedEvent.getTransactionReceipt(); } @@ -437,6 +443,8 @@ export class HyperlaneCore extends HyperlaneApp { if (matching.length === 0) { throw new Error(`No dispatch event found for message ${messageId}`); } + + assert(matching.length === 1, 'Multiple dispatch events found'); const event = matching[0]; // only 1 event per message ID return event.getTransactionReceipt(); } diff --git a/typescript/sdk/src/core/HyperlaneRelayer.ts b/typescript/sdk/src/core/HyperlaneRelayer.ts index 9b82f90cbb..c36a37aef3 100644 --- a/typescript/sdk/src/core/HyperlaneRelayer.ts +++ b/typescript/sdk/src/core/HyperlaneRelayer.ts @@ -207,6 +207,38 @@ export class HyperlaneRelayer { return this.getIsmConfig(destinationChain, ism, message); } + async relayAll( + dispatchTx: providers.TransactionReceipt, + messages = HyperlaneCore.getDispatchedMessages(dispatchTx), + ): Promise> { + const destinationMap: ChainMap = {}; + messages.forEach((message) => { + destinationMap[message.parsed.destination] ??= []; + destinationMap[message.parsed.destination].push(message); + }); + + // parallelize relaying to different destinations + return promiseObjAll( + objMap(destinationMap, async (_destination, messages) => { + const receipts: ethers.ContractReceipt[] = []; + // serially relay messages to the same destination + for (const message of messages) { + try { + const receipt = await this.relayMessage( + dispatchTx, + undefined, + message, + ); + receipts.push(receipt); + } catch (e) { + this.logger.error(`Failed to relay message ${message.id}, ${e}`); + } + } + return receipts; + }), + ); + } + async relayMessage( dispatchTx: providers.TransactionReceipt, messageIndex = 0, diff --git a/typescript/sdk/src/deploy/HyperlaneDeployer.ts b/typescript/sdk/src/deploy/HyperlaneDeployer.ts index 74febabe91..b60e900473 100644 --- a/typescript/sdk/src/deploy/HyperlaneDeployer.ts +++ b/typescript/sdk/src/deploy/HyperlaneDeployer.ts @@ -418,8 +418,8 @@ export abstract class HyperlaneDeployer< const explorer = this.multiProvider.tryGetExplorerApi(chain); const { technicalStack } = this.multiProvider.getChainMetadata(chain); - const isZKSyncExplorer = explorer?.family === ExplorerFamily.ZKSync; - const isZKSyncChain = technicalStack === ChainTechnicalStack.ZKSync; + const isZKSyncExplorer = explorer?.family === ExplorerFamily.ZkSync; + const isZKSyncChain = technicalStack === ChainTechnicalStack.ZkSync; const signer = this.multiProvider.getSigner(chain); const artifact = await getZKSyncArtifactByContractName(contractName); @@ -469,7 +469,7 @@ export abstract class HyperlaneDeployer< if (isZKSyncChain) { if (!artifact) { throw new Error( - `No ZKSync artifact found for contract: ${contractName}`, + `No ZkSync artifact found for contract: ${contractName}`, ); } verificationInput = await getContractVerificationInputForZKSync({ diff --git a/typescript/sdk/src/deploy/protocolDeploymentConfig.ts b/typescript/sdk/src/deploy/protocolDeploymentConfig.ts index f8286e32c4..1c6b607538 100644 --- a/typescript/sdk/src/deploy/protocolDeploymentConfig.ts +++ b/typescript/sdk/src/deploy/protocolDeploymentConfig.ts @@ -5,7 +5,7 @@ import { ChainTechnicalStack } from '../metadata/chainMetadataTypes.js'; * @notice An array of chain technical stacks that are not supported for static deployment. */ export const skipStaticDeployment: ChainTechnicalStack[] = [ - ChainTechnicalStack.ZKSync, + ChainTechnicalStack.ZkSync, ]; export const isIsmStatic: Record = { diff --git a/typescript/sdk/src/deploy/verify/ZKSyncContractVerifier.ts b/typescript/sdk/src/deploy/verify/ZKSyncContractVerifier.ts index b76c1d0111..4110d1f5e2 100644 --- a/typescript/sdk/src/deploy/verify/ZKSyncContractVerifier.ts +++ b/typescript/sdk/src/deploy/verify/ZKSyncContractVerifier.ts @@ -17,11 +17,11 @@ import { /** * @title ZKSyncContractVerifier - * @notice Handles the verification of ZKSync contracts on block explorers - * @dev This class manages the process of verifying ZKSync contracts, including + * @notice Handles the verification of ZkSync contracts on block explorers + * @dev This class manages the process of verifying ZkSync contracts, including * preparing verification data and submitting it to the appropriate explorer API * Note: Etherscan verification is managed by the ContractVerifier class - * Blockscout verification is not currently supported on ZKSync + * Blockscout verification is not currently supported on ZkSync */ export class ZKSyncContractVerifier extends BaseContractVerifier { protected logger = rootLogger.child({ module: 'ZKSyncContractVerifier' }); diff --git a/typescript/sdk/src/gcp/storage.ts b/typescript/sdk/src/gcp/storage.ts index 96c2a3fd71..6177202314 100644 --- a/typescript/sdk/src/gcp/storage.ts +++ b/typescript/sdk/src/gcp/storage.ts @@ -1,5 +1,3 @@ -import { Storage } from '@google-cloud/storage'; - export const GCS_BUCKET_REGEX = /^(?:(?:https?:\/\/)?([^/]+)\.storage\.googleapis\.com\/?|gs:\/\/([^/]+))$/; @@ -18,53 +16,84 @@ export interface StorageConfig { } export class GcpStorageWrapper { - private readonly client: Storage; private readonly bucket: string; private cache: Record> | undefined; + private readonly baseUrl: string; static fromBucketUrl(bucketUrl: string): GcpStorageWrapper { const match = bucketUrl.match(GCS_BUCKET_REGEX); if (!match) throw new Error('Could not parse bucket url'); return new GcpStorageWrapper({ - bucket: match[1], + // Handle both http and gs:// formats + bucket: match[1] || match[2], caching: true, }); } constructor(readonly config: StorageConfig) { - this.client = new Storage({ - projectId: config.projectId, - keyFilename: config.keyFilename, - }); this.bucket = config.bucket; + this.baseUrl = `https://storage.googleapis.com/storage/v1/b/${this.bucket}/o`; if (config.caching) { this.cache = {}; } } - formatKey(key: string): string { + private formatKey(key: string): string { return this.config.folder ? `${this.config.folder}/${key}` : key; } - async getObject(key: string): Promise | undefined> { - const Key = this.formatKey(key); - if (this.cache?.[Key]) { - return this.cache![Key]; + private getCachedObject(key: string): StorageReceipt | undefined { + return this.cache?.[key]; + } + + private setCachedObject(key: string, value: StorageReceipt): void { + if (this.cache) { + this.cache[key] = value; } + } - try { - const bucket = this.client.bucket(this.bucket); - const file = bucket.file(Key); - const [exists] = await file.exists(); + private async fetchMetadata(key: string): Promise { + const url = new URL(`${this.baseUrl}/${encodeURIComponent(key)}`); + const response = await fetch(url.toString()); - if (!exists) { - return undefined; - } + if (response.status === 404) return undefined; + + if (!response.ok) { + const responseText = await response.text(); + throw new Error( + `Failed to fetch object metadata: ${response.statusText}. ${responseText}`, + ); + } + + return response.json(); + } + + private async fetchContent(key: string): Promise { + const url = `${this.baseUrl}/${encodeURIComponent(key)}?alt=media`; + const response = await fetch(url); + const responseText = await response.text(); + + if (!response.ok) { + throw new Error( + `Failed to fetch object content: ${response.statusText}. ${responseText}`, + ); + } + + return responseText; + } - const [metadata] = await file.getMetadata(); - const [contents] = await file.download(); - const body = contents.toString('utf-8'); + async getObject(key: string): Promise | undefined> { + const formattedKey = this.formatKey(key); + const cachedObject = this.getCachedObject(formattedKey); + if (cachedObject) { + return cachedObject; + } + try { + const metadata = await this.fetchMetadata(formattedKey); + if (!metadata) return undefined; + + const body = await this.fetchContent(formattedKey); const result = { data: JSON.parse(body), // If no updated date is provided, use the Unix epoch start @@ -72,12 +101,10 @@ export class GcpStorageWrapper { modified: new Date(metadata.updated ?? 0), }; - if (this.cache) { - this.cache[Key] = result; - } + this.setCachedObject(formattedKey, result); return result; } catch (e: any) { - if (e.code === 404) { + if (e.status === 404) { return undefined; } throw e; diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index 936d89a14d..0a6f2613dd 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -19,12 +19,12 @@ export { } from './consts/multisigIsm.js'; export { SEALEVEL_SPL_NOOP_ADDRESS } from './consts/sealevel.js'; export { - TestChainName, multiProtocolTestChainMetadata, test1, test2, test3, testChainMetadata, + TestChainName, testChains, testCosmosChain, testSealevelChain, @@ -167,6 +167,7 @@ export { } from './hook/types.js'; export { DerivedIsmConfig, EvmIsmReader } from './ism/EvmIsmReader.js'; export { HyperlaneIsmFactory } from './ism/HyperlaneIsmFactory.js'; +export { BaseMetadataBuilder } from './ism/metadata/builder.js'; export { decodeIsmMetadata } from './ism/metadata/decode.js'; export { buildAggregationIsmConfigs, @@ -210,18 +211,24 @@ export { AgentCosmosGasPrice, AgentLogFormat, AgentLogLevel, + AgentSealevelChainMetadata, + AgentSealevelHeliusFeeLevel, + AgentSealevelPriorityFeeOracle, + AgentSealevelPriorityFeeOracleType, + AgentSealevelTransactionSubmitter, + AgentSealevelTransactionSubmitterType, AgentSigner, AgentSignerAwsKey, AgentSignerHexKey, AgentSignerKeyType, AgentSignerNode, + buildAgentConfig, GasPaymentEnforcement, GasPaymentEnforcementPolicyType, RelayerConfig, RpcConsensusType, ScraperConfig, ValidatorConfig, - buildAgentConfig, } from './metadata/agentConfig.js'; export { ChainMetadataManager, @@ -237,15 +244,15 @@ export { EthJsonRpcBlockParameterTag, ExplorerFamily, ExplorerFamilyValue, - NativeToken, - RpcUrl, - RpcUrlSchema, getChainIdNumber, getDomainId, getReorgPeriod, isValidChainMetadata, mergeChainMetadata, mergeChainMetadataMap, + NativeToken, + RpcUrl, + RpcUrlSchema, } from './metadata/chainMetadataTypes.js'; export { ZChainName, ZHash } from './metadata/customZodTypes.js'; export { @@ -300,9 +307,6 @@ export { MultiProviderOptions, } from './providers/MultiProvider.js'; export { - ProviderBuilderFn, - ProviderBuilderMap, - TypedProviderBuilderFn, defaultEthersV5ProviderBuilder, defaultFuelProviderBuilder, defaultProviderBuilder, @@ -310,6 +314,9 @@ export { defaultSolProviderBuilder, defaultViemProviderBuilder, protocolToDefaultProviderBuilder, + ProviderBuilderFn, + ProviderBuilderMap, + TypedProviderBuilderFn, } from './providers/providerBuilders.js'; export { CosmJsContract, @@ -349,9 +356,9 @@ export { HyperlaneEtherscanProvider } from './providers/SmartProvider/HyperlaneE export { HyperlaneJsonRpcProvider } from './providers/SmartProvider/HyperlaneJsonRpcProvider.js'; export { AllProviderMethods, + excludeProviderMethods, IProviderMethods, ProviderMethod, - excludeProviderMethods, } from './providers/SmartProvider/ProviderMethods.js'; export { HyperlaneSmartProvider } from './providers/SmartProvider/SmartProvider.js'; export { @@ -413,13 +420,14 @@ export { export { ChainGasOracleParams, GasPriceConfig, - NativeTokenPriceConfig, getCosmosChainGasPrice, getGasPrice, getLocalStorageGasOracleConfig, getTokenExchangeRateFromValues, + NativeTokenPriceConfig, } from './gas/utils.js'; export { GcpValidator } from './gcp/validator.js'; +export { EvmHookModule } from './hook/EvmHookModule.js'; export { DerivedIcaRouterConfig, DerivedIcaRouterConfigSchema, @@ -459,17 +467,17 @@ export { MailboxClientConfig, MailboxClientConfigSchema, ProxiedFactories, + proxiedFactories, ProxiedRouterConfig, RemoteRouters, RouterAddress, RouterConfig, RouterViolation, RouterViolationType, - proxiedFactories, } from './router/types.js'; export { - CosmIbcToWarpTokenAdapter, CosmIbcTokenAdapter, + CosmIbcToWarpTokenAdapter, CosmNativeTokenAdapter, } from './token/adapters/CosmosTokenAdapter.js'; export { @@ -492,8 +500,8 @@ export { export { IHypTokenAdapter, IHypXERC20Adapter, - ITokenAdapter, InterchainGasQuote, + ITokenAdapter, TransferParams, TransferRemoteParams, } from './token/adapters/ITokenAdapter.js'; @@ -506,9 +514,9 @@ export { SealevelTokenAdapter, } from './token/adapters/SealevelTokenAdapter.js'; export { - SealevelHypTokenInstruction, SealevelHyperlaneTokenData, SealevelHyperlaneTokenDataSchema, + SealevelHypTokenInstruction, SealevelTransferRemoteInstruction, SealevelTransferRemoteSchema, } from './token/adapters/serialization.js'; @@ -516,11 +524,11 @@ export { HypERC20App } from './token/app.js'; export { HypERC20Checker } from './token/checker.js'; export { TokenType } from './token/config.js'; export { + hypERC20contracts, HypERC20Factories, + hypERC20factories, HypERC721Factories, TokenFactories, - hypERC20contracts, - hypERC20factories, } from './token/contracts.js'; export { HypERC20Deployer, HypERC721Deployer } from './token/deploy.js'; export { EvmERC20WarpModule } from './token/EvmERC20WarpModule.js'; @@ -529,16 +537,17 @@ export { IToken, TokenArgs, TokenConfigSchema } from './token/IToken.js'; export { Token } from './token/Token.js'; export { TokenAmount } from './token/TokenAmount.js'; export { + getTokenConnectionId, HyperlaneTokenConnection, IbcToHyperlaneTokenConnection, IbcTokenConnection, + parseTokenConnectionId, TokenConnection, TokenConnectionConfigSchema, TokenConnectionType, - getTokenConnectionId, - parseTokenConnectionId, } from './token/TokenConnection.js'; export { + MINT_LIMITED_STANDARDS, PROTOCOL_TO_NATIVE_STANDARD, TOKEN_COLLATERALIZED_STANDARDS, TOKEN_COSMWASM_STANDARDS, @@ -546,8 +555,10 @@ export { TOKEN_MULTI_CHAIN_STANDARDS, TOKEN_NFT_STANDARDS, TOKEN_STANDARD_TO_PROTOCOL, + TOKEN_STANDARD_TO_PROVIDER_TYPE, TOKEN_TYPE_TO_STANDARD, TokenStandard, + XERC20_STANDARDS, } from './token/TokenStandard.js'; export { CollateralRebaseTokenConfigSchema, @@ -557,6 +568,12 @@ export { HypTokenConfigSchema, HypTokenRouterConfig, HypTokenRouterConfigSchema, + isCollateralRebaseTokenConfig, + isCollateralTokenConfig, + isNativeTokenConfig, + isSyntheticRebaseTokenConfig, + isSyntheticTokenConfig, + isTokenMetadata, NativeTokenConfig, NativeTokenConfigSchema, SyntheticRebaseTokenConfig, @@ -568,12 +585,6 @@ export { WarpRouteDeployConfig, WarpRouteDeployConfigSchema, WarpRouteDeployConfigSchemaErrors, - isCollateralRebaseTokenConfig, - isCollateralTokenConfig, - isNativeTokenConfig, - isSyntheticRebaseTokenConfig, - isSyntheticTokenConfig, - isTokenMetadata, } from './token/types.js'; export { ChainMap, @@ -611,12 +622,15 @@ export { multisigIsmVerificationCost, normalizeConfig } from './utils/ism.js'; export { MultiGeneric } from './utils/MultiGeneric.js'; export { isCompliant, validateZodResult } from './utils/schemas.js'; export { + getSealevelAccountDataSchema, SealevelAccountDataWrapper, SealevelInstructionWrapper, - getSealevelAccountDataSchema, } from './utils/sealevelSerialization.js'; export { getChainIdFromTxs } from './utils/transactions.js'; -export { getValidatorFromStorageLocation } from './utils/validator.js'; +export { + getValidatorFromStorageLocation, + isValidValidatorStorageLocation, +} from './utils/validator.js'; export { FeeConstantConfig, RouteBlacklist, @@ -634,5 +648,3 @@ export { isIsmStatic, skipStaticDeployment, } from './deploy/protocolDeploymentConfig.js'; - -export { EvmHookModule } from './hook/EvmHookModule.js'; diff --git a/typescript/sdk/src/ism/EvmIsmReader.ts b/typescript/sdk/src/ism/EvmIsmReader.ts index a6d0751188..2848fd18ec 100644 --- a/typescript/sdk/src/ism/EvmIsmReader.ts +++ b/typescript/sdk/src/ism/EvmIsmReader.ts @@ -23,6 +23,7 @@ import { import { DEFAULT_CONTRACT_READ_CONCURRENCY } from '../consts/concurrency.js'; import { DispatchedMessage } from '../core/types.js'; +import { ChainTechnicalStack } from '../metadata/chainMetadataTypes.js'; import { MultiProvider } from '../providers/MultiProvider.js'; import { ChainNameOrId } from '../types.js'; import { HyperlaneReader } from '../utils/HyperlaneReader.js'; @@ -62,6 +63,7 @@ export interface IsmReader { export class EvmIsmReader extends HyperlaneReader implements IsmReader { protected readonly logger = rootLogger.child({ module: 'EvmIsmReader' }); + protected isZkSyncChain: boolean; constructor( protected readonly multiProvider: MultiProvider, @@ -72,6 +74,12 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { protected readonly messageContext?: DispatchedMessage, ) { super(multiProvider, chain); + + // So we can distinguish between Storage/Static ISMs + const chainTechnicalStack = this.multiProvider.getChainMetadata( + this.chain, + ).technicalStack; + this.isZkSyncChain = chainTechnicalStack === ChainTechnicalStack.ZkSync; } async deriveIsmConfig(address: Address): Promise { @@ -208,9 +216,14 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { async (module) => this.deriveIsmConfig(module), ); + // If it's a zkSync chain, it must be a StorageAggregationIsm + const ismType = this.isZkSyncChain + ? IsmType.STORAGE_AGGREGATION + : IsmType.AGGREGATION; + return { address, - type: IsmType.AGGREGATION, + type: ismType, modules: ismConfigs, threshold, }; @@ -227,11 +240,19 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { `expected module type to be ${ModuleType.MERKLE_ROOT_MULTISIG} or ${ModuleType.MESSAGE_ID_MULTISIG}, got ${moduleType}`, ); - const ismType = + let ismType = moduleType === ModuleType.MERKLE_ROOT_MULTISIG ? IsmType.MERKLE_ROOT_MULTISIG : IsmType.MESSAGE_ID_MULTISIG; + // If it's a zkSync chain, it must be a StorageMultisigIsm + if (this.isZkSyncChain) { + ismType = + moduleType === ModuleType.MERKLE_ROOT_MULTISIG + ? IsmType.STORAGE_MERKLE_ROOT_MULTISIG + : IsmType.STORAGE_MESSAGE_ID_MULTISIG; + } + const [validators, threshold] = await ism.validatorsAndThreshold( ethers.constants.AddressZero, ); diff --git a/typescript/sdk/src/metadata/agentConfig.ts b/typescript/sdk/src/metadata/agentConfig.ts index cb570e29eb..9ff999c0dc 100644 --- a/typescript/sdk/src/metadata/agentConfig.ts +++ b/typescript/sdk/src/metadata/agentConfig.ts @@ -51,6 +51,26 @@ export enum AgentSignerKeyType { Cosmos = 'cosmosKey', } +export enum AgentSealevelPriorityFeeOracleType { + Helius = 'helius', + Constant = 'constant', +} + +export enum AgentSealevelHeliusFeeLevel { + Recommended = 'recommended', + Min = 'min', + Low = 'low', + Medium = 'medium', + High = 'high', + VeryHigh = 'veryHigh', + UnsafeMax = 'unsafeMax', +} + +export enum AgentSealevelTransactionSubmitterType { + Rpc = 'rpc', + Jito = 'jito', +} + const AgentSignerHexKeySchema = z .object({ type: z.literal(AgentSignerKeyType.Hex).optional(), @@ -120,6 +140,40 @@ export type AgentCosmosGasPrice = z.infer< typeof AgentCosmosChainMetadataSchema >['gasPrice']; +const AgentSealevelChainMetadataSchema = z.object({ + priorityFeeOracle: z + .union([ + z.object({ + type: z.literal(AgentSealevelPriorityFeeOracleType.Helius), + url: z.string(), + // TODO add options + feeLevel: z.nativeEnum(AgentSealevelHeliusFeeLevel), + }), + z.object({ + type: z.literal(AgentSealevelPriorityFeeOracleType.Constant), + // In microlamports + fee: ZUWei, + }), + ]) + .optional(), + transactionSubmitter: z + .object({ + type: z.nativeEnum(AgentSealevelTransactionSubmitterType), + url: z.string().optional(), + }) + .optional(), +}); + +export type AgentSealevelChainMetadata = z.infer< + typeof AgentSealevelChainMetadataSchema +>; + +export type AgentSealevelPriorityFeeOracle = + AgentSealevelChainMetadata['priorityFeeOracle']; + +export type AgentSealevelTransactionSubmitter = + AgentSealevelChainMetadata['transactionSubmitter']; + export const AgentChainMetadataSchema = ChainMetadataSchemaObject.merge( HyperlaneDeploymentArtifactsSchema, ) @@ -155,6 +209,7 @@ export const AgentChainMetadataSchema = ChainMetadataSchemaObject.merge( .optional(), }) .merge(AgentCosmosChainMetadataSchema.partial()) + .merge(AgentSealevelChainMetadataSchema.partial()) .refine((metadata) => { // Make sure that the signer is valid for the protocol @@ -201,6 +256,13 @@ export const AgentChainMetadataSchema = ChainMetadataSchemaObject.merge( } } + // If the protocol type is Sealevel, require everything in AgentSealevelChainMetadataSchema + if (metadata.protocol === ProtocolType.Sealevel) { + if (!AgentSealevelChainMetadataSchema.safeParse(metadata).success) { + return false; + } + } + return true; }); diff --git a/typescript/sdk/src/metadata/blockExplorer.test.ts b/typescript/sdk/src/metadata/blockExplorer.test.ts index 53a358876b..3856668410 100644 --- a/typescript/sdk/src/metadata/blockExplorer.test.ts +++ b/typescript/sdk/src/metadata/blockExplorer.test.ts @@ -1,5 +1,7 @@ import { expect } from 'chai'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + import { test1, testCosmosChain, @@ -8,6 +10,7 @@ import { import { getExplorerAddressUrl, + getExplorerApi, getExplorerApiUrl, getExplorerBaseUrl, getExplorerTxUrl, @@ -52,4 +55,120 @@ describe('Block explorer utils', () => { ); }); }); + + describe('Edge cases', () => { + const emptyChain = { + protocol: ProtocolType.Ethereum, + name: 'empty', + domainId: 1, + chainId: 1, + rpcUrls: [{ http: 'https://empty.test' }], + }; + + const chainWithoutApi = { + protocol: ProtocolType.Ethereum, + name: 'noapi', + chainId: 1, + domainId: 1, + rpcUrls: [{ http: 'https://noapi.test' }], + blockExplorers: [ + { + name: 'test', + url: 'https://test.com', + apiUrl: '', + }, + ], + }; + + it('handles chain without block explorers', () => { + expect(getExplorerBaseUrl(emptyChain)).to.be.null; + expect(getExplorerApi(emptyChain)).to.be.null; + expect(getExplorerTxUrl(emptyChain, '0x123')).to.be.null; + expect(getExplorerAddressUrl(emptyChain, '0x123')).to.be.null; + }); + + it('handles chain without api url', () => { + expect(getExplorerBaseUrl(chainWithoutApi)).to.equal('https://test.com/'); + expect(getExplorerApi(chainWithoutApi)).to.be.null; + }); + }); + + describe('Multiple block explorers', () => { + const multiExplorerChain = { + protocol: ProtocolType.Ethereum, + name: 'multi', + domainId: 1, + chainId: 1, + rpcUrls: [{ http: 'https://multi.test' }], + blockExplorers: [ + { + name: 'first', + url: 'https://first.com', + apiUrl: 'https://api.first.com', + apiKey: 'key1', + }, + { + name: 'second', + url: 'https://second.com', + apiUrl: 'https://api.second.com', + apiKey: 'key2', + }, + ], + }; + + it('uses correct explorer by index', () => { + expect(getExplorerBaseUrl(multiExplorerChain, 1)).to.equal( + 'https://second.com/', + ); + expect(getExplorerApiUrl(multiExplorerChain, 1)).to.equal( + 'https://api.second.com/?apikey=key2', + ); + }); + }); + + describe('Special chain names with different common paths', () => { + const nautilusChain = { + protocol: ProtocolType.Ethereum, + name: 'nautilus', + chainId: 1, + domainId: 1, + rpcUrls: [{ http: 'https://nautilus.test' }], + blockExplorers: [ + { + name: 'nautilus', + url: 'https://nautilus.com', + apiUrl: 'https://api.nautilus.com', + }, + ], + }; + + it('uses correct transaction path for special chains', () => { + expect(getExplorerTxUrl(nautilusChain, '0x123')).to.equal( + 'https://nautilus.com/transaction/0x123', + ); + }); + }); + + describe('URL handling', () => { + const chainWithTrailingSlash = { + protocol: ProtocolType.Ethereum, + name: 'test', + domainId: 1, + chainId: 1, + rpcUrls: [{ http: 'https://test.chain' }], + blockExplorers: [ + { + name: 'test', + url: 'https://test.com/', + apiUrl: 'https://api.test.com', + }, + ], + }; + + it('handles trailing slashes correctly', () => { + expect(getExplorerTxUrl(chainWithTrailingSlash, '0x123')).to.equal( + 'https://test.com/tx/0x123', + ); + }); + }); }); diff --git a/typescript/sdk/src/metadata/chainMetadataTypes.ts b/typescript/sdk/src/metadata/chainMetadataTypes.ts index 5e7b9fc100..5f57159487 100644 --- a/typescript/sdk/src/metadata/chainMetadataTypes.ts +++ b/typescript/sdk/src/metadata/chainMetadataTypes.ts @@ -22,7 +22,7 @@ export enum ExplorerFamily { Etherscan = 'etherscan', Blockscout = 'blockscout', Routescan = 'routescan', - ZKSync = 'zksync', + ZkSync = 'zksync', Other = 'other', } @@ -31,7 +31,7 @@ export enum ChainTechnicalStack { OpStack = 'opstack', PolygonCDK = 'polygoncdk', PolkadotSubstrate = 'polkadotsubstrate', - ZKSync = 'zksync', + ZkSync = 'zksync', Other = 'other', } diff --git a/typescript/sdk/src/metadata/matchingList.ts b/typescript/sdk/src/metadata/matchingList.ts index 0e7a50804d..297bc54613 100644 --- a/typescript/sdk/src/metadata/matchingList.ts +++ b/typescript/sdk/src/metadata/matchingList.ts @@ -15,6 +15,7 @@ const DomainSchema = z.union([ const AddressSchema = z.union([z.literal('*'), ZHash, z.array(ZHash)]); const MatchingListElementSchema = z.object({ + messageId: AddressSchema.optional(), originDomain: DomainSchema.optional(), senderAddress: AddressSchema.optional(), destinationDomain: DomainSchema.optional(), diff --git a/typescript/sdk/src/providers/MultiProvider.ts b/typescript/sdk/src/providers/MultiProvider.ts index 719016ce39..871bccdaa9 100644 --- a/typescript/sdk/src/providers/MultiProvider.ts +++ b/typescript/sdk/src/providers/MultiProvider.ts @@ -105,7 +105,7 @@ export class MultiProvider extends ChainMetadataManager { if (this.providers[name]) return this.providers[name]; if (testChains.includes(name)) { - if (technicalStack === ChainTechnicalStack.ZKSync) { + if (technicalStack === ChainTechnicalStack.ZkSync) { this.providers[name] = new ZKSyncProvider('http://127.0.0.1:8011', 260); } else { this.providers[name] = new providers.JsonRpcProvider( @@ -114,7 +114,7 @@ export class MultiProvider extends ChainMetadataManager { ); } } else if (rpcUrls.length) { - if (technicalStack === ChainTechnicalStack.ZKSync) { + if (technicalStack === ChainTechnicalStack.ZkSync) { this.providers[name] = defaultZKProviderBuilder(rpcUrls, chainId); } else { this.providers[name] = this.providerBuilder(rpcUrls, chainId); @@ -343,10 +343,10 @@ export class MultiProvider extends ChainMetadataManager { const overrides = this.getTransactionOverrides(chainNameOrId); const signer = this.getSigner(chainNameOrId); - if (technicalStack === ChainTechnicalStack.ZKSync) { - if (!artifact) throw new Error(`No ZKSync contract artifact provided!`); + if (technicalStack === ChainTechnicalStack.ZkSync) { + if (!artifact) throw new Error(`No ZkSync contract artifact provided!`); - // Handle deployment for ZKSync protocol + // Handle deployment for ZkSync protocol const deployer = new ZKSyncDeployer(signer as ZKSyncWallet); const estimatedGas = await deployer.estimateDeployGas(artifact, params); diff --git a/typescript/sdk/src/providers/ProviderType.ts b/typescript/sdk/src/providers/ProviderType.ts index d8330affdf..bc124ba7d9 100644 --- a/typescript/sdk/src/providers/ProviderType.ts +++ b/typescript/sdk/src/providers/ProviderType.ts @@ -30,7 +30,7 @@ import { import { Annotated, ProtocolType } from '@hyperlane-xyz/utils'; export enum ProviderType { - ZKSync = 'zksync', + ZkSync = 'zksync', EthersV5 = 'ethers-v5', Viem = 'viem', SolanaWeb3 = 'solana-web3', @@ -103,7 +103,7 @@ interface TypedProviderBase { } export interface ZKSyncProvider extends TypedProviderBase { - type: ProviderType.ZKSync; + type: ProviderType.ZkSync; provider: ZKSyncBaseProvider; } @@ -154,7 +154,7 @@ interface TypedContractBase { } export interface ZKSyncContract extends TypedContractBase { - type: ProviderType.ZKSync; + type: ProviderType.ZkSync; contract: ZKSyncBaseContract; } export interface EthersV5Contract extends TypedContractBase { @@ -210,7 +210,7 @@ export interface EthersV5Transaction } export interface ZKSyncTransaction extends TypedTransactionBase { - type: ProviderType.ZKSync; + type: ProviderType.ZkSync; transaction: zkSyncTypes.TransactionRequest; } @@ -257,7 +257,7 @@ interface TypedTransactionReceiptBase { export interface ZKSyncTransactionReceipt extends TypedTransactionReceiptBase { - type: ProviderType.ZKSync; + type: ProviderType.ZkSync; receipt: zkSyncTypes.TransactionReceipt; } export interface EthersV5TransactionReceipt diff --git a/typescript/sdk/src/providers/providerBuilders.ts b/typescript/sdk/src/providers/providerBuilders.ts index 1203c3e74d..cfe773de95 100644 --- a/typescript/sdk/src/providers/providerBuilders.ts +++ b/typescript/sdk/src/providers/providerBuilders.ts @@ -118,7 +118,7 @@ export function defaultZKSyncProviderBuilder( assert(rpcUrls.length, 'No RPC URLs provided'); const url = rpcUrls[0].http; const provider = new ZKProvider(url, network); - return { type: ProviderType.ZKSync, provider }; + return { type: ProviderType.ZkSync, provider }; } // Kept for backwards compatibility @@ -147,7 +147,7 @@ export const defaultProviderBuilderMap: ProviderBuilderMap = { [ProviderType.SolanaWeb3]: defaultSolProviderBuilder, [ProviderType.CosmJs]: defaultCosmJsProviderBuilder, [ProviderType.CosmJsWasm]: defaultCosmJsWasmProviderBuilder, - [ProviderType.ZKSync]: defaultZKSyncProviderBuilder, + [ProviderType.ZkSync]: defaultZKSyncProviderBuilder, }; export const protocolToDefaultProviderBuilder: Record< diff --git a/typescript/sdk/src/router/HyperlaneRouterChecker.ts b/typescript/sdk/src/router/HyperlaneRouterChecker.ts index e514c8522e..7a8c5e3f1d 100644 --- a/typescript/sdk/src/router/HyperlaneRouterChecker.ts +++ b/typescript/sdk/src/router/HyperlaneRouterChecker.ts @@ -66,12 +66,7 @@ export class HyperlaneRouterChecker< }); } - if (config.hook) { - if (typeof config.hook !== 'string') - return this.logger.info( - `Hook objects not supported in router checker for HookConfig: ${config.hook}`, - ); - + if (config.hook && typeof config.hook === 'string') { const hook = await router.hook(); if (!eqAddress(hook, config.hook as string)) { this.addViolation({ diff --git a/typescript/sdk/src/token/checker.ts b/typescript/sdk/src/token/checker.ts index cf29d28c81..7f18e27b80 100644 --- a/typescript/sdk/src/token/checker.ts +++ b/typescript/sdk/src/token/checker.ts @@ -68,29 +68,7 @@ export class HypERC20Checker extends ProxiedRouterChecker< const expectedConfig = this.configMap[chain]; const hypToken = this.app.router(this.app.getContracts(chain)); - // Check all actual decimals are consistent - const actualChainDecimals = await this.getEvmActualDecimals(); - this.checkDecimalConsistency( - chain, - hypToken, - actualChainDecimals, - 'actual', - true, - ); - - // Check all config decimals are consistent as well - const configDecimals = objMap( - this.configMap, - (_chain, config) => config.decimals, - ); - this.checkDecimalConsistency( - chain, - hypToken, - configDecimals, - 'config', - false, - ); - + // Check if configured token type matches actual token type if (isNativeTokenConfig(expectedConfig)) { try { await this.multiProvider.estimateGas(chain, { @@ -126,6 +104,29 @@ export class HypERC20Checker extends ProxiedRouterChecker< this.addViolation(violation); } } + + // Check all actual decimals are consistent, this should be done after checking the token type to avoid 'decimal()' calls to non collateral token that would fail + const actualChainDecimals = await this.getEvmActualDecimals(); + this.checkDecimalConsistency( + chain, + hypToken, + actualChainDecimals, + 'actual', + true, + ); + + // Check all config decimals are consistent as well + const configDecimals = objMap( + this.configMap, + (_chain, config) => config.decimals, + ); + this.checkDecimalConsistency( + chain, + hypToken, + configDecimals, + 'config', + false, + ); } private cachedAllActualDecimals: Record | undefined = diff --git a/typescript/sdk/src/utils/validator.ts b/typescript/sdk/src/utils/validator.ts index c49612f8a7..10f5a0d510 100644 --- a/typescript/sdk/src/utils/validator.ts +++ b/typescript/sdk/src/utils/validator.ts @@ -10,3 +10,10 @@ export async function getValidatorFromStorageLocation(location: string) { throw new Error('Invalid storage location'); } } + +export function isValidValidatorStorageLocation(location: string) { + return ( + location?.startsWith(GCP_LOCATION_PREFIX) || + location?.startsWith(S3_LOCATION_PREFIX) + ); +} diff --git a/typescript/sdk/src/zksync/ZKSyncDeployer.ts b/typescript/sdk/src/zksync/ZKSyncDeployer.ts index fc41628150..7dabdc7631 100644 --- a/typescript/sdk/src/zksync/ZKSyncDeployer.ts +++ b/typescript/sdk/src/zksync/ZKSyncDeployer.ts @@ -45,7 +45,7 @@ export class ZKSyncDeployer { }, ); - assert(artifact, `No ZKSync artifact for contract ${contractTitle} found!`); + assert(artifact, `No ZkSync artifact for contract ${contractTitle} found!`); return artifact as any; } diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index 3cf2756603..1b8b3ef758 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @hyperlane-xyz/utils +## 8.0.0 + +### Minor Changes + +- 79f8197f3: Added `isPrivateKeyEvm` function for validating EVM private keys + +### Patch Changes + +- 8834a8c92: Require concurrency > 0 for concurrentMap + ## 7.3.0 ## 7.2.0 diff --git a/typescript/utils/package.json b/typescript/utils/package.json index 8b24cb7106..784886b1f7 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": "7.3.0", + "version": "8.0.0", "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", diff --git a/typescript/utils/src/async.ts b/typescript/utils/src/async.ts index f9bda74eb1..505318e32a 100644 --- a/typescript/utils/src/async.ts +++ b/typescript/utils/src/async.ts @@ -1,4 +1,5 @@ import { rootLogger } from './logging.js'; +import { assert } from './validation.js'; /** * Return a promise that resolves in ms milliseconds. @@ -159,6 +160,7 @@ export async function concurrentMap( mapFn: (val: A, idx: number) => Promise, ): Promise { let res: B[] = []; + assert(concurrency > 0, 'concurrency must be greater than 0'); for (let i = 0; i < xs.length; i += concurrency) { const remaining = xs.length - i; const sliceSize = Math.min(remaining, concurrency); diff --git a/typescript/utils/src/ids.ts b/typescript/utils/src/ids.ts index ff7bca0420..c3f3296377 100644 --- a/typescript/utils/src/ids.ts +++ b/typescript/utils/src/ids.ts @@ -20,7 +20,7 @@ export function canonizeId(data: BytesLike): Uint8Array { } /** - * Converts an Hyperlane ID of 20 or 32 bytes to the corresponding EVM Address. + * Converts a Hyperlane ID of 20 or 32 bytes to the corresponding EVM Address. * * For 32-byte IDs this enforces the EVM convention of using the LAST 20 bytes. * diff --git a/typescript/utils/src/validator.ts b/typescript/utils/src/validator.ts index 99cb9772ee..63f135909d 100644 --- a/typescript/utils/src/validator.ts +++ b/typescript/utils/src/validator.ts @@ -93,4 +93,16 @@ export class BaseValidator { ); return eqAddress(address, this.config.address); } + + getLatestCheckpointIndex(): Promise { + throw new Error('Not implemented'); + } + + storageLocation(): string { + throw new Error('Not implemented'); + } + + getLatestCheckpointUrl(): string { + throw new Error('Not implemented'); + } } diff --git a/typescript/widgets/CHANGELOG.md b/typescript/widgets/CHANGELOG.md index be73ca35c6..328d76a977 100644 --- a/typescript/widgets/CHANGELOG.md +++ b/typescript/widgets/CHANGELOG.md @@ -1,5 +1,32 @@ # @hyperlane-xyz/widgets +## 8.0.0 + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 + +### Patch Changes + +- 472b34670: Bump registry version to v6.3.0. +- a2b5efbf9: Hide outline in button and text input components +- e3f5a0a37: Allow empty data field in ethers5TxToWagmiTx +- Updated dependencies [472b34670] +- Updated dependencies [79f8197f3] +- Updated dependencies [fd20bb1e9] +- Updated dependencies [26fbec8f6] +- Updated dependencies [71aefa03e] +- Updated dependencies [9f6b8c514] +- Updated dependencies [82cebabe4] +- Updated dependencies [95cc9571e] +- Updated dependencies [c690ca82f] +- Updated dependencies [5942e9cff] +- Updated dependencies [de1190656] +- Updated dependencies [e9911bb9d] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/sdk@8.0.0 + - @hyperlane-xyz/utils@8.0.0 + ## 7.3.0 ### Patch Changes diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index 701ff8ddd8..9c008450f7 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/widgets", "description": "Common react components for Hyperlane projects", - "version": "7.3.0", + "version": "8.0.0", "peerDependencies": { "react": "^18", "react-dom": "^18" @@ -9,8 +9,8 @@ "dependencies": { "@cosmos-kit/react": "^2.18.0", "@headlessui/react": "^2.1.8", - "@hyperlane-xyz/sdk": "7.3.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/sdk": "8.0.0", + "@hyperlane-xyz/utils": "8.0.0", "@interchain-ui/react": "^1.23.28", "@rainbow-me/rainbowkit": "^2.2.0", "@solana/wallet-adapter-react": "^0.15.32", diff --git a/typescript/widgets/src/components/Button.tsx b/typescript/widgets/src/components/Button.tsx index e983bd5645..19114a6cbb 100644 --- a/typescript/widgets/src/components/Button.tsx +++ b/typescript/widgets/src/components/Button.tsx @@ -7,7 +7,7 @@ export function Button(props: Props) { const { className, children, ...rest } = props; const base = - 'htw-flex htw-items-center htw-justify-center htw-rounded-sm htw-transition-all'; + 'htw-flex htw-items-center htw-justify-center htw-rounded-sm htw-transition-all htw-outline-none focus:htw-outline-none'; const onHover = 'hover:htw-opacity-80'; const onDisabled = 'disabled:htw-opacity-30 disabled:htw-cursor-default'; const onActive = 'active:htw-scale-95'; diff --git a/typescript/widgets/src/components/TextInput.tsx b/typescript/widgets/src/components/TextInput.tsx index 42f74f199d..ba24445caa 100644 --- a/typescript/widgets/src/components/TextInput.tsx +++ b/typescript/widgets/src/components/TextInput.tsx @@ -22,7 +22,7 @@ export function _TextInput( type="text" autoComplete="off" onChange={handleChange} - className={`htw-bg-gray-100 focus:htw-bg-gray-200 disabled:htw-bg-gray-500 htw-outline-none htw-transition-all htw-duration-300 ${className}`} + className={`htw-bg-gray-100 focus:htw-bg-gray-200 disabled:htw-bg-gray-500 htw-outline-none focus:htw-outline-none htw-transition-all htw-duration-300 ${className}`} {...props} /> ); diff --git a/typescript/widgets/src/icons/Discord.tsx b/typescript/widgets/src/icons/Discord.tsx index 28a3d93f1d..16e9761248 100644 --- a/typescript/widgets/src/icons/Discord.tsx +++ b/typescript/widgets/src/icons/Discord.tsx @@ -7,14 +7,14 @@ import { DefaultIconProps } from './types.js'; function _Discord({ color, ...rest }: DefaultIconProps) { return ( - + - + diff --git a/typescript/widgets/src/walletIntegrations/utils.ts b/typescript/widgets/src/walletIntegrations/utils.ts index b0a994f1d8..6c2d485857 100644 --- a/typescript/widgets/src/walletIntegrations/utils.ts +++ b/typescript/widgets/src/walletIntegrations/utils.ts @@ -11,11 +11,10 @@ export function ethers5TxToWagmiTx( tx: Ethers5Transaction, ): SendTransactionParameters { if (!tx.to) throw new Error('No tx recipient address specified'); - if (!tx.data) throw new Error('No tx data specified'); return { to: tx.to as `0x${string}`, value: ethersBnToBigInt(tx.value || EthersBN.from('0')), - data: tx.data as `0x{string}`, + data: tx.data as `0x{string}` | undefined, nonce: tx.nonce, chainId: tx.chainId, gas: tx.gasLimit ? ethersBnToBigInt(tx.gasLimit) : undefined, diff --git a/yarn.lock b/yarn.lock index 352415d7e0..bf89af1a15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7212,30 +7212,6 @@ __metadata: languageName: node linkType: hard -"@google-cloud/paginator@npm:^5.0.0": - version: 5.0.2 - resolution: "@google-cloud/paginator@npm:5.0.2" - dependencies: - arrify: "npm:^2.0.0" - extend: "npm:^3.0.2" - checksum: 10/b64ba2029b77fdcf3c827aea0b6d128122fd1d2f4aa8c1ba70747cba0659d4216a283769fb3bbeb8f726176f5282624637f02c30f118a010e05838411da0cb76 - languageName: node - linkType: hard - -"@google-cloud/projectify@npm:^4.0.0": - version: 4.0.0 - resolution: "@google-cloud/projectify@npm:4.0.0" - checksum: 10/fdccdda0b50855c35541d71c46a6603f3302ff1a00108d946272cb2167435da00e2a2da5963fe489f4f5a4a9eb6320abeb97d3269974a972ae89f5df8451922d - languageName: node - linkType: hard - -"@google-cloud/promisify@npm:^4.0.0": - version: 4.0.0 - resolution: "@google-cloud/promisify@npm:4.0.0" - checksum: 10/c5de81321b3a5c567edcbe0b941fb32644611147f3ba22f20575918c225a979988a99bc2ebda05ac914fa8714b0a54c69be72c3f46c7a64c3b19db7d7fba8d04 - languageName: node - linkType: hard - "@google-cloud/secret-manager@npm:^5.5.0": version: 5.5.0 resolution: "@google-cloud/secret-manager@npm:5.5.0" @@ -7245,29 +7221,6 @@ __metadata: languageName: node linkType: hard -"@google-cloud/storage@npm:7.14.0": - version: 7.14.0 - resolution: "@google-cloud/storage@npm:7.14.0" - dependencies: - "@google-cloud/paginator": "npm:^5.0.0" - "@google-cloud/projectify": "npm:^4.0.0" - "@google-cloud/promisify": "npm:^4.0.0" - abort-controller: "npm:^3.0.0" - async-retry: "npm:^1.3.3" - duplexify: "npm:^4.1.3" - fast-xml-parser: "npm:^4.4.1" - gaxios: "npm:^6.0.2" - google-auth-library: "npm:^9.6.3" - html-entities: "npm:^2.5.2" - mime: "npm:^3.0.0" - p-limit: "npm:^3.0.1" - retry-request: "npm:^7.0.0" - teeny-request: "npm:^9.0.0" - uuid: "npm:^8.0.0" - checksum: 10/0726fde2697da696637fab91ebd756354a58c1331f6a0b9ecc5011de4aae72cd9e1fe3e9564aee15c6a2118e45ed0ae8c3ac9685c6581db6107080f906a949e9 - languageName: node - linkType: hard - "@grpc/grpc-js@npm:~1.10.3": version: 1.10.8 resolution: "@grpc/grpc-js@npm:1.10.8" @@ -7375,11 +7328,12 @@ __metadata: "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.0.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" "@inquirer/prompts": "npm:3.3.2" + "@inquirer/search": "npm:^3.0.1" "@types/chai-as-promised": "npm:^8" "@types/mocha": "npm:^10.0.1" "@types/node": "npm:^18.14.5" @@ -7414,13 +7368,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:5.8.3, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:5.9.0, @hyperlane-xyz/core@workspace:solidity": version: 0.0.0-use.local resolution: "@hyperlane-xyz/core@workspace:solidity" dependencies: "@arbitrum/nitro-contracts": "npm:^1.2.1" "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@matterlabs/hardhat-zksync-solc": "npm:^1.2.4" @@ -7473,14 +7427,14 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/helloworld@npm:7.3.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:8.0.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:5.8.3" + "@hyperlane-xyz/core": "npm:5.9.0" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.0.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -7529,10 +7483,10 @@ __metadata: "@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/providers": "npm:*" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:7.3.0" + "@hyperlane-xyz/helloworld": "npm:8.0.0" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.0.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@inquirer/prompts": "npm:3.3.2" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" @@ -7602,7 +7556,7 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:7.3.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:8.0.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: @@ -7612,9 +7566,8 @@ __metadata: "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" "@eslint/js": "npm:^9.15.0" - "@google-cloud/storage": "npm:7.14.0" - "@hyperlane-xyz/core": "npm:5.8.3" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/core": "npm:5.9.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -7658,7 +7611,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/utils@npm:7.3.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:8.0.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: @@ -7700,8 +7653,8 @@ __metadata: "@eslint/js": "npm:^9.15.0" "@headlessui/react": "npm:^2.1.8" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.0.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@interchain-ui/react": "npm:^1.23.28" "@rainbow-me/rainbowkit": "npm:^2.2.0" "@solana/wallet-adapter-react": "npm:^0.15.32" @@ -7795,6 +7748,23 @@ __metadata: languageName: node linkType: hard +"@inquirer/core@npm:^10.1.2": + version: 10.1.2 + resolution: "@inquirer/core@npm:10.1.2" + dependencies: + "@inquirer/figures": "npm:^1.0.9" + "@inquirer/type": "npm:^3.0.2" + ansi-escapes: "npm:^4.3.2" + cli-width: "npm:^4.1.0" + mute-stream: "npm:^2.0.0" + signal-exit: "npm:^4.1.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^6.2.0" + yoctocolors-cjs: "npm:^2.1.2" + checksum: 10/e92ade5ba7dbcfd83629db2df7fb91877ac777a7f1e03a16b0d5c08621dafe09d321c5f14b37c2dca80a3db2d68e5a478f8eaeafcb62ed42c46e7349b7276094 + languageName: node + linkType: hard + "@inquirer/core@npm:^6.0.0": version: 6.0.0 resolution: "@inquirer/core@npm:6.0.0" @@ -7848,6 +7818,13 @@ __metadata: languageName: node linkType: hard +"@inquirer/figures@npm:^1.0.9": + version: 1.0.9 + resolution: "@inquirer/figures@npm:1.0.9" + checksum: 10/7ced1275a5826cdeb61797d6c068417e7d52aa87894de18cedd259f783f42d731226c3f8b92cab27b8e7b0e31ab1dd3cd77f16935b67ebe1cbb271e5972d7758 + languageName: node + linkType: hard + "@inquirer/input@npm:^1.2.16": version: 1.2.16 resolution: "@inquirer/input@npm:1.2.16" @@ -7899,6 +7876,20 @@ __metadata: languageName: node linkType: hard +"@inquirer/search@npm:^3.0.1": + version: 3.0.4 + resolution: "@inquirer/search@npm:3.0.4" + dependencies: + "@inquirer/core": "npm:^10.1.2" + "@inquirer/figures": "npm:^1.0.9" + "@inquirer/type": "npm:^3.0.2" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + checksum: 10/e2363f808e32983d659049cabc21f57e8b7dd7b591677b4bd1be0c45653e3d86f98f1772f3866bc97f14f63983399b259e8956eda181fafbe7eea07f8169bd95 + languageName: node + linkType: hard + "@inquirer/select@npm:^1.3.3": version: 1.3.3 resolution: "@inquirer/select@npm:1.3.3" @@ -7930,6 +7921,15 @@ __metadata: languageName: node linkType: hard +"@inquirer/type@npm:^3.0.2": + version: 3.0.2 + resolution: "@inquirer/type@npm:3.0.2" + peerDependencies: + "@types/node": ">=18" + checksum: 10/d1a2879b1baa357421cef441fc7b43181e110243933763ae922c55c2fc9af2d459ceaca8b71ed57e3dabd5077542fa0dd1d0ff0cf362ce054e61202386b545ed + languageName: node + linkType: hard + "@interchain-ui/react@npm:^1.23.28": version: 1.26.1 resolution: "@interchain-ui/react@npm:1.26.1" @@ -17965,13 +17965,6 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^2.0.0": - version: 2.0.1 - resolution: "arrify@npm:2.0.1" - checksum: 10/067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209 - languageName: node - linkType: hard - "as-table@npm:^1.0.36": version: 1.0.55 resolution: "as-table@npm:1.0.55" @@ -21270,7 +21263,7 @@ __metadata: languageName: node linkType: hard -"duplexify@npm:^4.0.0, duplexify@npm:^4.1.2, duplexify@npm:^4.1.3": +"duplexify@npm:^4.0.0, duplexify@npm:^4.1.2": version: 4.1.3 resolution: "duplexify@npm:4.1.3" dependencies: @@ -23398,17 +23391,6 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:^4.4.1": - version: 4.5.0 - resolution: "fast-xml-parser@npm:4.5.0" - dependencies: - strnum: "npm:^1.0.5" - bin: - fxparser: src/cli/cli.js - checksum: 10/dc9571c10e7b57b5be54bcd2d92f50c446eb42ea5df347d253e94dd14eb99b5300a6d172e840f151e0721933ca2406165a8d9b316a6d777bf0596dc4fe1df756 - languageName: node - linkType: hard - "fastq@npm:^1.6.0": version: 1.13.0 resolution: "fastq@npm:1.13.0" @@ -24151,19 +24133,6 @@ __metadata: languageName: node linkType: hard -"gaxios@npm:^6.0.2": - version: 6.7.1 - resolution: "gaxios@npm:6.7.1" - dependencies: - extend: "npm:^3.0.2" - https-proxy-agent: "npm:^7.0.1" - is-stream: "npm:^2.0.0" - node-fetch: "npm:^2.6.9" - uuid: "npm:^9.0.1" - checksum: 10/c85599162208884eadee91215ebbfa1faa412551df4044626cb561300e15193726e8f23d63b486533e066dadad130f58ed872a23acab455238d8d48b531a0695 - languageName: node - linkType: hard - "gcp-metadata@npm:^6.1.0": version: 6.1.0 resolution: "gcp-metadata@npm:6.1.0" @@ -24671,20 +24640,6 @@ __metadata: languageName: node linkType: hard -"google-auth-library@npm:^9.6.3": - version: 9.15.0 - resolution: "google-auth-library@npm:9.15.0" - dependencies: - base64-js: "npm:^1.3.0" - ecdsa-sig-formatter: "npm:^1.0.11" - gaxios: "npm:^6.1.1" - gcp-metadata: "npm:^6.1.0" - gtoken: "npm:^7.0.0" - jws: "npm:^4.0.0" - checksum: 10/fba2db9732bbf1b3a3a2e2b45131ba8e8aba297377f1c104d0b2ab3386bbc1e02047f20b8a7afca1c6308492da1540104618f1c7b5cd539703552e10399c560e - languageName: node - linkType: hard - "google-gax@npm:^4.0.3": version: 4.3.3 resolution: "google-gax@npm:4.3.3" @@ -25366,13 +25321,6 @@ __metadata: languageName: node linkType: hard -"html-entities@npm:^2.5.2": - version: 2.5.2 - resolution: "html-entities@npm:2.5.2" - checksum: 10/4ec12ebdf2d5ba8192c68e1aef3c1e4a4f36b29246a0a88464fe278a54517d0196d3489af46a3145c7ecacb4fc5fd50497be19eb713b810acab3f0efcf36fdc2 - languageName: node - linkType: hard - "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -29348,6 +29296,13 @@ __metadata: languageName: node linkType: hard +"mute-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "mute-stream@npm:2.0.0" + checksum: 10/d2e4fd2f5aa342b89b98134a8d899d8ef9b0a6d69274c4af9df46faa2d97aeb1f2ce83d867880d6de63643c52386579b99139801e24e7526c3b9b0a6d1e18d6c + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -30329,7 +30284,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.1, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -36757,7 +36712,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.0.0, uuid@npm:^8.3.2": +"uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: