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/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/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/five-bats-attend.md b/.changeset/five-bats-attend.md deleted file mode 100644 index 02a7c986bb..0000000000 --- a/.changeset/five-bats-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': patch ---- - -fix: balance check skip confirmation diff --git a/.changeset/flat-lamps-deliver.md b/.changeset/flat-lamps-deliver.md new file mode 100644 index 0000000000..bca1b390b8 --- /dev/null +++ b/.changeset/flat-lamps-deliver.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/infra': minor +--- + +Add Artela/Base USDC and WETH warp route config 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/green-schools-attack.md b/.changeset/green-schools-attack.md new file mode 100644 index 0000000000..e795b807f0 --- /dev/null +++ b/.changeset/green-schools-attack.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': patch +--- + +Print displayName instead of chain name in signer validity logs. 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/lovely-planes-end.md b/.changeset/lovely-planes-end.md deleted file mode 100644 index 81bd6a8598..0000000000 --- a/.changeset/lovely-planes-end.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor -'@hyperlane-xyz/sdk': minor ---- - -Allow self-relaying of all messages if there are multiple in a given dispatch transaction. diff --git a/.changeset/many-clouds-bow.md b/.changeset/many-clouds-bow.md deleted file mode 100644 index b481b543ff..0000000000 --- a/.changeset/many-clouds-bow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Call google storage API directly and remove @google-cloud/storage dependency from the SDK. diff --git a/.changeset/neat-apples-marry.md b/.changeset/neat-apples-marry.md deleted file mode 100644 index 514ac94ce8..0000000000 --- a/.changeset/neat-apples-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/infra': minor ---- - -added ubtc route extension config + usdc from appchain to base diff --git a/.changeset/new-seas-ring.md b/.changeset/new-seas-ring.md deleted file mode 100644 index a8462e4ff4..0000000000 --- a/.changeset/new-seas-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Deploy to new chains: arthera, aurora, conflux, conwai, corn, evmos, form, ink, rivalz, soneium, sonic, telos. 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/pink-sloths-turn.md b/.changeset/pink-sloths-turn.md deleted file mode 100644 index 9c7cf6ea56..0000000000 --- a/.changeset/pink-sloths-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/widgets': patch ---- - -Hide outline in button and text input components diff --git a/.changeset/polite-bulldogs-sit.md b/.changeset/polite-bulldogs-sit.md deleted file mode 100644 index 8acf555fe5..0000000000 --- a/.changeset/polite-bulldogs-sit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperlane-xyz/cli": patch ---- - -Fix strategy flag propagation diff --git a/.changeset/real-actors-grow.md b/.changeset/real-actors-grow.md new file mode 100644 index 0000000000..b7764b2bc2 --- /dev/null +++ b/.changeset/real-actors-grow.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Don't try to build signers for non-EVM chains in MultiProtocolSignerManager 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/ten-spiders-trade.md b/.changeset/ten-spiders-trade.md deleted file mode 100644 index 91eebf52f7..0000000000 --- a/.changeset/ten-spiders-trade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': patch ---- - -Added ZKSync signer support using zksync-ethers package diff --git a/.changeset/three-walls-count.md b/.changeset/three-walls-count.md new file mode 100644 index 0000000000..37145b9838 --- /dev/null +++ b/.changeset/three-walls-count.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Add explorer link to warp send and send message commands diff --git a/.changeset/violet-knives-drop.md b/.changeset/violet-knives-drop.md new file mode 100644 index 0000000000..24320605a0 --- /dev/null +++ b/.changeset/violet-knives-drop.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Fixing the chain resolver checks and handling for argv.chain diff --git a/.github/actions/checkout-registry/action.yml b/.github/actions/checkout-registry/action.yml index 929ea75399..bd8aab1c91 100644 --- a/.github/actions/checkout-registry/action.yml +++ b/.github/actions/checkout-registry/action.yml @@ -21,6 +21,7 @@ runs: with: repository: hyperlane-xyz/hyperlane-registry ref: ${{ env.REGISTRY_VERSION }} + fetch-depth: 0 path: ./hyperlane-registry - name: Move hyperlane-registry to parent directory diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 98426a76a6..12f8c90f4a 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 @@ -294,6 +300,8 @@ jobs: env: MAINNET3_ARBITRUM_RPC_URLS: ${{ secrets.MAINNET3_ARBITRUM_RPC_URLS }} MAINNET3_OPTIMISM_RPC_URLS: ${{ secrets.MAINNET3_OPTIMISM_RPC_URLS }} + MAINNET3_ETHEREUM_RPC_URLS: ${{ secrets.MAINNET3_ETHEREUM_RPC_URLS }} + TESTNET4_SEPOLIA_RPC_URLS: ${{ secrets.TESTNET4_SEPOLIA_RPC_URLS }} timeout-minutes: 10 needs: [yarn-install] @@ -301,7 +309,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 @@ -324,8 +332,15 @@ jobs: - name: Checkout registry uses: ./.github/actions/checkout-registry - - name: Fork test ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} deployment - run: cd typescript/infra && ./fork.sh ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} + - name: Fork test ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} deployment with retries + uses: nick-fields/retry@v3 + with: + timeout_minutes: 8 + max_attempts: 3 + retry_wait_seconds: 30 + command: cd typescript/infra && ./fork.sh ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} + on_retry_command: | + echo "Test failed, waiting before retry..." coverage: runs-on: ubuntu-latest diff --git a/.registryrc b/.registryrc index 7c11b8020a..07fa36dc52 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -207a4ffe96b0f33701ca6f92d8ca4905a8a0233a +5e7227c712cca3d2b576fe7e67a434294fcc0a7f diff --git a/Dockerfile b/Dockerfile index 555228e90d..6f8e3939d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,4 +34,5 @@ ENV REGISTRY_URI="/hyperlane-registry" ARG REGISTRY_COMMIT="main" RUN git clone https://github.com/hyperlane-xyz/hyperlane-registry.git "$REGISTRY_URI" \ && cd "$REGISTRY_URI" \ + && git fetch origin "$REGISTRY_COMMIT" \ && git checkout "$REGISTRY_COMMIT" 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 c14e211f03..f13ac028c5 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,29 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cosmos-sdk-proto" -version = "0.19.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c9d2043a9e617b0d602fbc0a0ecd621568edbf3a9774890a6d562389bd8e1c" +checksum = "462e1f6a8e005acc8835d32d60cbd7973ed65ea2a8d8473830e675f050956427" 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", + "tendermint-proto", + "tonic 0.12.3", ] [[package]] name = "cosmrs" -version = "0.14.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af13955d6f356272e6def9ff5e2450a7650df536d8934f47052a20c76513d2f6" +checksum = "210fbe6f98594963b46cc980f126a9ede5db9a3848ca65b71303bebdb01afcd9" 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", @@ -1643,7 +1705,20 @@ version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b4cd28147a66eba73720b47636a58097a979ad8c8bfdb4ed437ebcbfe362576" dependencies = [ - "cosmwasm-schema-derive", + "cosmwasm-schema-derive 1.5.7", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e9a7b56d154870ec4b57b224509854f706c9744449548d8a3bf91ac75c59192" +dependencies = [ + "cosmwasm-schema-derive 2.2.0", "schemars", "serde", "serde_json", @@ -1661,6 +1736,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "cosmwasm-schema-derive" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd3d80310cd7b86b09dbe886f4f2ca235a5ddb8d478493c6e50e720a3b38a42" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "cosmwasm-std" version = "1.5.7" @@ -1855,23 +1941,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" @@ -1961,7 +2038,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" dependencies = [ - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cw2", "schemars", @@ -1976,7 +2053,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" dependencies = [ - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cw-storage-plus", "schemars", @@ -1991,7 +2068,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "526e39bb20534e25a1cd0386727f0038f4da294e5e535729ba3ef54055246abd" dependencies = [ - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cw-utils", "schemars", @@ -2004,7 +2081,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ad79e86ea3707229bf78df94e08732e8f713207b4a77b2699755596725e7d9" dependencies = [ - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cw-storage-plus", "cw2", @@ -2901,7 +2978,7 @@ dependencies = [ [[package]] name = "ethers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-addressbook", "ethers-contract", @@ -2915,7 +2992,7 @@ dependencies = [ [[package]] name = "ethers-addressbook" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-core", "once_cell", @@ -2926,7 +3003,7 @@ dependencies = [ [[package]] name = "ethers-contract" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -2944,7 +3021,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "Inflector", "cfg-if", @@ -2960,7 +3037,7 @@ dependencies = [ "serde", "serde_json", "syn 1.0.109", - "toml", + "toml 0.5.11", "url", "walkdir", ] @@ -2968,7 +3045,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -2982,7 +3059,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "arrayvec", "bytes", @@ -3012,7 +3089,7 @@ dependencies = [ [[package]] name = "ethers-etherscan" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-core", "getrandom 0.2.15", @@ -3028,7 +3105,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "auto_impl 0.5.0", @@ -3047,6 +3124,7 @@ dependencies = [ "tokio", "tracing", "tracing-futures", + "tracing-test", "url", ] @@ -3076,7 +3154,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "auto_impl 1.2.0", @@ -3112,7 +3190,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "coins-bip32 0.7.0", @@ -3149,9 +3227,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 +3465,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 +4076,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 +4303,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 +4349,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 +4369,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 +4430,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 +4445,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 +4473,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 +4488,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 +4514,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", @@ -4510,18 +4646,19 @@ version = "0.1.0" dependencies = [ "async-trait", "base64 0.21.7", - "bech32 0.9.1", + "bech32 0.11.0", "cosmrs", "cosmwasm-std 2.1.3", "crypto", "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", + "ibc-proto", "injective-protobuf", "injective-std", "itertools 0.12.1", @@ -4537,7 +4674,7 @@ dependencies = [ "thiserror", "time", "tokio", - "tonic 0.9.2", + "tonic 0.12.3", "tracing", "tracing-futures", "url", @@ -4550,7 +4687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5e622014ab94f1e7f0acbe71df7c1384224261e2c76115807aaf24215970942" dependencies = [ "bech32 0.9.1", - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cosmwasm-storage", "cw-storage-plus", @@ -4771,6 +4908,38 @@ dependencies = [ "cc", ] +[[package]] +name = "ibc-proto" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b70f517162e74e2d35875b8b94bf4d1e45f2c69ef3de452dc855944455d33ca" +dependencies = [ + "base64 0.22.1", + "bytes", + "cosmos-sdk-proto", + "flex-error", + "ics23", + "informalsystems-pbjson", + "prost 0.13.4", + "subtle-encoding", + "tendermint-proto", + "tonic 0.12.3", +] + +[[package]] +name = "ics23" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b17f1a5bd7d12ad30a21445cfa5f52fd7651cb3243ba866f9916b1ec112f12" +dependencies = [ + "anyhow", + "bytes", + "hex 0.4.3", + "informalsystems-pbjson", + "prost 0.13.4", + "serde", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -4957,6 +5126,16 @@ dependencies = [ "regex", ] +[[package]] +name = "informalsystems-pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa4a0980c8379295100d70854354e78df2ee1c6ca0f96ffe89afeb3140e3a3d" +dependencies = [ + "base64 0.21.7", + "serde", +] + [[package]] name = "injective-protobuf" version = "0.2.2" @@ -4975,20 +5154,33 @@ dependencies = [ [[package]] name = "injective-std" -version = "0.1.5" +version = "1.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7a5b52d19dca05823c7e4b481d41b49c04a0e56f66a5c92396a6fdd3314710" +checksum = "e8769c5d05b3124245276fbd693282c0bfaab81536d12881d06ba74a992a55c2" 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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cfe3fc8519277af8e09e51b8987435e401d345d4466402e6a5b991143fdfa53" +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" @@ -5140,9 +5332,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" @@ -5527,7 +5719,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -5953,18 +6145,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 +6328,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 +6338,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 +6349,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 +6618,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 +6629,7 @@ checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ "once_cell", "thiserror", - "toml", + "toml 0.5.11", ] [[package]] @@ -6543,42 +6723,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 +6769,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 +6874,7 @@ dependencies = [ "thiserror", "tokio", "tracing", - "webpki 0.22.4", + "webpki", ] [[package]] @@ -6714,7 +6894,7 @@ dependencies = [ "thiserror", "tinyvec", "tracing", - "webpki 0.22.4", + "webpki", ] [[package]] @@ -6979,7 +7159,7 @@ name = "relayer" version = "0.1.0" dependencies = [ "async-trait", - "axum", + "axum 0.6.20", "config", "console-subscriber", "convert_case 0.6.0", @@ -6989,6 +7169,7 @@ dependencies = [ "dhat", "ethers", "ethers-contract", + "ethers-prometheus", "eyre", "futures", "futures-util", @@ -7014,6 +7195,7 @@ dependencies = [ "tokio-test", "tracing", "tracing-futures", + "tracing-test", "typetag", ] @@ -7040,11 +7222,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 +7237,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", @@ -7230,7 +7413,7 @@ name = "run-locally" version = "0.1.0" dependencies = [ "anyhow", - "cosmwasm-schema", + "cosmwasm-schema 2.2.0", "ctrlc", "ethers", "ethers-contract", @@ -7273,7 +7456,7 @@ dependencies = [ "crc32fast", "futures", "http 0.2.12", - "hyper", + "hyper 0.14.30", "hyper-tls", "lazy_static", "log", @@ -7296,7 +7479,7 @@ dependencies = [ "chrono", "dirs-next", "futures", - "hyper", + "hyper 0.14.30", "serde", "serde_json", "shlex", @@ -7345,7 +7528,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 +7632,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 +7711,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 +7736,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 +7914,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 +8156,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 +8177,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 +8310,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 +9495,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 +9565,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 +9601,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 +9663,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.40.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9703e34d940c2a293804752555107f8dbe2b84ec4c6dd5203831235868105d2" dependencies = [ "bytes", "digest 0.10.7", @@ -9446,8 +9676,7 @@ dependencies = [ "k256 0.13.4", "num-traits", "once_cell", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.13.4", "ripemd", "serde", "serde_bytes", @@ -9457,53 +9686,34 @@ 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.40.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89cc3ea9a39b7ee34eefcff771cc067ecaa0c988c1c5ac08defd878471a06f76" dependencies = [ "flex-error", "serde", "serde_json", "tendermint", - "toml", + "toml 0.8.19", "url", ] [[package]] name = "tendermint-proto" -version = "0.32.2" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" +checksum = "9ae9e1705aa0fa5ecb2c6aa7fb78c2313c4a31158ea5f02048bf318f849352eb" 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" -dependencies = [ - "bytes", - "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.13.4", "serde", "serde_bytes", "subtle-encoding", @@ -9512,20 +9722,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.40.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a52aa504c63ec05519e31348d3f4ba2fe79493c588e2cad5323d5e81b161a" 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 +9743,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 +9906,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -9726,9 +9935,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -9758,41 +9967,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 +10032,7 @@ dependencies = [ "tokio", "tokio-rustls 0.23.4", "tungstenite 0.17.3", - "webpki 0.22.4", + "webpki", "webpki-roots 0.22.6", ] @@ -9862,11 +10070,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 +10109,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 +10148,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 +10199,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 +10365,7 @@ dependencies = [ "thiserror", "url", "utf-8", - "webpki 0.22.4", + "webpki", "webpki-roots 0.22.6", ] @@ -10138,7 +10378,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http 1.2.0", "httparse", "log", "rand 0.8.5", @@ -10374,7 +10614,7 @@ name = "validator" version = "0.1.0" dependencies = [ "async-trait", - "axum", + "axum 0.6.20", "chrono", "config", "console-subscriber", @@ -10474,7 +10714,7 @@ dependencies = [ "futures-util", "headers", "http 0.2.12", - "hyper", + "hyper 0.14.30", "log", "mime", "mime_guess", @@ -10602,16 +10842,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 +10852,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 +11186,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 +11197,7 @@ dependencies = [ "thiserror", "tokio", "tonic 0.10.2", - "tower", + "tower 0.4.13", "tracing", "yup-oauth2", ] @@ -11010,8 +11231,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 55cfc1573a..d6e9cc7b11 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.21.0", default-features = false, features = [ "cosmwasm", "rpc", "tokio", @@ -69,16 +69,17 @@ futures = "0.3" futures-util = "0.3" generic-array = { version = "0.14", features = ["serde", "more_lengths"] } # Required for WASM support https://docs.rs/getrandom/latest/getrandom/#webassembly-support -bech32 = "0.9.1" +bech32 = "0.11.0" 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" +ibc-proto = "0.51.1" injective-protobuf = "0.2.2" -injective-std = "=0.1.5" +injective-std = "1.13.6" itertools = "*" jobserver = "=0.1.26" jsonrpc-core = "18.0" @@ -134,16 +135,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.40.1" +tendermint-rpc = { version = "0.40.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" @@ -159,7 +160,7 @@ which = "4.3" ya-gcp = { version = "0.11.3", features = ["storage"] } ## TODO: remove this -cosmwasm-schema = "1.2.7" +cosmwasm-schema = "2.2.0" [profile.release.package.access-control] overflow-checks = true @@ -198,27 +199,27 @@ overflow-checks = true [workspace.dependencies.ethers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2025-01-10" [workspace.dependencies.ethers-contract] features = ["legacy"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2025-01-10" [workspace.dependencies.ethers-core] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2025-01-10" [workspace.dependencies.ethers-providers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2025-01-10" [workspace.dependencies.ethers-signers] features = ["aws"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2025-01-10" [patch.crates-io.curve25519-dalek] branch = "v3.2.2-relax-zeroize" @@ -299,13 +300,3 @@ version = "=0.5.0" 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" diff --git a/rust/main/agents/relayer/Cargo.toml b/rust/main/agents/relayer/Cargo.toml index 5a891d912c..ac0e198945 100644 --- a/rust/main/agents/relayer/Cargo.toml +++ b/rust/main/agents/relayer/Cargo.toml @@ -56,9 +56,11 @@ hyperlane-ethereum = { path = "../../chains/hyperlane-ethereum" } once_cell.workspace = true mockall.workspace = true tokio-test.workspace = true +tracing-test.workspace = true hyperlane-test = { path = "../../hyperlane-test" } hyperlane-base = { path = "../../hyperlane-base", features = ["test-utils"] } hyperlane-core = { path = "../../hyperlane-core", features = ["agent", "async", "test-utils"] } +ethers-prometheus = { path = "../../ethers-prometheus", features = ["serde"] } [features] default = ["color-eyre", "oneline-errors"] diff --git a/rust/main/agents/relayer/src/main.rs b/rust/main/agents/relayer/src/main.rs index f9ac628aca..b00ca8dade 100644 --- a/rust/main/agents/relayer/src/main.rs +++ b/rust/main/agents/relayer/src/main.rs @@ -18,6 +18,9 @@ mod memory_profiler; #[tokio::main(flavor = "multi_thread", worker_threads = 20)] async fn main() -> Result<()> { + // Logging is not initialised at this point, so, using `println!` + println!("Relayer starting up..."); + let agent_main_fut = agent_main::(); #[cfg(feature = "memory-profiling")] 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_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..e05549fb61 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -18,8 +18,8 @@ use hyperlane_base::{ }; use hyperlane_core::{ rpc_clients::call_and_retry_n_times, ChainCommunicationError, ContractSyncCursor, - HyperlaneDomain, HyperlaneMessage, InterchainGasPayment, MerkleTreeInsertion, QueueOperation, - H512, U256, + HyperlaneDomain, HyperlaneMessage, InterchainGasPayment, Mailbox, MerkleTreeInsertion, + QueueOperation, ValidatorAnnounce, H512, U256, }; use tokio::{ sync::{ @@ -135,12 +135,10 @@ impl BaseAgent for Relayer { .map(|origin| (origin.clone(), HyperlaneRocksDB::new(origin, db.clone()))) .collect::>(); - let mailboxes = settings - .build_mailboxes(settings.destination_chains.iter(), &core_metrics) - .await?; - let validator_announces = settings - .build_validator_announces(settings.origin_chains.iter(), &core_metrics) - .await?; + let mailboxes = Self::build_mailboxes(&settings, &core_metrics, &chain_metrics).await; + + let validator_announces = + Self::build_validator_announces(&settings, &core_metrics, &chain_metrics).await; let contract_sync_metrics = Arc::new(ContractSyncMetrics::new(&core_metrics)); @@ -236,7 +234,9 @@ impl BaseAgent for Relayer { let mut msg_ctxs = HashMap::new(); let mut destination_chains = HashMap::new(); - for destination in &settings.destination_chains { + + // only iterate through destination chains that were successfully instantiated + for (destination, dest_mailbox) in mailboxes.iter() { let destination_chain_setup = core.settings.chain_setup(destination).unwrap().clone(); destination_chains.insert(destination.clone(), destination_chain_setup.clone()); let transaction_gas_limit: Option = @@ -246,18 +246,19 @@ impl BaseAgent for Relayer { transaction_gas_limit }; - for origin in &settings.origin_chains { + // only iterate through origin chains that were successfully instantiated + for (origin, validator_announce) in validator_announces.iter() { let db = dbs.get(origin).unwrap().clone(); let metadata_builder = BaseMetadataBuilder::new( origin.clone(), destination_chain_setup.clone(), prover_syncs[origin].clone(), - validator_announces[origin].clone(), + validator_announce.clone(), settings.allow_local_checkpoint_syncers, core.metrics.clone(), db, IsmAwareAppContextClassifier::new( - mailboxes[destination].clone(), + dest_mailbox.clone(), settings.metric_app_contexts.clone(), ), ); @@ -268,7 +269,7 @@ impl BaseAgent for Relayer { destination: destination.id(), }, Arc::new(MessageContext { - destination_mailbox: mailboxes[destination].clone(), + destination_mailbox: dest_mailbox.clone(), origin_db: dbs.get(origin).unwrap().clone(), metadata_builder: Arc::new(metadata_builder), origin_gas_payment_enforcer: gas_payment_enforcers[origin].clone(), @@ -465,11 +466,11 @@ impl Relayer { return tokio::spawn(async {}).instrument(info_span!("MessageSync")); } }; + let origin_name = origin.name().to_string(); tokio::spawn(TaskMonitor::instrument(&task_monitor, async move { - contract_sync - .clone() - .sync("dispatched_messages", cursor.into()) - .await + let label = "dispatched_messages"; + contract_sync.clone().sync(label, cursor.into()).await; + info!(chain = origin_name, label, "contract sync task exit"); })) .instrument(info_span!("MessageSync")) } @@ -496,14 +497,14 @@ impl Relayer { return tokio::spawn(async {}).instrument(info_span!("IgpSync")); } }; + let origin_name = origin.name().to_string(); tokio::spawn(TaskMonitor::instrument(&task_monitor, async move { + let label = "gas_payments"; contract_sync .clone() - .sync( - "gas_payments", - SyncOptions::new(Some(cursor), tx_id_receiver), - ) - .await + .sync(label, SyncOptions::new(Some(cursor), tx_id_receiver)) + .await; + info!(chain = origin_name, label, "contract sync task exit"); })) .instrument(info_span!("IgpSync")) } @@ -526,14 +527,14 @@ impl Relayer { return tokio::spawn(async {}).instrument(info_span!("MerkleTreeHookSync")); } }; + let origin_name = origin.name().to_string(); tokio::spawn(TaskMonitor::instrument(&task_monitor, async move { + let label = "merkle_tree_hook"; contract_sync .clone() - .sync( - "merkle_tree_hook", - SyncOptions::new(Some(cursor), tx_id_receiver), - ) - .await + .sync(label, SyncOptions::new(Some(cursor), tx_id_receiver)) + .await; + info!(chain = origin_name, label, "contract sync task exit"); })) .instrument(info_span!("MerkleTreeHookSync")) } @@ -587,7 +588,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, @@ -620,7 +621,275 @@ impl Relayer { })) .instrument(span) } + + /// Helper function to build and return a hashmap of mailboxes. + /// Any chains that fail to build mailbox will not be included + /// in the hashmap. Errors will be logged and chain metrics + /// will be updated for chains that fail to build mailbox. + pub async fn build_mailboxes( + settings: &RelayerSettings, + core_metrics: &CoreMetrics, + chain_metrics: &ChainMetrics, + ) -> HashMap> { + settings + .build_mailboxes(settings.destination_chains.iter(), core_metrics) + .await + .into_iter() + .filter_map(|(origin, mailbox_res)| match mailbox_res { + Ok(mailbox) => Some((origin, mailbox)), + Err(err) => { + error!(?err, origin=?origin, "Critical error when building mailbox"); + chain_metrics.set_critical_error(origin.name(), true); + None + } + }) + .collect() + } + + /// Helper function to build and return a hashmap of validator announces. + /// Any chains that fail to build validator announce will not be included + /// in the hashmap. Errors will be logged and chain metrics + /// will be updated for chains that fail to build validator announce. + pub async fn build_validator_announces( + settings: &RelayerSettings, + core_metrics: &CoreMetrics, + chain_metrics: &ChainMetrics, + ) -> HashMap> { + settings + .build_validator_announces(settings.origin_chains.iter(), core_metrics) + .await + .into_iter() + .filter_map(|(origin, mailbox_res)| match mailbox_res { + Ok(mailbox) => Some((origin, mailbox)), + Err(err) => { + error!(?err, origin=?origin, "Critical error when building validator announce"); + chain_metrics.set_critical_error(origin.name(), true); + None + } + }) + .collect() + } } #[cfg(test)] -mod test {} +mod test { + use std::{ + collections::{HashMap, HashSet}, + path::PathBuf, + }; + + use crate::settings::{matching_list::MatchingList, RelayerSettings}; + use ethers::utils::hex; + use ethers_prometheus::middleware::PrometheusMiddlewareConf; + use hyperlane_base::{ + settings::{ + ChainConf, ChainConnectionConf, CoreContractAddresses, IndexSettings, Settings, + TracingConfig, + }, + ChainMetrics, CoreMetrics, BLOCK_HEIGHT_HELP, BLOCK_HEIGHT_LABELS, CRITICAL_ERROR_HELP, + CRITICAL_ERROR_LABELS, + }; + use hyperlane_core::{ + config::OperationBatchConfig, HyperlaneDomain, IndexMode, KnownHyperlaneDomain, + ReorgPeriod, H256, + }; + use hyperlane_ethereum as h_eth; + use prometheus::{opts, IntGaugeVec, Registry}; + use reqwest::Url; + + use super::Relayer; + + /// Builds a test RelayerSetting + fn generate_test_relayer_settings() -> RelayerSettings { + let chains = [( + "arbitrum".to_string(), + ChainConf { + domain: HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum), + signer: None, + reorg_period: ReorgPeriod::None, + addresses: CoreContractAddresses { + mailbox: H256::from_slice( + hex::decode( + "000000000000000000000000598facE78a4302f11E3de0bee1894Da0b2Cb71F8", + ) + .unwrap() + .as_slice(), + ), + interchain_gas_paymaster: H256::from_slice( + hex::decode( + "000000000000000000000000c756cFc1b7d0d4646589EDf10eD54b201237F5e8", + ) + .unwrap() + .as_slice(), + ), + validator_announce: H256::from_slice( + hex::decode( + "0000000000000000000000001b33611fCc073aB0737011d5512EF673Bff74962", + ) + .unwrap() + .as_slice(), + ), + merkle_tree_hook: H256::from_slice( + hex::decode( + "000000000000000000000000AD34A66Bf6dB18E858F6B686557075568c6E031C", + ) + .unwrap() + .as_slice(), + ), + }, + connection: ChainConnectionConf::Ethereum(h_eth::ConnectionConf { + rpc_connection: h_eth::RpcConnectionConf::Http { + url: Url::parse("https://sepolia-rollup.arbitrum.io/rpc").unwrap(), + }, + transaction_overrides: h_eth::TransactionOverrides { + gas_price: None, + gas_limit: None, + max_fee_per_gas: None, + max_priority_fee_per_gas: None, + }, + operation_batch: OperationBatchConfig { + batch_contract_address: None, + max_batch_size: 1, + }, + }), + metrics_conf: PrometheusMiddlewareConf { + contracts: HashMap::new(), + chain: None, + }, + index: IndexSettings { + from: 0, + chunk_size: 1, + mode: IndexMode::Block, + }, + }, + )]; + + RelayerSettings { + base: Settings { + chains: chains.into_iter().collect(), + metrics_port: 5000, + tracing: TracingConfig::default(), + }, + db: PathBuf::new(), + origin_chains: [ + HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum), + HyperlaneDomain::Known(KnownHyperlaneDomain::Ethereum), + HyperlaneDomain::Known(KnownHyperlaneDomain::Optimism), + ] + .into_iter() + .collect(), + destination_chains: [ + HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum), + HyperlaneDomain::Known(KnownHyperlaneDomain::Ethereum), + HyperlaneDomain::Known(KnownHyperlaneDomain::Optimism), + ] + .into_iter() + .collect(), + gas_payment_enforcement: Vec::new(), + whitelist: MatchingList::default(), + blacklist: MatchingList::default(), + address_blacklist: Vec::new(), + transaction_gas_limit: None, + skip_transaction_gas_limit_for: HashSet::new(), + allow_local_checkpoint_syncers: true, + metric_app_contexts: Vec::new(), + } + } + + #[tokio::test] + #[tracing_test::traced_test] + async fn test_failed_build_mailboxes() { + let settings = generate_test_relayer_settings(); + + let registry = Registry::new(); + let core_metrics = CoreMetrics::new("relayer", 4000, registry).unwrap(); + let chain_metrics = ChainMetrics { + block_height: IntGaugeVec::new( + opts!("block_height", BLOCK_HEIGHT_HELP), + BLOCK_HEIGHT_LABELS, + ) + .unwrap(), + gas_price: None, + critical_error: IntGaugeVec::new( + opts!("critical_error", CRITICAL_ERROR_HELP), + CRITICAL_ERROR_LABELS, + ) + .unwrap(), + }; + + let mailboxes = Relayer::build_mailboxes(&settings, &core_metrics, &chain_metrics).await; + + assert_eq!(mailboxes.len(), 1); + assert!(mailboxes.contains_key(&HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum))); + + // Arbitrum chain should not have any errors because it's ChainConf exists + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["arbitrum"]) + .unwrap(); + assert_eq!(metric.get(), 0); + + // Ethereum chain should error because it is missing ChainConf + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["ethereum"]) + .unwrap(); + assert_eq!(metric.get(), 1); + + // Optimism chain should error because it is missing ChainConf + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["optimism"]) + .unwrap(); + assert_eq!(metric.get(), 1); + } + + #[tokio::test] + #[tracing_test::traced_test] + async fn test_failed_build_validator_announces() { + let settings = generate_test_relayer_settings(); + + let registry = Registry::new(); + let core_metrics = CoreMetrics::new("relayer", 4000, registry).unwrap(); + let chain_metrics = ChainMetrics { + block_height: IntGaugeVec::new( + opts!("block_height", BLOCK_HEIGHT_HELP), + BLOCK_HEIGHT_LABELS, + ) + .unwrap(), + gas_price: None, + critical_error: IntGaugeVec::new( + opts!("critical_error", CRITICAL_ERROR_HELP), + CRITICAL_ERROR_LABELS, + ) + .unwrap(), + }; + + let mailboxes = + Relayer::build_validator_announces(&settings, &core_metrics, &chain_metrics).await; + + assert_eq!(mailboxes.len(), 1); + assert!(mailboxes.contains_key(&HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum))); + + // Arbitrum chain should not have any errors because it's ChainConf exists + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["arbitrum"]) + .unwrap(); + assert_eq!(metric.get(), 0); + + // Ethereum chain should error because it is missing ChainConf + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["ethereum"]) + .unwrap(); + assert_eq!(metric.get(), 1); + + // Optimism chain should error because it is missing ChainConf + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["optimism"]) + .unwrap(); + assert_eq!(metric.get(), 1); + } +} diff --git a/rust/main/agents/relayer/src/settings/mod.rs b/rust/main/agents/relayer/src/settings/mod.rs index dc4c1e543e..a8a5c1ca4c 100644 --- a/rust/main/agents/relayer/src/settings/mod.rs +++ b/rust/main/agents/relayer/src/settings/mod.rs @@ -33,7 +33,7 @@ pub struct RelayerSettings { #[as_mut] #[deref] #[deref_mut] - base: Settings, + pub base: Settings, /// Database path pub db: PathBuf, @@ -125,16 +125,50 @@ impl FromRawConf for RelayerSettings { .parse_from_str("Expected database path") .unwrap_or_else(|| std::env::current_dir().unwrap().join("hyperlane_db")); - let (raw_gas_payment_enforcement_path, raw_gas_payment_enforcement) = p - .get_opt_key("gasPaymentEnforcement") - .take_config_err_flat(&mut err) - .and_then(parse_json_array) - .unwrap_or_else(|| (&p.cwp + "gas_payment_enforcement", Value::Array(vec![]))); + // is_gas_payment_enforcement_set determines if we should be checking for the correct gas payment enforcement policy has been provided with "gasPaymentEnforcement" key + let ( + raw_gas_payment_enforcement_path, + raw_gas_payment_enforcement, + is_gas_payment_enforcement_set, + ) = { + match p.get_opt_key("gasPaymentEnforcement") { + Ok(Some(parser)) => match parse_json_array(parser) { + Some((path, value)) => (path, value, true), + None => ( + &p.cwp + "gas_payment_enforcement", + Value::Array(vec![]), + true, + ), + }, + Ok(None) => ( + &p.cwp + "gas_payment_enforcement", + Value::Array(vec![]), + false, + ), + Err(_) => ( + &p.cwp + "gas_payment_enforcement", + Value::Array(vec![]), + false, + ), + } + }; let gas_payment_enforcement_parser = ValueParser::new( raw_gas_payment_enforcement_path, &raw_gas_payment_enforcement, ); + + if is_gas_payment_enforcement_set + && gas_payment_enforcement_parser + .val + .as_array() + .unwrap() + .is_empty() + { + Err::<(), eyre::Report>(eyre!("GASPAYMENTENFORCEMENT policy cannot be parsed")) + .take_err(&mut err, || cwp + "gas_payment_enforcement"); + } + let mut gas_payment_enforcement = gas_payment_enforcement_parser.into_array_iter().map(|itr| { itr.filter_map(|policy| { let policy_type = policy.chain(&mut err).get_opt_key("type").parse_string().end(); diff --git a/rust/main/agents/scraper/src/main.rs b/rust/main/agents/scraper/src/main.rs index f9b0d5971f..f09297cde6 100644 --- a/rust/main/agents/scraper/src/main.rs +++ b/rust/main/agents/scraper/src/main.rs @@ -26,5 +26,8 @@ mod store; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<()> { + // Logging is not initialised at this point, so, using `println!` + println!("Scraper agent starting up..."); + agent_main::().await } diff --git a/rust/main/agents/validator/src/main.rs b/rust/main/agents/validator/src/main.rs index ebc24974c2..14056046e0 100644 --- a/rust/main/agents/validator/src/main.rs +++ b/rust/main/agents/validator/src/main.rs @@ -16,5 +16,8 @@ mod validator; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<()> { + // Logging is not initialised at this point, so, using `println!` + println!("Validator starting up..."); + agent_main::().await } diff --git a/rust/main/agents/validator/src/validator.rs b/rust/main/agents/validator/src/validator.rs index f7a8b43f59..f599fa8e39 100644 --- a/rust/main/agents/validator/src/validator.rs +++ b/rust/main/agents/validator/src/validator.rs @@ -228,11 +228,11 @@ impl Validator { self.origin_chain ) }); + let origin = self.origin_chain.name().to_string(); tokio::spawn(async move { - contract_sync - .clone() - .sync("merkle_tree_hook", cursor.into()) - .await; + let label = "merkle_tree_hook"; + contract_sync.clone().sync(label, cursor.into()).await; + info!(chain = origin, label, "contract sync task exit"); }) .instrument(info_span!("MerkleTreeHookSyncer")) } diff --git a/rust/main/chains/hyperlane-cosmos/Cargo.toml b/rust/main/chains/hyperlane-cosmos/Cargo.toml index ce936ec1f4..06cb6c2e97 100644 --- a/rust/main/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/main/chains/hyperlane-cosmos/Cargo.toml @@ -23,6 +23,7 @@ hyperlane-core = { path = "../../hyperlane-core", features = ["async"] } hyperlane-cosmwasm-interface.workspace = true hyper = { workspace = true } hyper-tls = { workspace = true } +ibc-proto = { workspace = true } injective-protobuf = { workspace = true } injective-std = { workspace = true } itertools = { workspace = true } @@ -42,7 +43,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/error.rs b/rust/main/chains/hyperlane-cosmos/src/error.rs index de5e2f019f..cf41fda891 100644 --- a/rust/main/chains/hyperlane-cosmos/src/error.rs +++ b/rust/main/chains/hyperlane-cosmos/src/error.rs @@ -14,9 +14,12 @@ pub enum HyperlaneCosmosError { /// base64 error #[error("{0}")] Base64(#[from] base64::DecodeError), - /// bech32 error + /// bech32 decode error #[error("{0}")] - Bech32(#[from] bech32::Error), + Bech32Decode(#[from] bech32::DecodeError), + /// bech32 encode error + #[error("{0}")] + Bech32Encode(#[from] bech32::EncodeError), /// gRPC error #[error("{0}")] GrpcError(#[from] tonic::Status), 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 9c03b824dc..85c2c7adcb 100644 --- a/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -232,57 +232,66 @@ impl CosmosMerkleTreeHookIndexer { 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()); - 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"); + 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"); + } + } } - unknown => { - debug!(?unknown, "unknown attribute"); + EventAttribute::V034(a) => { + unimplemented!(); } } } 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/cosmos/provider/parse.rs b/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider/parse.rs index a2212f6128..d648e716f9 100644 --- a/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider/parse.rs +++ b/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider/parse.rs @@ -1,6 +1,6 @@ -use cosmrs::proto::ibc::core::channel::v1::MsgRecvPacket; use cosmrs::proto::prost::Message; use cosmrs::Any; +use ibc_proto::ibc::core::channel::v1::MsgRecvPacket; use serde::{Deserialize, Serialize}; use crate::HyperlaneCosmosError; @@ -40,10 +40,9 @@ impl TryFrom for PacketData { #[cfg(test)] mod tests { - use cosmrs::proto::ibc::core::channel::v1::MsgRecvPacket; - use cosmrs::proto::ibc::core::channel::v1::Packet; use cosmrs::proto::prost::Message; use cosmrs::Any; + use ibc_proto::ibc::core::channel::v1::{MsgRecvPacket, Packet}; use crate::providers::cosmos::provider::parse::PacketData; use crate::HyperlaneCosmosError; 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 d2cfd613cc..831d798db1 100644 --- a/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs +++ b/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs @@ -493,7 +493,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/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/mod.rs b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/mod.rs index d7cdb80cd4..375f5cedda 100644 --- a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/mod.rs +++ b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/mod.rs @@ -1,5 +1,5 @@ use ethers::providers::HttpClientError; -use tracing::{info, trace, warn}; +use tracing::{error, info, trace, warn}; pub use self::{fallback::*, provider::*, retrying::*, trait_builder::*}; @@ -86,12 +86,12 @@ fn categorize_client_response( // We don't want to retry errors that are probably not going to work if we keep // retrying them or that indicate an error in higher-order logic and not // transient provider (connection or other) errors. - warn!(error=%e, "Non-retryable JsonRpcError in http provider"); + error!(error=%e, "Non-retryable JsonRpcError in http provider"); NonRetryableErr(JsonRpcError(e)) } else { // the assumption is this is not a "provider error" but rather an invalid // request, e.g. nonce too low, not enough gas, ... - info!(error=%e, "Retryable JsonRpcError in http provider"); + warn!(error=%e, "Retryable JsonRpcError in http provider"); RetryableErr(JsonRpcError(e)) } } 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-sealevel/src/interchain_gas.rs b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs index 4d5e819de3..95cd97eb35 100644 --- a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs +++ b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs @@ -248,11 +248,17 @@ impl Indexer for SealevelInterchainGasPaymasterIndexer { for nonce in range { if let Ok(sealevel_payment) = self.get_payment_with_sequence(nonce.into()).await { let igp_account_filter = self.igp.igp_account; - if igp_account_filter == sealevel_payment.igp_account_pubkey { - payments.push((sealevel_payment.payment, sealevel_payment.log_meta)); - } else { - tracing::debug!(sealevel_payment=?sealevel_payment, igp_account_filter=?igp_account_filter, "Found interchain gas payment for a different IGP account, skipping"); + let mut payment = *sealevel_payment.payment.inner(); + // If fees is paid to a different IGP account, we zero out the payment to make sure the db entries are contiguous, but at the same time, gasEnforcer will reject the message (if not set to none policy) + if igp_account_filter != sealevel_payment.igp_account_pubkey { + tracing::debug!(sealevel_payment=?sealevel_payment, igp_account_filter=?igp_account_filter, "Found interchain gas payment for a different IGP account, neutralizing payment"); + + payment.payment = U256::from(0); } + payments.push(( + Indexed::new(payment).with_sequence(nonce), + sealevel_payment.log_meta, + )); } } Ok(payments) 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 5b465b90cf..bc430715e1 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": "0xd3fA56EDc496f986df5D2464E4C2c6027F8b4cEf", + "interchainSecurityModule": "0x5860cdaD159184105b7473882376cA4E5Cf1916D", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x811808Dd29ba8B0FC6C0ec0b5537035E59745162", @@ -100,7 +100,7 @@ "interchainAccountIsm": "0x2A7574358Ec53522CE2452887661AB4c86F7d400", "interchainAccountRouter": "0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6", "interchainGasPaymaster": "0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22", - "interchainSecurityModule": "0xe99C998dd9823B9b713A100fB885dd192C0d86DA", + "interchainSecurityModule": "0xC53D7f366B1CB2EA7Dd99E6105B191Af100BDBEb", "mailbox": "0x979Ca5202784112f4738403dBec5D0F3B9daabB9", "merkleTreeHook": "0x748040afB89B8FdBb992799808215419d36A0930", "name": "arbitrum", @@ -172,7 +172,7 @@ "interchainAccountIsm": "0x27a3233c05C1Df7c163123301D14bE9349E3Cb48", "interchainAccountRouter": "0xa82a0227e6d6db53AF4B264A852bfF91C6504a51", "interchainGasPaymaster": "0x95519ba800BBd0d34eeAE026fEc620AD978176C0", - "interchainSecurityModule": "0xFf2139af114d1D43C7348CA7471e08c7B31213A3", + "interchainSecurityModule": "0xa52E6beDFaA418E0A3E34b698C440cCB43fb5092", "mailbox": "0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6", "merkleTreeHook": "0x84eea61D679F42D92145fA052C89900CBAccE95A", "name": "avalanche", @@ -245,7 +245,7 @@ "interchainAccountIsm": "0x223F7D3f27E6272266AE4B5B91Fd5C7A2d798cD8", "interchainAccountRouter": "0x4767D22117bBeeb295413000B620B93FD8522d53", "interchainGasPaymaster": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", - "interchainSecurityModule": "0x22c3D036C518A3953c57Ec3101b404a78158b7e4", + "interchainSecurityModule": "0xEB5e4E0b7c4284221e456846057D179249a9009F", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x19dc38aeae620380430C200a6E990D5Af5480117", "name": "base", @@ -316,7 +316,7 @@ "interchainAccountIsm": "0xe93f2f409ad8B5000431D234472973fe848dcBEC", "interchainAccountRouter": "0x2f4Eb04189e11Af642237Da62d163Ab714614498", "interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", - "interchainSecurityModule": "0xff226D43F30B95Fac99D225E6aD36f308ff03d7A", + "interchainSecurityModule": "0xa91A5Cd4847DDec9F66C523CfEC167C2016bE43F", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", "name": "blast", @@ -384,7 +384,7 @@ "interchainAccountIsm": "0x451dF8AB0936D85526D816f0b4dCaDD934A034A4", "interchainAccountRouter": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "interchainGasPaymaster": "0x62B7592C1B6D1E43f4630B8e37f4377097840C05", - "interchainSecurityModule": "0xD94FA19BaC0A4f8Aa14D4ccB4B7A7Efb777F0A1e", + "interchainSecurityModule": "0x136aB2D5748536fF0BE18110a1ce479Ac4344fa1", "mailbox": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", "merkleTreeHook": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", "name": "bob", @@ -450,7 +450,7 @@ "interchainAccountIsm": "0x9e22945bE593946618383B108CC5bce09eBA4C26", "interchainAccountRouter": "0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1", "interchainGasPaymaster": "0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451", - "interchainSecurityModule": "0x8ca30D8d1406B820b411dD1799fAa2A5E15a9D93", + "interchainSecurityModule": "0x789b6C094a281F31D6A0819c0e08F87438A7BFA8", "mailbox": "0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4", "merkleTreeHook": "0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26", "name": "bsc", @@ -531,7 +531,7 @@ "interchainAccountIsm": "0xB732c83aeE29596E3163Da2260710eAB67Bc0B29", "interchainAccountRouter": "0x27a6cAe33378bB6A6663b382070427A01fc9cB37", "interchainGasPaymaster": "0x571f1435613381208477ac5d6974310d88AC7cB7", - "interchainSecurityModule": "0x0df8056AB4fd95D7c8f848BcF95d63b76F6bFA04", + "interchainSecurityModule": "0x41888Ae3E1B3441067AA5842f536C90ec8Aa2e80", "mailbox": "0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb", "merkleTreeHook": "0x04dB778f05854f26E67e0a66b740BBbE9070D366", "name": "celo", @@ -596,7 +596,7 @@ "interchainAccountIsm": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", "interchainAccountRouter": "0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0xB8508EecB14dd8d3762782eefC1ead0E92D89Ea5", + "interchainSecurityModule": "0xaD4c4F5Be297FAEaC83FB7Db6c76f8964c64d627", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "cheesechain", @@ -659,7 +659,7 @@ "from": 4842212 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x18250E686438602607205154288f160065d5F600", + "interchainSecurityModule": "0x567C3824E93bAc4a6c24a4deaCE7B285d342CCf5", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "cyber", @@ -726,7 +726,7 @@ "from": 23783929 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x7fc28AE86f109B1F2f2aeCb9aDFaFF10A5440E02", + "interchainSecurityModule": "0x778c735A6682649299abD5a6B8A1A2C7CD172417", "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": "0x99d4146DC4910e3881b63C3471198F3Cb6aBAc52", + "interchainSecurityModule": "0x131a22Abe8BAAfaaf1c51217a6D3DB27626C927F", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xC831271c1fB212012811a91Dd43e5926C1020563", "name": "endurance", @@ -910,7 +910,7 @@ "interchainAccountIsm": "0x292C614ED53DaaDBf971521bc2C652d1ca51cB47", "interchainAccountRouter": "0x5E532F7B610618eE73C2B462978e94CB1F7995Ce", "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611", - "interchainSecurityModule": "0x8C3c9e95091A504b28902dF319F4cE8Bd77D2f59", + "interchainSecurityModule": "0xF59f09C08e4aE8b510C8e6B0f56024E583CAD0dF", "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239", "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA", "name": "ethereum", @@ -982,7 +982,7 @@ "interchainAccountIsm": "0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF", "interchainAccountRouter": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", "interchainGasPaymaster": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", - "interchainSecurityModule": "0xd0C1FC10c922434452DAc6DA518Fe91582CF2407", + "interchainSecurityModule": "0xd24b1995Fa04dB66937d4a2a8Fc8880Df4C6cB9b", "mailbox": "0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3", "merkleTreeHook": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", "name": "fraxtal", @@ -1050,7 +1050,7 @@ "interchainAccountIsm": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", "interchainAccountRouter": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", "interchainGasPaymaster": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", - "interchainSecurityModule": "0xE62f55C6760CE12688Ae4C4FDBf2Cb7f08C468A6", + "interchainSecurityModule": "0x73D9664b1d6103b2463c2AA8e7eDE8B8AF9Dc582", "mailbox": "0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696", "merkleTreeHook": "0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f", "name": "fusemainnet", @@ -1124,7 +1124,7 @@ "interchainAccountIsm": "0x07E2062A1bC66a2C1d05cb5C3870a4AF86e0056E", "interchainAccountRouter": "0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064", "interchainGasPaymaster": "0xDd260B99d302f0A3fF885728c086f729c06f227f", - "interchainSecurityModule": "0x93BC454D1E8049a286EC84E75e628AB23e5E61f8", + "interchainSecurityModule": "0x7E81A58E2364eC787688f1226cf5998D0687eC1D", "mailbox": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "name": "gnosis", @@ -1195,7 +1195,7 @@ "interchainAccountIsm": "0x708E002637792FDC031E6B62f23DD60014AC976a", "interchainAccountRouter": "0xfB8cea1c7F45608Da30655b50bbF355D123A4358", "interchainGasPaymaster": "0x19dc38aeae620380430C200a6E990D5Af5480117", - "interchainSecurityModule": "0xe6a1cA2c655FD86E5bD0307b1577f11e031E4691", + "interchainSecurityModule": "0x85bDBb452CE1780d74Ca31AC37F1E38375b7Ce90", "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": "0xc11B492a516F839F3f05D0CE8f79E51Bf65a66E9", + "interchainSecurityModule": "0xD6CdCb7bd3964f47616E339BbdB3EAc71B5E87DC", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "kroma", @@ -1396,7 +1399,7 @@ "interchainAccountIsm": "0xdcA646C56E7768DD11654956adE24bfFf9Ba4893", "interchainAccountRouter": "0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C", "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", - "interchainSecurityModule": "0x73171e4CAAe12ae90EFA6f5D33818021b2C8F80F", + "interchainSecurityModule": "0x7Ef099711F83Bf584579d9e8375ED3cA8be44FEB", "mailbox": "0x02d16BC51af6BfD153d67CA61754cF912E82C4d9", "merkleTreeHook": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", "name": "linea", @@ -1467,7 +1470,7 @@ "from": 4195553 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x629c7Bf8586256624f5D925360F4382defa04eBf", + "interchainSecurityModule": "0x95E3044e32b296Fa19054A071dbe523834d24Bd4", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "lisk", @@ -1531,7 +1534,7 @@ "from": 3088760 }, "interchainGasPaymaster": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", - "interchainSecurityModule": "0x6f3e2043611307bE33016a9aaDf1943cCd10d7db", + "interchainSecurityModule": "0x3173260205bfa065728Dc08227FcfA5819D55Df7", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x062200d92dF6bB7bA89Ce4D6800110450f94784e", "name": "lukso", @@ -1605,7 +1608,7 @@ "interchainAccountIsm": "0x8Ea50255C282F89d1A14ad3F159437EE5EF0507f", "interchainAccountRouter": "0x693A4cE39d99e46B04cb562329e3F0141cA17331", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x809253E828b9F94781Ee58089bA696883D05dDca", + "interchainSecurityModule": "0xd1278Cd952a341D463924c5597FE61691d5559a5", "isTestnet": false, "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", @@ -1675,7 +1678,7 @@ "interchainAccountIsm": "0xe039DA3A0071BEd087A12660D7b03cf669c7776E", "interchainAccountRouter": "0x45285463352c53a481e882cD5E2AF2E25BBdAd0D", "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", - "interchainSecurityModule": "0xA9dfB22e46133f23bB635818aeB04Ae31645D2a8", + "interchainSecurityModule": "0xD11F603E537931b00f9B0B6297A9E1bE7173FEc6", "mailbox": "0x398633D19f4371e1DB5a8EFE90468eB70B1176AA", "merkleTreeHook": "0x5332D1AC0A626D265298c14ff681c0A8D28dB86d", "name": "mantle", @@ -1737,7 +1740,7 @@ "from": 13523607 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x8Dc8e217071F55C772Ffa21CCCCf3B70FCec40c7", + "interchainSecurityModule": "0x3cf2196283C7d7428bD5aF3111bF3588F2038173", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "merlin", @@ -1804,7 +1807,7 @@ "from": 17966274 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x67F16B702A2b8AC3d8fc1ffAEfBAB7Fe6fe762AD", + "interchainSecurityModule": "0x33faE85Cd15667f6ECeBaB7C75A394b4359f104a", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "metis", @@ -1869,7 +1872,7 @@ "from": 3752032 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xFE82E2d4278124122e9771D7A525846e506BbAD3", + "interchainSecurityModule": "0xAd5516892b5526C42cb616DD080aB193Ab0b0Ce7", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "mint", @@ -1936,7 +1939,7 @@ "interchainAccountIsm": "0xa377b8269e0A47cdd2fD5AAeAe860b45623c6d82", "interchainAccountRouter": "0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8", "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0xA54Cca261C76B09663Ae4bCe042d644e6F822e2E", + "interchainSecurityModule": "0x2Afc4338CB37a502874c73f17E2960Ba70439c1d", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "mode", @@ -2004,7 +2007,7 @@ "interchainAccountIsm": "0x79b3730CE3685f65802aF1771319992bA960EB9D", "interchainAccountRouter": "0xc4482f66191754a8629D35289043C4EB0285F10E", "interchainGasPaymaster": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "interchainSecurityModule": "0xe12cd1ddf6AA5f71FBee45CE9A819a0B3B2fb67F", + "interchainSecurityModule": "0x9cC2AE36315e381753E50083d0a3D73eB5F97cAA", "mailbox": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", "merkleTreeHook": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", "name": "moonbeam", @@ -2146,7 +2149,7 @@ "interchainAccountIsm": "0x2c46BF14641d00549ECa4779BF5CBf91602C1DEd", "interchainAccountRouter": "0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD", "interchainGasPaymaster": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "interchainSecurityModule": "0x10b4d96f8D4F095f0B708195B502FDeC165b739b", + "interchainSecurityModule": "0x1344a2c08C9Db084130841a2b68A7064403c4407", "mailbox": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", "merkleTreeHook": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", "name": "optimism", @@ -2281,7 +2284,7 @@ "interchainAccountIsm": "0xBAC4529cdfE7CCe9E858BF706e41F8Ed096C1BAd", "interchainAccountRouter": "0xF163949AD9F88977ebF649D0461398Ca752E64B9", "interchainGasPaymaster": "0x0071740Bf129b05C4684abfbBeD248D80971cce2", - "interchainSecurityModule": "0x47E840c5537547E0Fff9aB9cCd05eDe70A6D9139", + "interchainSecurityModule": "0x4E1AaA32bb43C75B760729AA0fe99881dcf6a7D8", "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": "0x008cF37Cf63dE3179A9a93F558537daB1A73a46C", + "interchainSecurityModule": "0xFC49D822b69Fe6680d3653B4bd4d985B9fdc451c", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "polygonzkevm", @@ -2426,7 +2425,7 @@ "from": 32018468 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x56c8e2Ca77EA631D049e9AdbCC81902c4A420AF8", + "interchainSecurityModule": "0x824277dDAEfF0fEa50e39843a64818A82B0A8091", "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": "0x16a780d2f0d39B0e0e7B3d05a7E9d0BA772D2e2D", + "interchainSecurityModule": "0xA7326Ee1E3eb222bEfEbE1b2B35AA7Db25260E11", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x55E4F0bc6b7Bb493D50839A8592e7ad8d5e93cf7", "name": "real", @@ -2557,7 +2556,7 @@ "interchainAccountIsm": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785", "interchainAccountRouter": "0x7a4d31a686A36285d68e14EDD53631417eB19603", "interchainGasPaymaster": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "interchainSecurityModule": "0xF11b43b26e1Df7A7fc9E2fB7982630Ca9E78Db17", + "interchainSecurityModule": "0x270015959B6A9448c7187DBB1b5527A234ee90c0", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", "name": "redstone", @@ -2619,7 +2618,7 @@ "from": 937117 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xa8dBD60A10bC4f2B807Abc040c620453b1Ad9fb0", + "interchainSecurityModule": "0xc314df199F9e88Eb6a1cF22bb70cfB7de0f27ab8", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "sanko", @@ -2687,7 +2686,7 @@ "interchainAccountIsm": "0x32af5Df81fEd5E26119F6640FBB13f3d63a94CDe", "interchainAccountRouter": "0x0B48a744698ba8dFa514742dFEB6728f52fD66f7", "interchainGasPaymaster": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "interchainSecurityModule": "0x86e427d91d26eCD2542846D4C9b57186e9339a37", + "interchainSecurityModule": "0xac053C51B7B4C2E293d28F01018297cA936BBf08", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", "name": "scroll", @@ -2762,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": "0xFDd69b3E4c13c6D65f856F99A12BFA0F0cc529D7", + "interchainSecurityModule": "0x8A4C9513186383C6408781E76B9d7C69a7b46b1a", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49", "name": "sei", @@ -2828,7 +2828,7 @@ "index": { "from": 1, "mode": "sequence", - "chunk": 100 + "chunk": 20 }, "interchainGasPaymaster": "JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M", "mailbox": "E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi", @@ -2882,7 +2882,7 @@ "interchainAccountIsm": "0xAE557e108b3336130370aC74836f1356B4b30Cf2", "interchainAccountRouter": "0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B", "interchainGasPaymaster": "0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42", - "interchainSecurityModule": "0xd663Fb2EE0F8E351869e3E4CdbDeA3b0e440Eb98", + "interchainSecurityModule": "0x5B1Cd9A9d68adC495b3f5291c8817aCDb2030B68", "mailbox": "0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3", "merkleTreeHook": "0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd", "name": "taiko", @@ -2944,7 +2944,7 @@ "from": 1678063 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x56c8e2Ca77EA631D049e9AdbCC81902c4A420AF8", + "interchainSecurityModule": "0xc314df199F9e88Eb6a1cF22bb70cfB7de0f27ab8", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", @@ -3012,7 +3012,7 @@ "interchainAccountIsm": "0x551BbEc45FD665a8C95ca8731CbC32b7653Bc59B", "interchainAccountRouter": "0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x83D407ebFa89d1D64833F314f6ad6bBc57728D66", + "interchainSecurityModule": "0x164639E2982A5D9612d1Ce64667a4880904D2B43", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "viction", @@ -3080,7 +3080,7 @@ "interchainAccountIsm": "0xCB9f90EE5d83Ea52ABd922BD70898f0155D54798", "interchainAccountRouter": "0x473884010F0C1742DA8Ad01E7E295624B931076b", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0x85bD389452743323afF638a3486A8cC451a33329", + "interchainSecurityModule": "0xa623E6d8A39129f8A5BcA295f5c4aE8AE69249F9", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "worldchain", @@ -3142,7 +3142,7 @@ "from": 24395308 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x1E6fdCA7fda50eD32c2c54b28a0E0557e6065fba", + "interchainSecurityModule": "0x8b63d0db57F1206B18D2d3cD7C31Ed1f36029917", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "xai", @@ -3210,7 +3210,7 @@ "interchainAccountIsm": "0x29B37088724B745C0ABcE591449Cf042772160C2", "interchainAccountRouter": "0x03cF708E42C89623bd83B281A56935cB562b9258", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0x0F95bC504568913673CB7C1e6BeFc605a31bD945", + "interchainSecurityModule": "0x90F075E47525eB9B06a7F4E6014acA41A03baC34", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "xlayer", @@ -3278,7 +3278,7 @@ "interchainAccountIsm": "0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29", "interchainAccountRouter": "0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5", "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0x0c979c68c88459F6b4cCfEc73B6d6Ac262f7159e", + "interchainSecurityModule": "0x3b050Ba353fCc205d2d2f5340Ac752ec578b8E84", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "zetachain", @@ -3344,7 +3344,7 @@ "from": 1511458 }, "interchainGasPaymaster": "0x03cF708E42C89623bd83B281A56935cB562b9258", - "interchainSecurityModule": "0x3abC1e4D81c96C7cF6E80638dD8dBcc9FF1BD4C3", + "interchainSecurityModule": "0xebBAFb81e2cA423c97e644e0Cd65a6D3F0ea6730", "mailbox": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", "merkleTreeHook": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28", "name": "zircuit", @@ -3417,7 +3417,7 @@ "interchainAccountIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", "interchainAccountRouter": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainGasPaymaster": "0x18B0688990720103dB63559a3563f7E8d0f63EDb", - "interchainSecurityModule": "0x0393C0ba78562BCC043c0C7c76Ed09230b04A35f", + "interchainSecurityModule": "0x6A4b341dd41Cd0fB09Df1F867bA4E40e4D776a8A", "mailbox": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "merkleTreeHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", "name": "zoramainnet", @@ -3488,7 +3488,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xa5a09C88941410515A5Fc6D42FFb4Db3B6722274", + "interchainSecurityModule": "0xA4f5333B6e912E0dc89C46cE5D39e018f44D8D8f", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3555,7 +3555,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xa221Fda4b2fd4b586BbE14aB39E79F186de16CA9", + "interchainSecurityModule": "0x801e251A6617b7eF882322Ba873401735853F6EF", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3625,7 +3625,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xdC6E982Ea3091006b1Ef0CB6Acfe018b058eEd19", + "interchainSecurityModule": "0xE91F8E99e35Cb250024f9E5920f6a844aB186714", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3701,7 +3701,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x27d3ADAA10646b8787A614D5d1ef257593BEe1Ea", + "interchainSecurityModule": "0x6752F23f44888c82Fd1d22875010B7799edbaFAD", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3765,7 +3765,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xe43d5f9b4da11ef7F775Ba2B40b112A7F706dF83", + "interchainSecurityModule": "0xDA0C302Acd89678e67912a6246fC0B3A1CaA0dC7", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3838,7 +3838,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xb9B8bD14661DE405F7597CC5b0D859C568700dF6", + "interchainSecurityModule": "0x18cC3841135Bc9829eb7c597Fc9B6CC952A2dC56", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3906,7 +3906,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x0081c30768c4C91C73d7871E5ae25B0d27276Fc0", + "interchainSecurityModule": "0x0f6F356fe85bC7a92111449479d70F23cF4ef498", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3969,7 +3969,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xa4D428c24332A7E42a49b47A8c56f489ce43426F", + "interchainSecurityModule": "0xB3A24e2F4EbA5fC5bB021E754E5e370BBeF050d0", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -4039,7 +4039,7 @@ "interchainAccountIsm": "0xcd9D3744512F07AE844c40E27912092d7c503565", "interchainAccountRouter": "0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8", "interchainGasPaymaster": "0xb58257cc81E47EC72fD38aE16297048de23163b4", - "interchainSecurityModule": "0x621711bf30D680256460884a626b6B2A3F8Fa2Bd", + "interchainSecurityModule": "0xe6fA4476Dbca22f06Db8355cB847aCc4A5BBa59f", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1", "pausableHook": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", @@ -4099,7 +4099,7 @@ "interchainAccountIsm": "0xc23BaF5Eb5848D19701BbE7f139645e6bd58a319", "interchainAccountRouter": "0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE", "interchainGasPaymaster": "0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86", - "interchainSecurityModule": "0x70a1E8ee35227962f03a767c2b1073D2000c0c3D", + "interchainSecurityModule": "0x46ACEeDA62f2f4032bB1105D63d421106acD7050", "mailbox": "0xb129828B9EDa48192D0B2db35D0E40dCF51B3594", "merkleTreeHook": "0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59", "pausableHook": "0x6Fb36672365C7c797028C400A61c58c0ECc53cD2", @@ -4230,7 +4230,7 @@ "interchainAccountIsm": "0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1", "interchainAccountRouter": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "interchainGasPaymaster": "0x18B0688990720103dB63559a3563f7E8d0f63EDb", - "interchainSecurityModule": "0x2011044b3949C6406Cf47BC8c3122e7D70331266", + "interchainSecurityModule": "0xa6E1B51Eaa1724F88f3a79CCC3974073a26DF56A", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", "pausableHook": "0x2F619Ac5122689180AeBB930ADccdae215d538a9", @@ -4294,7 +4294,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xb35e7Cc9d45F3A5AD7dab46EB71F0b564B985322", + "interchainSecurityModule": "0xBd4bEc6A01578383276ad4db90944fecc6471A0D", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4355,7 +4355,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x9219ED9F72c64961c7745C61A1a3492b16435d06", + "interchainSecurityModule": "0x24E469308bCfF1C73053268f3656c19204bb9DC3", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4434,7 +4434,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xe24AdcdFA8B77A69F4134c6A7c8AB571911fDD43", + "interchainSecurityModule": "0xE027581D8F92073Cd4542fa40e399a81eFBFDf00", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4501,7 +4501,7 @@ "interchainAccountIsm": "0x783EC5e105234a570eB90f314284E5dBe53bdd90", "interchainAccountRouter": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", "interchainGasPaymaster": "0xf3dFf6747E7FC74B431C943961054B7BF6309d8a", - "interchainSecurityModule": "0xD6f9589f8d1Aa8e4f196174Be8046cF94D4364B9", + "interchainSecurityModule": "0x5F511135824f811404eB808D8d65ce896d31D6d7", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8", "pausableHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", @@ -4572,7 +4572,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x9DdF78676e47935f24DbcC6C0FDF9FF6687Fc461", + "interchainSecurityModule": "0x9C0Fb5dc90C4b37ef77436bFDCa3E715E670DB93", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4637,7 +4637,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x540605591E8C763FA4C1DeE91A674E39b33c768a", + "interchainSecurityModule": "0xBd4bEc6A01578383276ad4db90944fecc6471A0D", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4701,7 +4701,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x132655e619098058D595E871206e7ec1f4a8cb00", + "interchainSecurityModule": "0x9338E1B4965f83feE69B9914ACDE08AeE0D1ef8e", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4768,7 +4768,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x1277E184770eFF57bc54a8317cff379C53Ed307C", + "interchainSecurityModule": "0x5e99C872568Cf6E255b74B444d9287942Ab55645", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4832,7 +4832,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xb35e7Cc9d45F3A5AD7dab46EB71F0b564B985322", + "interchainSecurityModule": "0x2Bf7c5c4d2480b1d53723B7DA1625aeA0365C1Ba", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -5018,7 +5018,7 @@ "interchainAccountIsm": "0x4d264424905535E97396Db83bd553D0d73A4EF9d", "interchainAccountRouter": "0x26A29486480BD74f9B830a9B8dB33cb43C40f496", "interchainGasPaymaster": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", - "interchainSecurityModule": "0x89Ea8BAEC48ec2EB8F5444aD600a15dABd4426D7", + "interchainSecurityModule": "0x1d71FbdcA9a8Fb6faC724A524e416a896de30b57", "mailbox": "0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "pausableHook": "0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8", @@ -5082,7 +5082,7 @@ "interchainAccountIsm": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "interchainAccountRouter": "0x4ef363Da5bb09CC6aeA16973786963d0C8820778", "interchainGasPaymaster": "0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40", - "interchainSecurityModule": "0x89E35A66511eF1446DaB436FDF9c1eF93EFaa03D", + "interchainSecurityModule": "0x526A02995968671aB85B926827463571A8bB906F", "mailbox": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", "merkleTreeHook": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", "pausableHook": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", @@ -5149,7 +5149,7 @@ "interchainAccountIsm": "0x60bB6D060393D3C206719A7bD61844cC82891cfB", "interchainAccountRouter": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", "interchainGasPaymaster": "0x61374178e45F65fF9D6252d017Cd580FC60B7654", - "interchainSecurityModule": "0xF88aFBD5C7D6f804bb525Bc8f3A12906Ded7C715", + "interchainSecurityModule": "0xB0B52AEFB0E119Fb3dF22d1332C3375275a2561d", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xEe08043cf22c80b27BF24d19999231dF4a3fC256", "pausableHook": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", @@ -5214,7 +5214,7 @@ "interchainAccountIsm": "0xcdc31BA959DE8C035A03167ebAE1961208CDf172", "interchainAccountRouter": "0x349831a180eE4265008C5FFB9465Ff97c1CF0028", "interchainGasPaymaster": "0x6AA10748a036a49Cb290C0e12B77319b76792D5E", - "interchainSecurityModule": "0xEeEF1a33C123D8a3Ee96C670fC740D4e7A603329", + "interchainSecurityModule": "0x468Ad5b73be4863D017B8D962339F867D39C42Ca", "mailbox": "0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D", "merkleTreeHook": "0x2783D98CC073dbcDa90241C804d16982D3d75821", "pausableHook": "0x3bb2D0a828f7dD91bA786091F421f6d7cF376445", @@ -5284,7 +5284,7 @@ "interchainAccountIsm": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "interchainAccountRouter": "0x4ef363Da5bb09CC6aeA16973786963d0C8820778", "interchainGasPaymaster": "0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9", - "interchainSecurityModule": "0x06B1B5afCFfB8F49Dcea935A5E9E6A8FF96Da029", + "interchainSecurityModule": "0x1BEf95d17627863bB3346fD5069F93B35779912C", "mailbox": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", "merkleTreeHook": "0xdAa1B65547fB969c9ff5678956AB2FF9771B883D", "pausableHook": "0xA0e0829DA397CcF55d5B779C31728f21Cb8219DF", @@ -5396,7 +5396,7 @@ "interchainAccountIsm": "0x8c794a781327b819416E7b67908f1D22397f1E67", "interchainAccountRouter": "0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6", "interchainGasPaymaster": "0x2b79328DA089E89A9E9c08732b56dd31F01011Db", - "interchainSecurityModule": "0x7E81F96355529Cf7Cb768B3CCf49552E727eC7EE", + "interchainSecurityModule": "0x68A7B7dA49C9514d6A1352F68Cb1439B320fC432", "mailbox": "0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9", "merkleTreeHook": "0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227", "pausableHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", @@ -5460,7 +5460,7 @@ "interchainAccountIsm": "0xE67Dc24970B482579923551Ede52BD35a2858989", "interchainAccountRouter": "0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409", "interchainGasPaymaster": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", - "interchainSecurityModule": "0xdA07f00d13E908b7c52C02b38AB748d924DdE890", + "interchainSecurityModule": "0x3387f3fb04C5A579391B5383e203b04E65b70dbE", "mailbox": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", "merkleTreeHook": "0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8", "pausableHook": "0xdAa1B65547fB969c9ff5678956AB2FF9771B883D", @@ -5524,7 +5524,7 @@ "interchainAccountIsm": "0x20a0A32a110362920597F72974E1E0d7e25cA20a", "interchainAccountRouter": "0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54", "interchainGasPaymaster": "0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6", - "interchainSecurityModule": "0x90B3696922e6a8128EEB23F08Cbf5b2545f849C6", + "interchainSecurityModule": "0x888C1DCDf1BD8c86a9389facA07b9e7bdC9658CE", "mailbox": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "merkleTreeHook": "0xf147bBD944C610F86DaE6C7668497D22932C1E4A", "pausableHook": "0x872Bd98057931c8809927c6dE2ef39738a80Eb0C", @@ -5591,7 +5591,7 @@ "interchainAccountIsm": "0xf40eE9FF75Fa34910b7C4C8d68d4850B3bD184D3", "interchainAccountRouter": "0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea", "interchainGasPaymaster": "0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409", - "interchainSecurityModule": "0x727DaD31073Dcc961B76Cbd625D6d074fA7988c9", + "interchainSecurityModule": "0x17DCe525bEa991c5DE56178aFc44dB7319842f98", "mailbox": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", "merkleTreeHook": "0x8c794a781327b819416E7b67908f1D22397f1E67", "pausableHook": "0x4d264424905535E97396Db83bd553D0d73A4EF9d", @@ -5658,7 +5658,7 @@ "interchainAccountIsm": "0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D", "interchainAccountRouter": "0x7279B1e11142078b8dC9e69620200f4C84FB8aaa", "interchainGasPaymaster": "0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7", - "interchainSecurityModule": "0x8A4C3c1f234e9da8e325902f7105471B078a1e23", + "interchainSecurityModule": "0x093472cc2aCA5574f8B370907DEdA68d76272eeA", "mailbox": "0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8", "merkleTreeHook": "0x086c3947F71BE98A0bDf4AB7239955e7542b0CbA", "pausableHook": "0x9C6e8d989ea7F212e679191BEb44139d83ac927a", @@ -5728,7 +5728,7 @@ "interchainAccountIsm": "0x8a733038eF4BbC314eE0F7595257D8d3799B6aA9", "interchainAccountRouter": "0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9", "interchainGasPaymaster": "0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C", - "interchainSecurityModule": "0xff5306993F410008d1d7581695252e95c55bc458", + "interchainSecurityModule": "0xD52E36491483411A50ED27B0E1dEFdFCeBBcABBD", "mailbox": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6", "merkleTreeHook": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", "pausableHook": "0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9", @@ -5789,7 +5789,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x16c7A4C2f4BCDBFC8205Baa9F1dCBcd44B4d8d90", + "interchainSecurityModule": "0xf5006372D20bfDC97216dD6B122e533E8A675833", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5859,7 +5859,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x78E12CF0Ee442f7B9E6df137e0c038A4b6e8d8Eb", + "interchainSecurityModule": "0x55B0c16da418E707AB9344A852969f6cebbb7Ff9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5920,7 +5920,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0xF2c7E4Ad99b08d1a2CF139cb7b79d645b50BEdEa", + "interchainSecurityModule": "0x6D4A16dF0d74402aD9297efc581797c4ce80bF3e", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5984,7 +5984,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x0D9b693d45690a9FfE8F1e8E0dC41A2C6207E090", + "interchainSecurityModule": "0x55B0c16da418E707AB9344A852969f6cebbb7Ff9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -6048,7 +6048,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x78E12CF0Ee442f7B9E6df137e0c038A4b6e8d8Eb", + "interchainSecurityModule": "0x55B0c16da418E707AB9344A852969f6cebbb7Ff9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -6121,7 +6121,7 @@ "interchainAccountIsm": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainAccountRouter": "0x4D50044335dc1d4D26c343AdeDf6E47808475Deb", "interchainGasPaymaster": "0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B", - "interchainSecurityModule": "0xE490AbA47A8b6B26dFF22A61aAFd51C52fD386c2", + "interchainSecurityModule": "0xb87F7db787f9A3a838FB0869788d417d68eEcc8E", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", "pausableHook": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", @@ -6185,7 +6185,7 @@ "interchainAccountIsm": "0x31Bb27f6007C33acD1be83ACEd3164C60f8F7b13", "interchainAccountRouter": "0xEeb5a99a75585fe137c83E7b62b74f87264A5481", "interchainGasPaymaster": "0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03", - "interchainSecurityModule": "0x56b99cFe785C7e9F61040cdd4081d63Ef48Cf928", + "interchainSecurityModule": "0xCC9268adFB3a41af82B77214f9B31e36CfE40733", "mailbox": "0x0dF25A2d59F03F039b56E90EdC5B89679Ace28Bc", "merkleTreeHook": "0xC88636fFdFAc7cb87b7A76310B7a62AF0A000595", "pausableHook": "0x2AF32cF8e3Cf42d221eDa0c843818fA5ee129E27", @@ -6249,7 +6249,7 @@ "interchainAccountIsm": "0x28291a7062afA569104bEd52F7AcCA3dD2FafD11", "interchainAccountRouter": "0xe9E3444DDD80c50276c0Fcf316026f6d7fEc2c47", "interchainGasPaymaster": "0x25EAC2007b0D40E3f0AF112FD346412321038719", - "interchainSecurityModule": "0xCb1514f34Dfd366cF74D0F58F3D8BDE49C059533", + "interchainSecurityModule": "0xdc920aA197992467E351FDf0AFbbEf49d2114985", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "pausableHook": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", @@ -6317,7 +6317,7 @@ "interchainAccountIsm": "0x027eFD1695941969435AA640542B690044dF7E06", "interchainAccountRouter": "0x65F1343AC23D4fF48bf6c7E0c55872d245397567", "interchainGasPaymaster": "0x28291a7062afA569104bEd52F7AcCA3dD2FafD11", - "interchainSecurityModule": "0xF0f29D8b9d16aE092886A38571D5E7Ffdb508EB3", + "interchainSecurityModule": "0xa3eEC2fF42F84eFaa1d98daC5E60CB2F2c896570", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xcd90D49b046772F710250b9119117169CB2e4D8b", "pausableHook": "0x7CE76f5f0C469bBB4cd7Ea6EbabB54437A093127", @@ -6500,7 +6500,7 @@ "interchainAccountIsm": "0xf9609bB22847e0DB5F6fB8f95b84D25A19b46ac5", "interchainAccountRouter": "0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29", "interchainGasPaymaster": "0xFb7D175d6F53800D68D32C3Fe1416807A394cC24", - "interchainSecurityModule": "0x882eE9A3938501558823514b70d8bBa945953B80", + "interchainSecurityModule": "0x91E25120E1415D4f53E018eb0E48EAC964E19856", "mailbox": "0x473884010F0C1742DA8Ad01E7E295624B931076b", "merkleTreeHook": "0xdA629E1B79e3420ECd1e80571aDd6a4a3b13AE79", "pausableHook": "0xe93f2f409ad8B5000431D234472973fe848dcBEC", @@ -6567,7 +6567,7 @@ "interchainAccountIsm": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", "interchainAccountRouter": "0x021D2810a758c833080DEc2F1Fa8F571Aae97D45", "interchainGasPaymaster": "0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E", - "interchainSecurityModule": "0x597210e915409D2B9D4487Ef21ea115444e419Ed", + "interchainSecurityModule": "0x16eeA2e215f9449D45f5ba98E639a848EdF7638E", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", "pausableHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", @@ -6637,7 +6637,7 @@ "interchainAccountIsm": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainAccountRouter": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x7664aAE6C1bCFfe364F742c75f52D3dC70FF412E", + "interchainSecurityModule": "0x469220D6CB0465A3Cf948fcF8Cd22A3523CB678A", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6704,7 +6704,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x44f0875a9a412849B2167c7a4A3ECE4e13ba1ac4", + "interchainSecurityModule": "0xbf4250D5C21A8aEd8d75B246Af830e2e8DD094D8", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6774,7 +6774,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x44f0875a9a412849B2167c7a4A3ECE4e13ba1ac4", + "interchainSecurityModule": "0xbf4250D5C21A8aEd8d75B246Af830e2e8DD094D8", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6844,7 +6844,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x03Def25faaABF7aa393eC4108267f0b2c0B1F58f", + "interchainSecurityModule": "0x9943A92d1691855d369eaA52F213128Cc2818523", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6908,7 +6908,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x03Def25faaABF7aa393eC4108267f0b2c0B1F58f", + "interchainSecurityModule": "0xE4E34ceeB9D9BCB0d63B17c1aBc2541064AE5D06", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6928,7 +6928,8 @@ "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907", "index": { "from": 469384 - } + }, + "gnosisSafeTransactionServiceUrl": "https://prod.form.keypersafe.xyz/" }, "ink": { "blockExplorers": [ @@ -6972,7 +6973,7 @@ "interchainAccountIsm": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", "interchainAccountRouter": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", "interchainGasPaymaster": "0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E", - "interchainSecurityModule": "0x017a26fE04aB95c77BA6DeE4d441A3F2402BBe17", + "interchainSecurityModule": "0xD615ea7cE5147D27EC2e1592021080113Eda7DD9", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", "pausableHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", @@ -6992,7 +6993,8 @@ "validatorAnnounce": "0x426a3CE72C1586b1867F9339550371E86DB3e396", "index": { "from": 860343 - } + }, + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-ink.safe.global/" }, "rivalz": { "blockExplorers": [ @@ -7039,7 +7041,7 @@ "interchainAccountIsm": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", "interchainAccountRouter": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", "interchainGasPaymaster": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", - "interchainSecurityModule": "0x0fB08d319a9Daaf6e8005873D2BA1980Bd59c614", + "interchainSecurityModule": "0x08809E9649489E51b5EF69C1C306aC44A774dE21", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", "pausableHook": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", @@ -7061,10 +7063,10 @@ "soneium": { "blockExplorers": [ { - "apiUrl": "https://explorer.soneium.org/api", + "apiUrl": "https://soneium.blockscout.com/api", "family": "blockscout", "name": "Soneium Explorer", - "url": "https://explorer.soneium.org" + "url": "https://soneium.blockscout.com" } ], "blocks": { @@ -7100,7 +7102,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x7664aAE6C1bCFfe364F742c75f52D3dC70FF412E", + "interchainSecurityModule": "0xf15C76Ac5C5BA5265Af2d07B05d4bc43CDf4B395", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -7164,7 +7166,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x794BF08dE42238809d811193A6189D6d03177DF8", + "interchainSecurityModule": "0xab5C0bEB5A72D0BcE7aA2AcCAeF18aDF2f1Ed6D9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -7231,7 +7233,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x557862e7ADd75E72779316b119F75358b3445102", + "interchainSecurityModule": "0xab5C0bEB5A72D0BcE7aA2AcCAeF18aDF2f1Ed6D9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -7252,6 +7254,447 @@ "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": "0xBD787bdC84605F4a3485993f2F046b5fb78d57a2", + "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": "blockscout", + "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": "0x25B466036E3C25aD6ECbe753D2F00b71921f35aA", + "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": "0xfeFef7af07A8A7F017DA8c8b44796a27beFe17b0", + "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": "0xB268C727417e5d21c21BBEF9220A6A03B8c163Ff", + "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": "0x25B466036E3C25aD6ECbe753D2F00b71921f35aA", + "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 6f8dca0b8d..9319a94ab7 100644 --- a/rust/main/config/testnet_config.json +++ b/rust/main/config/testnet_config.json @@ -31,7 +31,7 @@ "interchainAccountIsm": "0x6895d3916B94b386fAA6ec9276756e16dAe7480E", "interchainAccountRouter": "0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b", "interchainGasPaymaster": "0x44769b0f4a6f01339e131a691cc2eebbb519d297", - "interchainSecurityModule": "0xDf1d3c37FfA6134767911B8876305afc187dA207", + "interchainSecurityModule": "0xEF36f576B107c4D5ebCa6F7F725263eabe5307a7", "isTestnet": true, "mailbox": "0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59", "merkleTreeHook": "0x221FA9CBaFcd6c1C3d206571Cf4427703e023FFa", @@ -94,7 +94,7 @@ "from": 49690504 }, "interchainGasPaymaster": "0xc756cFc1b7d0d4646589EDf10eD54b201237F5e8", - "interchainSecurityModule": "0x69a84432Ba4FaD95FC5850aCD613C6daD286908C", + "interchainSecurityModule": "0x84919eC830aaadAc11856F8843F8079d652be0aA", "isTestnet": true, "mailbox": "0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8", "merkleTreeHook": "0xAD34A66Bf6dB18E858F6B686557075568c6E031C", @@ -162,7 +162,7 @@ "from": 13851043 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0x2945eCB46AE83B1A37b589A9c1219061522A73aD", + "interchainSecurityModule": "0xeDE933F179C81Da173f5d4bc4aff849112e4DC16", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -232,7 +232,7 @@ "interchainAccountIsm": "0xa9D8Ec959F34272B1a56D09AF00eeee58970d3AE", "interchainAccountRouter": "0x6d2B3e304E58c2a19f1492E7cf15CaF63Ce6e0d2", "interchainGasPaymaster": "0x0dD20e410bdB95404f71c5a4e7Fa67B892A5f949", - "interchainSecurityModule": "0x0c29F3Ce8995b41eB8c2b3E1eC33c3fa10C8cf91", + "interchainSecurityModule": "0xF3979a3e04158271765A2DB70be81Df4C315b19c", "isTestnet": true, "mailbox": "0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D", "merkleTreeHook": "0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f", @@ -301,7 +301,7 @@ "from": 4950 }, "interchainGasPaymaster": "0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450", - "interchainSecurityModule": "0xa25786D36B5a5eDeCAf75142dD056B1Ed1473f44", + "interchainSecurityModule": "0x1576dB24aC8a8B5D50BDE896f64b76877bE2B9da", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x4926a10788306D84202A2aDbd290b7743146Cc17", @@ -402,7 +402,7 @@ "from": 1606754 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0x1AFC8F84cAE294C3E6d3Ddb031946B93f08272b5", + "interchainSecurityModule": "0xF9C638EB093ad2E66E5f4d444fE1D42477470075", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -468,7 +468,7 @@ "interchainAccountIsm": "0xfaB4815BDC5c60c6bD625459C8577aFdD79D9311", "interchainAccountRouter": "0xeEF6933122894fF217a7dd07510b3D64b747e29b", "interchainGasPaymaster": "0x6895d3916B94b386fAA6ec9276756e16dAe7480E", - "interchainSecurityModule": "0x7b5AD17cdAbdED0C29B161c647DA32dCE51AB13B", + "interchainSecurityModule": "0xAEB1108dd551736001880BdD7b920F9Da051b00B", "isTestnet": true, "mailbox": "0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0", "merkleTreeHook": "0x9ff6ac3dAf63103620BBf76136eA1AFf43c2F612", @@ -534,7 +534,7 @@ "from": 1543015 }, "interchainGasPaymaster": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9", - "interchainSecurityModule": "0x16738b80D39Fa0652F2D853c3E6235Afb7cA6dDc", + "interchainSecurityModule": "0x3411DE0359d0Fb09E3154Aa231521cb7F2856e6f", "isTestnet": true, "mailbox": "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc", "merkleTreeHook": "0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE", @@ -599,7 +599,7 @@ "from": 15833917 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0x81B81B3b296ecf99d5bAC0DE4e5fF7a3ceECf08b", + "interchainSecurityModule": "0x401b3EeD483f43594902a38Ee74fa80F966f31fe", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -727,7 +727,7 @@ "from": 10634605 }, "interchainGasPaymaster": "0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C", - "interchainSecurityModule": "0x428a2384F6013A9c561737E9A58288e071470192", + "interchainSecurityModule": "0x4944142B6ba61B31A2F5a0Af79D72DBAE9cf6BC0", "isTestnet": true, "mailbox": "0x54148470292C24345fb828B003461a9444414517", "merkleTreeHook": "0xddf4C3e791caCaFd26D7fb275549739B38ae6e75", @@ -802,7 +802,7 @@ "interchainAccountIsm": "0xE023239c8dfc172FF008D8087E7442d3eBEd9350", "interchainAccountRouter": "0xe17c37212d785760E8331D4A4395B17b34Ba8cDF", "interchainGasPaymaster": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", - "interchainSecurityModule": "0xb9A0fa05Fcce52605f0142c1A5Aca32f223eB961", + "interchainSecurityModule": "0x78b00837EE0c0265eB4f475d0D21236716AC0FdA", "isTestnet": true, "mailbox": "0x3C5154a193D6e2955650f9305c8d80c18C814A68", "merkleTreeHook": "0x863E8c26621c52ACa1849C53500606e73BA272F0", @@ -880,7 +880,7 @@ "interchainAccountIsm": "0x83a3068B719F764d413625dA77468ED74789ae02", "interchainAccountRouter": "0x8e131c8aE5BF1Ed38D05a00892b6001a7d37739d", "interchainGasPaymaster": "0x6f2756380FD49228ae25Aa7F2817993cB74Ecc56", - "interchainSecurityModule": "0x5bC248C8010848067919fA73F4555AeE95Df38a4", + "interchainSecurityModule": "0x549a1C8DBE21aA89d729637521459bc2890467b0", "isTestnet": true, "mailbox": "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766", "merkleTreeHook": "0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d", @@ -940,7 +940,7 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Solana Testnet", - "displayNameShort": "Sol Testnet", + "displayNameShort": "Solana Testnet", "domainId": 1399811150, "index": { "from": 1, @@ -963,7 +963,8 @@ } ], "validatorAnnounce": "8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3", - "gasCurrencyCoinGeckoId": "solana" + "gasCurrencyCoinGeckoId": "solana", + "interchainSecurityModule": "4GHxwWyKB9exhKG4fdyU2hfLgfFzhHp2WcsSKc2uNR1k" }, "superpositiontestnet": { "aggregationHook": "0x331eb40963dc11F5BB271308c42d97ac6e41F124", @@ -990,7 +991,7 @@ "from": 3111622 }, "interchainGasPaymaster": "0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450", - "interchainSecurityModule": "0x8a833B1230A75712a767e81556F1Ad612A0F76F3", + "interchainSecurityModule": "0x7d5C116FF61393A1a1C75C45684DF93Ba00a194E", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x4926a10788306D84202A2aDbd290b7743146Cc17", @@ -1078,7 +1079,7 @@ "interchainAccountIsm": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", "interchainAccountRouter": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", "interchainGasPaymaster": "0x04438ef7622f5412f82915F59caD4f704C61eA48", - "interchainSecurityModule": "0x5e39968B0435332dE915C2FF62fD373fBbbb7C75", + "interchainSecurityModule": "0x3B431aEc0E9dBd0B903E1C784C01219503e6A0bd", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C", "pausableHook": "0x783c4a0bB6663359281aD4a637D5af68F83ae213", @@ -1138,7 +1139,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0x97b1e5FBF33d82fAD9C3Aa0fF901e9B9d63090E3", + "interchainSecurityModule": "0xEBbf2a8E1008ceeD1F480B02d11d72d4426CFbAf", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1206,7 +1207,7 @@ "interchainAccountIsm": "0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72", "interchainAccountRouter": "0xB5fB1F5410a2c2b7deD462d018541383968cB01c", "interchainGasPaymaster": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", - "interchainSecurityModule": "0xAfDF88EB9447e412c89304F34813c5564307709b", + "interchainSecurityModule": "0xEd2112547065be8c15CfE3222b642Ae35EFA189b", "mailbox": "0xB08d78F439e55D02C398519eef61606A5926245F", "merkleTreeHook": "0x783c4a0bB6663359281aD4a637D5af68F83ae213", "pausableHook": "0x66b71A4e18FbE09a6977A6520B47fEDdffA82a1c", @@ -1267,7 +1268,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0xe5B27D2198EEacf4FeC7d558CdE3b4fDCe4d37f9", + "interchainSecurityModule": "0x4cA607E538A534df884B3B98A7B0Da9D2170E0ae", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1459,7 +1460,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0x0511f73F8D734e0fc9df1E6C0937592a3A371B18", + "interchainSecurityModule": "0xa8C25c32777DbbD1272771fEB8Df759e3B4B4F31", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1710,7 +1711,7 @@ "interchainAccountIsm": "0x39c85C84876479694A2470c0E8075e9d68049aFc", "interchainAccountRouter": "0x80fE4Cb8c70fc60B745d4ffD4403c27a8cBC9e02", "interchainGasPaymaster": "0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb", - "interchainSecurityModule": "0x3865c419335B36d9CE240b515124Ab1c33927004", + "interchainSecurityModule": "0x63E1D5320051d44C86aC760881aa337482f35FB5", "mailbox": "0x33dB966328Ea213b0f76eF96CA368AB37779F065", "merkleTreeHook": "0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD", "pausableHook": "0x4fE19d49F45854Da50b6009258929613EC92C147", @@ -1773,7 +1774,7 @@ "interchainAccountIsm": "0xc08675806BA844467E559E45E4bB59e66778bDcd", "interchainAccountRouter": "0x39c85C84876479694A2470c0E8075e9d68049aFc", "interchainGasPaymaster": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", - "interchainSecurityModule": "0x4B310268158B842cbE65A216714C6A7D1d087155", + "interchainSecurityModule": "0xD552E8B478A4B7A2d1D4c6e76A0FB2A8730d5E79", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE", "pausableHook": "0xe0B988062A0C6492177d64823Ab95a9c256c2a5F", @@ -1836,7 +1837,7 @@ "interchainAccountIsm": "0x3ca332A585FDB9d4FF51f2FA8999eA32184D3606", "interchainAccountRouter": "0x4eC139a771eBdD3b0a0b67bb7E08960210882d44", "interchainGasPaymaster": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", - "interchainSecurityModule": "0xAd6172DA241CE5DC38a32E0E375FD0A1889b9E48", + "interchainSecurityModule": "0x7b7187f72D2f078c4e25B0401FC266242Ca8A5E8", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE", "pausableHook": "0xe0B988062A0C6492177d64823Ab95a9c256c2a5F", @@ -1899,7 +1900,7 @@ "interchainAccountIsm": "0xBF2C366530C1269d531707154948494D3fF4AcA7", "interchainAccountRouter": "0xBdf49bE2201A1c4B13023F0a407196C6Adb32680", "interchainGasPaymaster": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", - "interchainSecurityModule": "0xa6570241124A6534801d1eba13F46078Dc7d1974", + "interchainSecurityModule": "0xd85b1fb952a30517BFE3F53cb6049385f1ACe35b", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72", "pausableHook": "0xc76E477437065093D353b7d56c81ff54D167B0Ab", @@ -1970,7 +1971,7 @@ "interchainAccountIsm": "0x342B5630Ba1C1e4d3048E51Dad208201aF52692c", "interchainAccountRouter": "0xe036768e48Cb0D42811d2bF0748806FCcBfCd670", "interchainGasPaymaster": "0x867f2089D09903f208AeCac84E599B90E5a4A821", - "interchainSecurityModule": "0xbe84F098eE49c32395edA629737AD3f4c0542ADA", + "interchainSecurityModule": "0x4F0B0317FF574aAc61D1D2Db4A78501D0342602a", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xB5fB1F5410a2c2b7deD462d018541383968cB01c", "pausableHook": "0x7483faD0Bc297667664A43A064bA7c9911659f57", @@ -2029,7 +2030,7 @@ "domainRoutingIsmFactory": "0x44b764045BfDC68517e10e783E69B376cef196B2", "fallbackRoutingHook": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainGasPaymaster": "0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38", - "interchainSecurityModule": "0x3490059390DDc4de38822488A1D63B4e131D0Aaf", + "interchainSecurityModule": "0x500a6350D7B121eD28a7EFE91Ac0885f494A28b2", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x4fE19d49F45854Da50b6009258929613EC92C147", "pausableHook": "0x01812D60958798695391dacF092BAc4a715B1718", @@ -2164,6 +2165,47 @@ "index": { "from": 86008 } + }, + "sonicsvmtestnet": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.sonic.game/?cluster=testnet.v1", + "family": "other", + "name": "Sonic Explorer", + "url": "https://explorer.sonic.game/?cluster=testnet.v1" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.4, + "reorgPeriod": 0 + }, + "chainId": 15153042, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic SVM Testnet", + "displayNameShort": "Sonic SVM Testnet", + "domainId": 15153042, + "isTestnet": true, + "name": "sonicsvmtestnet", + "nativeToken": { + "decimals": 9, + "name": "Solana", + "symbol": "SOL" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://api.testnet.sonic.game" + } + ], + "mailbox": "6BaTtWPMpWdA6tHqdT2VbogC4XZ9QV5cNCYpBrx6WP7B", + "merkleTreeHook": "6BaTtWPMpWdA6tHqdT2VbogC4XZ9QV5cNCYpBrx6WP7B", + "validatorAnnounce": "84NjUotjZcNBVGBhvwERPNS6zaAfhkJkG33aSiNxPma2", + "interchainGasPaymaster": "FSy4hQ92ZTPJVG2UmiWiymoogpwEDBcucKnLzLnbrBDt", + "interchainSecurityModule": "DgLicFznJQbnapc9cLSTB2DxN1FnrFnZo5SwD55iTycA" } }, "defaultRpcConsensusType": "fallback" 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/agent.rs b/rust/main/hyperlane-base/src/agent.rs index 5ee00c1eb9..87ad60f46c 100644 --- a/rust/main/hyperlane-base/src/agent.rs +++ b/rust/main/hyperlane-base/src/agent.rs @@ -80,6 +80,9 @@ pub async fn agent_main() -> Result<()> { // the variable defaults to "VERGEN_IDEMPOTENT_OUTPUT". let git_sha = env!("VERGEN_GIT_SHA").to_owned(); + // Logging is not initialised at this point, so, using `println!` + println!("Agent {} starting up with version {git_sha}", A::AGENT_NAME); + let agent_metadata = AgentMetadata::new(git_sha); let settings = A::Settings::load()?; diff --git a/rust/main/hyperlane-base/src/contract_sync/metrics.rs b/rust/main/hyperlane-base/src/contract_sync/metrics.rs index 54e3c7a2cb..7c906b28f1 100644 --- a/rust/main/hyperlane-base/src/contract_sync/metrics.rs +++ b/rust/main/hyperlane-base/src/contract_sync/metrics.rs @@ -26,6 +26,9 @@ pub struct ContractSyncMetrics { /// See `last_known_message_nonce` in CoreMetrics. pub message_nonce: IntGaugeVec, + /// Contract sync liveness metric + pub liveness_metrics: IntGaugeVec, + /// Metrics for SequenceAware and RateLimited cursors. pub cursor_metrics: Arc, } @@ -49,6 +52,14 @@ impl ContractSyncMetrics { ) .expect("failed to register stored_events metric"); + let liveness_metrics = metrics + .new_int_gauge( + "contract_sync_liveness", + "Last timestamp observed by contract sync", + &["data_type", "chain"], + ) + .expect("failed to register liveness metric"); + let message_nonce = metrics.last_known_message_nonce(); let cursor_metrics = Arc::new(CursorMetrics::new(metrics)); @@ -56,6 +67,7 @@ impl ContractSyncMetrics { indexed_height, stored_events, message_nonce, + liveness_metrics, 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 c9048b4808..d79b9a2616 100644 --- a/rust/main/hyperlane-base/src/contract_sync/mod.rs +++ b/rust/main/hyperlane-base/src/contract_sync/mod.rs @@ -1,5 +1,6 @@ use std::{ collections::HashSet, fmt::Debug, hash::Hash, marker::PhantomData, sync::Arc, time::Duration, + time::UNIX_EPOCH, }; use axum::async_trait; @@ -98,8 +99,13 @@ where .metrics .stored_events .with_label_values(&[label, chain_name]); + let liveness_metric = self + .metrics + .liveness_metrics + .with_label_values(&[label, chain_name]); loop { + Self::update_liveness_metric(&liveness_metric); if let Some(rx) = opts.tx_id_receiver.as_mut() { self.fetch_logs_from_receiver(rx, &stored_logs_metric).await; } @@ -107,7 +113,26 @@ where self.fetch_logs_with_cursor(cursor, &stored_logs_metric, &indexed_height_metric) .await; } + + // Added so that we confuse compiler that it is an infinite loop + if false { + break; + } } + + // Although the above loop should never end (unless by panicking), + // we put log here to make sure that we see when this method returns normally. + // Hopefully, compiler will not optimise this code out. + info!(chain = chain_name, label, "contract sync loop exit"); + } + + fn update_liveness_metric(liveness_metric: &GenericGauge) { + liveness_metric.set( + UNIX_EPOCH + .elapsed() + .map(|d| d.as_secs() as i64) + .unwrap_or(0), + ); } #[instrument(fields(domain=self.domain().name()), skip(self, recv, stored_logs_metric))] diff --git a/rust/main/hyperlane-base/src/metrics/agent_metrics.rs b/rust/main/hyperlane-base/src/metrics/agent_metrics.rs index ad1320488f..2f4862d4aa 100644 --- a/rust/main/hyperlane-base/src/metrics/agent_metrics.rs +++ b/rust/main/hyperlane-base/src/metrics/agent_metrics.rs @@ -94,7 +94,7 @@ pub struct ChainMetrics { pub gas_price: Option, /// Boolean marker for critical errors on a chain, signalling loss of liveness. - critical_error: IntGaugeVec, + pub critical_error: IntGaugeVec, } impl ChainMetrics { 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/base.rs b/rust/main/hyperlane-base/src/settings/base.rs index 7024d67cc6..d298a3c94f 100644 --- a/rust/main/hyperlane-base/src/settings/base.rs +++ b/rust/main/hyperlane-base/src/settings/base.rs @@ -1,9 +1,9 @@ use std::{collections::HashMap, fmt::Debug, hash::Hash, sync::Arc}; use eyre::{eyre, Context, Result}; -use futures_util::future::try_join_all; +use futures_util::future::join_all; use hyperlane_core::{ - HyperlaneChain, HyperlaneDomain, HyperlaneLogStore, HyperlaneProvider, + HyperlaneDomain, HyperlaneLogStore, HyperlaneProvider, HyperlaneSequenceAwareIndexerStoreReader, HyperlaneWatermarkedLogStore, InterchainGasPaymaster, Mailbox, MerkleTreeHook, MultisigIsm, SequenceAwareIndexer, ValidatorAnnounce, H256, }; @@ -132,11 +132,11 @@ macro_rules! build_contract_fns { &self, domains: impl Iterator, metrics: &CoreMetrics, - ) -> Result>> { - try_join_all(domains.map(|d| self.$singular(d, metrics))) - .await? + ) -> HashMap>> { + join_all(domains.map(|d| async { (d.clone(), self.$singular(d, metrics).await) })) + .await .into_iter() - .map(|i| Ok((i.domain().clone(), Arc::from(i)))) + .map(|(d, future)| (d, future.map(|f| Arc::from(f)))) .collect() } }; 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/utils/run-locally/src/invariants/common.rs b/rust/main/utils/run-locally/src/invariants/common.rs index 35a0c5eae4..1f603db53b 100644 --- a/rust/main/utils/run-locally/src/invariants/common.rs +++ b/rust/main/utils/run-locally/src/invariants/common.rs @@ -1,3 +1,4 @@ // This number should be even, so the messages can be split into two equal halves // sent before and after the relayer spins up, to avoid rounding errors. pub const SOL_MESSAGES_EXPECTED: u32 = 20; +pub const SOL_MESSAGES_WITH_NON_MATCHING_IGP: u32 = 1; 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..6e69fd5e63 100644 --- a/rust/main/utils/run-locally/src/invariants/termination_invariants.rs +++ b/rust/main/utils/run-locally/src/invariants/termination_invariants.rs @@ -7,7 +7,7 @@ use crate::utils::get_matching_lines; use maplit::hashmap; use relayer::GAS_EXPENDITURE_LOG_MESSAGE; -use crate::invariants::SOL_MESSAGES_EXPECTED; +use crate::invariants::common::{SOL_MESSAGES_EXPECTED, SOL_MESSAGES_WITH_NON_MATCHING_IGP}; use crate::logging::log; use crate::solana::solana_termination_invariants_met; use crate::{ @@ -30,7 +30,15 @@ pub fn termination_invariants_met( } else { 0 }; + let sol_messages_with_non_matching_igp = if config.sealevel_enabled { + SOL_MESSAGES_WITH_NON_MATCHING_IGP + } else { + 0 + }; + + // this is total messages expected to be delivered let total_messages_expected = eth_messages_expected + sol_messages_expected; + let total_messages_dispatched = total_messages_expected + sol_messages_with_non_matching_igp; let lengths = fetch_metric( RELAYER_METRICS_PORT, @@ -38,8 +46,13 @@ pub fn termination_invariants_met( &hashmap! {}, )?; 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); + if lengths.iter().sum::() + != ZERO_MERKLE_INSERTION_KATHY_MESSAGES + sol_messages_with_non_matching_igp + { + log!( + "Relayer queues contain more messages than the zero-merkle-insertion ones. Lengths: {:?}", + lengths + ); return Ok(false); }; @@ -128,11 +141,11 @@ pub fn termination_invariants_met( // TestSendReceiver randomly breaks gas payments up into // two. So we expect at least as many gas payments as messages. - if gas_payment_events_count < total_messages_expected { + if gas_payment_events_count < total_messages_dispatched { log!( "Relayer has {} gas payment events, expected at least {}", gas_payment_events_count, - total_messages_expected + total_messages_dispatched ); return Ok(false); } @@ -153,12 +166,13 @@ pub fn termination_invariants_met( )? .iter() .sum::(); - if dispatched_messages_scraped != total_messages_expected + ZERO_MERKLE_INSERTION_KATHY_MESSAGES + if dispatched_messages_scraped + != total_messages_dispatched + ZERO_MERKLE_INSERTION_KATHY_MESSAGES { log!( "Scraper has scraped {} dispatched messages, expected {}", dispatched_messages_scraped, - total_messages_expected + ZERO_MERKLE_INSERTION_KATHY_MESSAGES, + total_messages_dispatched + ZERO_MERKLE_INSERTION_KATHY_MESSAGES, ); return Ok(false); } @@ -190,7 +204,7 @@ pub fn termination_invariants_met( log!( "Scraper has scraped {} delivered messages, expected {}", delivered_messages_scraped, - total_messages_expected + total_messages_expected + sol_messages_with_non_matching_igp ); return Ok(false); } diff --git a/rust/main/utils/run-locally/src/main.rs b/rust/main/utils/run-locally/src/main.rs index 4686c15446..7aeb3ae101 100644 --- a/rust/main/utils/run-locally/src/main.rs +++ b/rust/main/utils/run-locally/src/main.rs @@ -227,7 +227,7 @@ fn main() -> ExitCode { "GASPAYMENTENFORCEMENT", r#"[{ "type": "minimum", - "payment": "1", + "payment": "1" }]"#, ) .arg( @@ -465,6 +465,11 @@ fn main() -> ExitCode { initiate_solana_hyperlane_transfer(solana_path.clone(), solana_config_path.clone()) .join(); } + initiate_solana_non_matching_igp_paying_transfer( + solana_path.clone(), + solana_config_path.clone(), + ) + .join(); } log!("Setup complete! Agents running in background..."); diff --git a/rust/main/utils/run-locally/src/solana.rs b/rust/main/utils/run-locally/src/solana.rs index 022d086a65..3e32524cdd 100644 --- a/rust/main/utils/run-locally/src/solana.rs +++ b/rust/main/utils/run-locally/src/solana.rs @@ -73,6 +73,8 @@ const SOLANA_REMOTE_CHAIN_ID: &str = "13376"; pub const SOLANA_CHECKPOINT_LOCATION: &str = "/tmp/test_sealevel_checkpoints_0x70997970c51812dc3a010c7d01b50e0d17dc79c8"; +const SOLANA_GAS_ORACLE_CONFIG_FILE: &str = + "../sealevel/environments/local-e2e/gas-oracle-configs.json"; const SOLANA_OVERHEAD_CONFIG_FILE: &str = "../sealevel/environments/local-e2e/overheads.json"; // Install the CLI tools and return the path to the bin dir. @@ -159,7 +161,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 +234,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() @@ -281,6 +282,7 @@ pub fn start_solana_test_validator( .join(); sealevel_client + .clone() .cmd("validator-announce") .cmd("announce") .arg("validator", "0x70997970c51812dc3a010c7d01b50e0d17dc79c8") @@ -292,6 +294,43 @@ pub fn start_solana_test_validator( .run() .join(); + sealevel_client + .clone() + .cmd("igp") + .cmd("init-igp-account") + .arg("program-id", "GwHaw8ewMyzZn9vvrZEnTEAAYpLdkGYs195XWcLDCN4U") + .arg("environment", SOLANA_ENV_NAME) + .arg("environments-dir", SOLANA_ENVS_DIR) + .arg("chain", "sealeveltest1") + .arg("chain-config-file", SOLANA_CHAIN_CONFIG_FILE) + .arg("gas-oracle-config-file", SOLANA_GAS_ORACLE_CONFIG_FILE) + .arg( + "account-salt", + "0x0000000000000000000000000000000000000000000000000000000000000001", + ) + .run() + .join(); + + sealevel_client + .cmd("igp") + .cmd("init-overhead-igp-account") + .arg("program-id", "GwHaw8ewMyzZn9vvrZEnTEAAYpLdkGYs195XWcLDCN4U") + .arg("environment", SOLANA_ENV_NAME) + .arg("environments-dir", SOLANA_ENVS_DIR) + .arg("chain", "sealeveltest1") + .arg("chain-config-file", SOLANA_CHAIN_CONFIG_FILE) + .arg("overhead-config-file", SOLANA_OVERHEAD_CONFIG_FILE) + .arg( + "inner-igp-account", + "8EniU8dQaGQ3HWWtT77V7hrksheygvEu6TtzJ3pX1nKM", + ) + .arg( + "account-salt", + "0x0000000000000000000000000000000000000000000000000000000000000001", + ) + .run() + .join(); + log!("Local Solana chain started and hyperlane programs deployed and initialized successfully"); (solana_config_path, validator) @@ -342,6 +381,57 @@ pub fn initiate_solana_hyperlane_transfer( message_id } +#[apply(as_task)] +#[allow(clippy::get_first)] +pub fn initiate_solana_non_matching_igp_paying_transfer( + solana_cli_tools_path: PathBuf, + solana_config_path: PathBuf, +) -> String { + let sender = Program::new(concat_path(&solana_cli_tools_path, "solana")) + .arg("config", solana_config_path.to_str().unwrap()) + .arg("keypair", SOLANA_KEYPAIR) + .cmd("address") + .run_with_output() + .join() + .get(0) + .expect("failed to get sender address") + .trim() + .to_owned(); + + let output = sealevel_client(&solana_cli_tools_path, &solana_config_path) + .cmd("token") + .cmd("transfer-remote") + .cmd(SOLANA_KEYPAIR) + .cmd("10000000000") + .cmd(SOLANA_REMOTE_CHAIN_ID) + .cmd(sender) // send to self + .cmd("native") + .arg("program-id", "CGn8yNtSD3aTTqJfYhUb6s1aVTN75NzwtsFKo1e83aga") + .run_with_output() + .join(); + let non_matching_igp_message_id = get_message_id_from_logs(output.clone()) + .unwrap_or_else(|| panic!("failed to get message id from logs: {:?}", output)); + + log!( + "paying gas to a different IGP account for message id: {}", + non_matching_igp_message_id + ); + sealevel_client(&solana_cli_tools_path, &solana_config_path) + .cmd("igp") + .cmd("pay-for-gas") + .arg("program-id", "GwHaw8ewMyzZn9vvrZEnTEAAYpLdkGYs195XWcLDCN4U") + .arg("message-id", non_matching_igp_message_id.clone()) + .arg("destination-domain", SOLANA_REMOTE_CHAIN_ID) + .arg("gas", "100000") + .arg( + "account-salt", + "0x0000000000000000000000000000000000000000000000000000000000000001", + ) + .run() + .join(); + non_matching_igp_message_id +} + fn get_message_id_from_logs(logs: Vec) -> Option { let message_id_regex = Regex::new(r"Dispatched message to \d+, ID 0x([0-9a-fA-F]+)").unwrap(); for log in logs { 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..60f51479d9 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"), @@ -90,11 +90,24 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { let context_dir = create_new_directory(&chain_dir, get_context_dir_name(init.context.as_ref())); - let artifacts_path = context_dir.join("igp-accounts.json"); + let artifacts_path = if init.account_salt.is_some() { + context_dir.join(format!( + "igp-accounts-{}.json", + init.account_salt.clone().unwrap() + )) + } else { + context_dir.join("igp-accounts.json") + }; let existing_artifacts = try_read_json::(&artifacts_path).ok(); - let salt = get_context_salt(init.context.as_ref()); + let salt = init + .account_salt + .map(|s| { + let salt_str = s.trim_start_matches("0x"); + H256::from_str(salt_str).expect("Invalid salt format") + }) + .unwrap_or_else(|| get_context_salt(init.context.as_ref())); let chain_configs = read_json::>(&init.chain_config_file); @@ -123,11 +136,24 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { let context_dir = create_new_directory(&chain_dir, get_context_dir_name(init.context.as_ref())); - let artifacts_path = context_dir.join("igp-accounts.json"); + let artifacts_path = if init.account_salt.is_some() { + context_dir.join(format!( + "igp-accounts-{}.json", + init.account_salt.clone().unwrap() + )) + } else { + context_dir.join("igp-accounts.json") + }; let existing_artifacts = try_read_json::(&artifacts_path).ok(); - let salt = get_context_salt(init.context.as_ref()); + let salt = init + .account_salt + .map(|s| { + let salt_str = s.trim_start_matches("0x"); + H256::from_str(salt_str).expect("Invalid salt format") + }) + .unwrap_or_else(|| get_context_salt(init.context.as_ref())); let chain_configs = read_json::>(&init.chain_config_file); @@ -190,7 +216,15 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { } IgpSubCmd::PayForGas(payment_details) => { let unique_gas_payment_keypair = Keypair::new(); - let salt = H256::zero(); + + let salt = payment_details + .account_salt + .map(|s| { + let salt_str = s.trim_start_matches("0x"); + H256::from_str(salt_str).expect("Invalid salt format") + }) + .unwrap_or_else(H256::zero); + let (igp_account, _igp_account_bump) = Pubkey::find_program_address( hyperlane_sealevel_igp::igp_pda_seeds!(salt), &payment_details.program_id, @@ -413,27 +447,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..c9ea55b548 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)] @@ -432,6 +430,8 @@ struct InitIgpAccountArgs { context: Option, #[arg(long)] gas_oracle_config_file: Option, + #[arg(long)] + account_salt: Option, // optional salt for deterministic account creation } #[derive(Args)] @@ -450,6 +450,8 @@ struct InitOverheadIgpAccountArgs { context: Option, #[arg(long)] overhead_config_file: Option, + #[arg(long)] + account_salt: Option, // optional salt for deterministic account creation } #[derive(Args)] @@ -483,6 +485,8 @@ struct PayForGasArgs { destination_domain: u32, #[arg(long)] gas: u64, + #[arg(long)] + account_salt: Option, // optional salt for paying gas to a deterministically derived account } #[derive(Args)] 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/environments/local-e2e/gas-oracle-configs.json b/rust/sealevel/environments/local-e2e/gas-oracle-configs.json new file mode 100644 index 0000000000..1d69e4c3bf --- /dev/null +++ b/rust/sealevel/environments/local-e2e/gas-oracle-configs.json @@ -0,0 +1,20 @@ +[ + { + "domain": 13375, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "10000000000000000000", + "gasPrice": "0", + "tokenDecimals": 18 + } + }, + { + "domain": 13376, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "10000000000000000000", + "gasPrice": "0", + "tokenDecimals": 18 + } + } +] 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/eclipsemainnet/gas-oracle-configs-eclipsemainnet.json b/rust/sealevel/environments/mainnet3/eclipsemainnet/gas-oracle-configs-eclipsemainnet.json index b459e88d4c..22fb0da678 100644 --- a/rust/sealevel/environments/mainnet3/eclipsemainnet/gas-oracle-configs-eclipsemainnet.json +++ b/rust/sealevel/environments/mainnet3/eclipsemainnet/gas-oracle-configs-eclipsemainnet.json @@ -13,7 +13,7 @@ "gasOracle": { "type": "remoteGasData", "tokenExchangeRate": "887000000000000000", - "gasPrice": "15", + "gasPrice": "20", "tokenDecimals": 9 } }, diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/multisig-config.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/multisig-config.json index 7ae8ee840f..b95441b72e 100644 --- a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/multisig-config.json +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/multisig-config.json @@ -1,14 +1,43 @@ { + "alephzeroevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x33f20e6e775747d60301c6ea1c50e51f0389740c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa" + ] + }, "ancient8": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xbb5842ae0e05215b53df4787a29144efb7e67551", "0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969", "0x95c7bf235837cb5a609fe6c95870410b9f68bcff" - ], - "type": 3 + ] + }, + "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", @@ -16,37 +45,73 @@ "0x5450447aee7b544c462c9352bef7cad049b0c2dc", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" - ], - "type": 3 + ] + }, + "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" - ], - "type": 3 + ] }, "astarzkevm": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x89ecdd6caf138934bf3a2fb7b323984d72fd66de", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "aurora": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "avalanche": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x3fb8263859843bffb02950c492d492cae169f4cf", "0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" - ], - "type": 3 + ] + }, + "b3": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd77b516730a836fc41934e7d5864e72c165b934e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "base": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9", @@ -54,47 +119,66 @@ "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xcff391b4e516452d424db66beb9052b041a9ed79", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] }, "bitlayer": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "blast": { - "threshold": 2, + "type": "messageIdMultisigIsm", + "threshold": 3, "validators": [ "0xf20c0b09f597597c8d2430d3d72dfddaf09177d1", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0xae53467a5c2a9d9420c188d10fef5e1d9b9a5b80" - ], - "type": 3 + "0x1652d8ba766821cf01aeea34306dfc1cab964a32", + "0x54bb0036f777202371429e062fe6aee0d59442f9" + ] }, "bob": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x20f283be1eb0e81e22f51705dcb79883cfdd34aa", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "boba": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xebeb92c94ca8408e73aa16fd554cb3a7df075c59", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "bsc": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x570af9b7b36568c8877eebba6c6727aa9dab7268", "0x8292b1a53907ece0f76af8a50724e9492bcdc8a3", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] + }, + "bsquared": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcadc90933c9fbe843358a4e70e46ad2db78e28aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "celo": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x63478422679303c3e4fc611b771fa4a707ef7f4a", @@ -102,73 +186,119 @@ "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] }, "cheesechain": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x478fb53c6860ae8fc35235ba0d38d49b13128226", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ], - "type": 3 + "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" - ], - "type": 3 + ] + }, + "corn": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc80b2e3e38220e02d194a0effa9d5bfe89894c07", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "cyber": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x94d7119ceeb802173b6924e6cc8c4cd731089a27", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "degenchain": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x433e311f19524cd64fb2123ad0aa1579a4e1fc83", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "dogechain": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xe43f742c37858746e6d7e458bc591180d0cba440", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "duckchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x91d55fe6dac596a6735d96365e21ce4bca21d83c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "eclipsemainnet": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0", "0x3571223e745dc0fcbdefa164c9b826b90c0d2dac", "0xea83086a62617a7228ce4206fae2ea8b0ab23513", "0x4d4629f5bfeabe66edc7a78da26ef5273c266f97" - ], - "type": 3 + ] }, "endurance": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x28c5b322da06f184ebf68693c5d19df4d4af13e5", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x7419021c0de2772b763e554480158a82a291c1f2" - ], - "type": 3 + ] }, "ethereum": { + "type": "messageIdMultisigIsm", "threshold": 4, "validators": [ "0x03c842db86a6a3e524d4a6615390c1ea8e2b9541", @@ -178,111 +308,232 @@ "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", "0xb683b742b378632a5f73a2a5a45801b3489bba44", "0xbf1023eff3dba21263bf2db2add67a0d6bcda2de" - ], - "type": 3 + ] }, "everclear": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0xD79DFbF56ee2268f061cc613027a44A880f61Ba2" - ], - "type": 3 + ] + }, + "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" - ], - "type": 3 + ] }, - "fraxtal": { + "flowmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xe132235c958ca1f3f24d772e5970dd58da4c0f6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59" + ] + }, + "form": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ - "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", + "0x58554b2e76167993b5fc000d0070a2f883cd333a", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fraxtal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82", + "0x573e960e07ad74ea2c5f1e3c31b2055994b12797", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", "0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91" - ], - "type": 3 + ] }, "fusemainnet": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9", "0x6760226b34213d262D41D5291Ed57E81a68b4E0b", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ], - "type": 3 + ] }, "gnosis": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xd4df66a859585678f2ea8357161d896be19cc1ca", "0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] + }, + "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", - "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", + "0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc", "0x9ab11f38a609940153850df611c9a2175dcffe0f" - ], - "type": 3 + ] }, "injective": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xbfb8911b72cfb138c7ce517c57d9c691535dc517", "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", "0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9" - ], - "type": 3 + ] + }, + "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" - ], - "type": 3 + ] }, "linea": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xf2d5409a59e0f5ae7635aff73685624904a77d94", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "lisk": { - "threshold": 2, + "type": "messageIdMultisigIsm", + "threshold": 4, "validators": [ "0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e", + "0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf0da628f3fb71652d48260bad4691054045832ce", + "0xead4141b6ea149901ce4f4b556953f66d04b1d0c" + ] }, "lukso": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xa5e953701dcddc5b958b5defb677a829d908df6d", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x101cE77261245140A0871f9407d6233C8230Ec47" - ], - "type": 3 + ] + }, + "lumia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lumiaprism": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb69731640ffd4338a2c9358a935b0274c6463f85", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "mantapacific": { - "threshold": 5, + "type": "messageIdMultisigIsm", + "threshold": 4, "validators": [ "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", "0x521a3e6bf8d24809fde1c1fd3494a859a16f132c", @@ -291,75 +542,98 @@ "0xa0eE95e280D46C14921e524B075d0C341e7ad1C8", "0xcc9a0b6de7fe314bd99223687d784730a75bb957", "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" - ], - "type": 3 + ] }, "mantle": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "merlin": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "metal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xd9f7f1a05826197a93df51e86cefb41dfbfb896a", + "0x01e3909133d20c05bbc94247769235d30101f748", + "0xaba06266f47e3ef554d218b879bd86114a8dabd4", + "0x05d91f80377ff5e9c6174025ffaf094c57a4766a", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] }, "metis": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xc4a3d25107060e800a43842964546db508092260", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "mint": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x0230505530b80186f8cdccfaf9993eb97aebe98a" - ], - "type": 3 + ] }, "mode": { - "threshold": 3, + "type": "messageIdMultisigIsm", + "threshold": 4, "validators": [ "0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x7e29608c6e5792bbf9128599ca309be0728af7b4", - "0x101cE77261245140A0871f9407d6233C8230Ec47" - ], - "type": 3 + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x65C140e3a05F33192384AffEF985696Fe3cDDE42", + "0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x485a4f0009d9afbbf44521016f9b8cdd718e36ea" + ] }, "molten": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "moonbeam": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x2225e2f4e9221049456da93b71d2de41f3b6b2a8", "0x645428d198d2e76cbd9c1647f5c80740bb750b97", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" - ], - "type": 3 + ] + }, + "morph": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4884535f393151ec419add872100d352f71af380", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "neutron": { + "type": "messageIdMultisigIsm", "threshold": 4, "validators": [ "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", @@ -369,203 +643,407 @@ "0x47aa126e05933b95c5eb90b26e6b668d84f4b25a", "0x54b2cca5091b098a1a993dec03c4d1ee9af65999", "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" - ], - "type": 3 + ] }, "oortmainnet": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x032dE4f94676bF9314331e7D83E8Db4aC74c9E21" - ], - "type": 3 + "0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1" + ] }, "optimism": { - "threshold": 3, + "type": "messageIdMultisigIsm", + "threshold": 4, "validators": [ "0x20349eadc6c72e94ce38268b96692b1a5c20de4f", - "0x5b7d47b76c69740462432f6a5a0ca5005e014157", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB", + "0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12" + ] + }, + "orderly": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "osmosis": { + "type": "messageIdMultisigIsm", "threshold": 1, "validators": [ "0xea483af11c19fa41b16c31d1534c2a486a92bcac" - ], - "type": 3 + ] }, "polygon": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", "0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] }, "polygonzkevm": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x86f2a44592bb98da766e880cfd70d3bbb295e61a", "0x865818fe1db986036d5fd0466dcd462562436d1a", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" - ], - "type": 3 + ] + }, + "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" - ], - "type": 3 + ] + }, + "rarichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeac012df7530720dd7d6f9b727e4fe39807d1516", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "real": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "redstone": { - "threshold": 2, + "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" - ], - "type": 3 + ] }, "sanko": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x795c37d5babbc44094b084b0c89ed9db9b5fae39", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "scroll": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xad557170a9f2f21c35e03de07cb30dcbcc3dff63", "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948" - ], - "type": 3 + ] }, "sei": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x101cE77261245140A0871f9407d6233C8230Ec47", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "shibarium": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xfa33391ee38597cbeef72ccde8c9e13e01e78521", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "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": 2, + "validators": [ + "0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76", + "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" - ], - "type": 3 + ] }, "tangle": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0xe271ef9a6e312540f099a378865432fa73f26689" - ], - "type": 3 + ] + }, + "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": [ - "0x4E53dA92cD5Bf0a032b6B4614b986926456756A7", + "0x6D113Ae51bfeA7b63a8828f97e9dcE393B25c189", "0xa3f93fe365bf99f431d8fde740b140615e24f99b", "0x1f87c368f8e05a85ef9126d984a980a20930cb9c" - ], - "type": 3 + ] }, "worldchain": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x31048785845325b22817448b68d08f8a8fe36854", "0x11e2a683e83617f186614071e422b857256a9aae", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ], - "type": 3 + ] }, "xai": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "xlayer": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xa2ae7c594703e988f23d97220717c513db638ea3", "0xfed056cC0967F5BC9C6350F6C42eE97d3983394d", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ], - "type": 3 + ] + }, + "zeronetwork": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "zetachain": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x101cE77261245140A0871f9407d6233C8230Ec47", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "zircuit": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb", "0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061", "0x0180444c9342BD672867Df1432eb3dA354413a6E", "0x1da9176C2CE5cC7115340496fa7D1800a98911CE" - ], - "type": 3 + ] + }, + "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" - ], - "type": 3 + ] } } diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/program-ids.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/program-ids.json new file mode 100644 index 0000000000..10cbbb91a5 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/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/core/program-ids.json b/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json index 642218fbae..fb347daf42 100644 --- a/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json +++ b/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json @@ -1,7 +1,7 @@ { "mailbox": "E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi", "validator_announce": "pRgs5vN4Pj7WvFbxf6QDHizo2njq2uksqEUbaSghVA8", - "multisig_ism_message_id": "372D5YP7jMYUgYBXTVJ7BZtzKv1mq1J6wvjSFLNTRreC", + "multisig_ism_message_id": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM", "igp_program_id": "BhNcatUDC2D5JTyeaqrdSukiVFsEHK7e3hVmKMztwefv", "overhead_igp_account": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", "igp_account": "JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M" 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..4e0dad08ce --- /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": "20", + "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..1f8e4421e1 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json @@ -0,0 +1,17 @@ +{ + "solanamainnet": { + "type": "collateral", + "decimals": 5, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "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..87a3366874 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json @@ -0,0 +1,10 @@ +{ + "soon": { + "hex": "0x50c3447854a0cf980f4a562fd34ce4031a0b7fe725521ad21482b74cb2b733ac", + "base58": "6SGK4PnHefm4egyUUeVro8wKBkuPexVehsjuUK8auJ8b" + }, + "solanamainnet": { + "hex": "0xe492f8f3cb623b87d8ae46ecdb541424ae870a39110ad09087a793b0237aaff7", + "base58": "GPFwRQ5Cw6dTWnmappUKJt76DD8yawxPx28QugfCaGaA" + } +} \ 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..b443d2756d --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json @@ -0,0 +1,15 @@ +{ + "solanamainnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF" + }, + "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/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/program-ids.json new file mode 100644 index 0000000000..a3862b5b63 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/program-ids.json @@ -0,0 +1,10 @@ +{ + "base": { + "hex": "0x00000000000000000000000054624ca8abea68645b3b39211f90b804d53db680", + "base58": "1111111111112BBkkpUZNJgdH8DEmyDxFt74d4bH" + }, + "solanamainnet": { + "hex": "0x2efbd8ff6417a50dbcedc18bab4235d4a2aac61af89214ac59545d30e0f86991", + "base58": "4AQVPTCAeLswnjksQdutxUDuxEJxUBwoWmVimGuPtGSt" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/token-config.json new file mode 100644 index 0000000000..1cc9275f26 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/token-config.json @@ -0,0 +1,17 @@ +{ + "base": { + "type": "collateral", + "decimals": 18, + "token": "0xb22a793a81ff5b6ad37f40d5fe1e0ac4184d52f3", + "foreignDeployment": "0x54624CA8ABEa68645b3B39211F90B804D53dB680" + }, + "solanamainnet": { + "type": "synthetic", + "decimals": 9, + "remoteDecimals": 18, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "name": "Big Tony", + "symbol": "TONY", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/e95e1d64a0d36c3c69bb09ed4e29acc8350848b6/deployments/warp_routes/TONY/metadata.json" + } +} diff --git a/rust/sealevel/environments/testnet4/chain-config.json b/rust/sealevel/environments/testnet4/chain-config.json index 83478557f0..8a43c054e4 100644 --- a/rust/sealevel/environments/testnet4/chain-config.json +++ b/rust/sealevel/environments/testnet4/chain-config.json @@ -1,111 +1,754 @@ { + "abstracttestnet": { + "blockExplorers": [ + { + "apiUrl": "https://api-explorer-verify.testnet.abs.xyz/contract_verification", + "family": "etherscan", + "name": "Abstract Block Explorer", + "url": "https://explorer.testnet.abs.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 0 + }, + "chainId": 11124, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Abstract Testnet", + "domainId": 11124, + "isTestnet": true, + "name": "abstracttestnet", + "nativeToken": { + "decimals": 18, + "name": "Ethereum", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://api.testnet.abs.xyz" + } + ], + "technicalStack": "zksync" + }, + "alephzeroevmtestnet": { + "blockExplorers": [ + { + "apiUrl": "https://evm-explorer-testnet.alephzero.org/api", + "family": "blockscout", + "name": "Aleph Zero EVM Testnet Explorer", + "url": "https://evm-explorer-testnet.alephzero.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 5 + }, + "chainId": 2039, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Aleph Zero EVM Testnet", + "domainId": 2039, + "index": { + "from": 1380870 + }, + "isTestnet": true, + "name": "alephzeroevmtestnet", + "nativeToken": { + "decimals": 18, + "name": "Testnet AZERO", + "symbol": "TZERO" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.alephzero-testnet.gelato.digital" + } + ], + "technicalStack": "arbitrumnitro" + }, "alfajores": { "blockExplorers": [ { - "apiUrl": "https://api-alfajores.celoscan.io/api", - "family": "etherscan", - "name": "CeloScan", - "url": "https://alfajores.celoscan.io" - }, + "apiUrl": "https://explorer.celo.org/alfajores/api", + "family": "blockscout", + "name": "Blockscout", + "url": "https://explorer.celo.org/alfajores" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 5, + "reorgPeriod": 0 + }, + "chainId": 44787, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Alfajores", + "domainId": 44787, + "gasCurrencyCoinGeckoId": "celo", + "isTestnet": true, + "name": "alfajores", + "nativeToken": { + "decimals": 18, + "name": "CELO", + "symbol": "CELO" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://alfajores-forno.celo-testnet.org" + } + ] + }, + "arbitrumsepolia": { + "blockExplorers": [ + { + "apiUrl": "https://api-sepolia.arbiscan.io/api", + "family": "etherscan", + "name": "Arbiscan", + "url": "https://sepolia.arbiscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 0 + }, + "chainId": 421614, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Arbitrum Sepolia", + "domainId": 421614, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 49690504 + }, + "isTestnet": true, + "name": "arbitrumsepolia", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://arbitrum-sepolia.blockpi.network/v1/rpc/public" + }, + { + "http": "https://sepolia-rollup.arbitrum.io/rpc" + } + ], + "technicalStack": "arbitrumnitro" + }, + "arcadiatestnet2": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.khalani.network/api", + "family": "blockscout", + "name": "Arcadia Testnet Explorer", + "url": "https://explorer.khalani.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 1098411886, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Arcadia Testnet v2", + "domainId": 1098411886, + "isTestnet": true, + "name": "arcadiatestnet2", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.khalani.network" + } + ] + }, + "basesepolia": { + "blockExplorers": [ + { + "apiUrl": "https://api-sepolia.basescan.org/api", + "family": "etherscan", + "name": "BaseScan", + "url": "https://sepolia.basescan.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 84532, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Base Sepolia", + "domainId": 84532, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "basesepolia", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://sepolia.base.org" + }, + { + "http": "https://base-sepolia-rpc.publicnode.com" + } + ] + }, + "berabartio": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/testnet/evm/80084/etherscan/api/", + "family": "routescan", + "name": "Bartio Testnet Explorer", + "url": "https://bartio.beratrail.io/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 1 + }, + "chainId": 80084, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Berachain bArtio", + "domainId": 80084, + "gasCurrencyCoinGeckoId": "berachain", + "isTestnet": true, + "name": "berabartio", + "nativeToken": { + "decimals": 18, + "name": "BERA", + "symbol": "BERA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://bartio.rpc.berachain.com/" + }, + { + "http": "https://bartio.drpc.org" + }, + { + "http": "https://bera-testnet.nodeinfra.com" + } + ] + }, + "bsctestnet": { + "blockExplorers": [ + { + "apiUrl": "https://api-testnet.bscscan.com/api", + "family": "etherscan", + "name": "BscScan", + "url": "https://testnet.bscscan.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 9 + }, + "chainId": 97, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "BSC Testnet", + "domainId": 97, + "gasCurrencyCoinGeckoId": "binancecoin", + "isTestnet": true, + "name": "bsctestnet", + "nativeToken": { + "decimals": 18, + "name": "BNB", + "symbol": "BNB" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://bsc-testnet.publicnode.com" + }, + { + "http": "https://bsc-testnet.blockpi.network/v1/rpc/public" + } + ], + "transactionOverrides": { + "gasPrice": 8000000000 + } + }, + "camptestnet": { + "blockExplorers": [ + { + "apiUrl": "https://camp-network-testnet.blockscout.com/api", + "family": "blockscout", + "name": "Camp Network Testnet Explorer", + "url": "https://camp-network-testnet.blockscout.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 325000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Camp Network Testnet V2", + "domainId": 325000, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "camptestnet", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc-campnetwork.xyz" + } + ] + }, + "citreatestnet": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.testnet.citrea.xyz/api", + "family": "blockscout", + "name": "Citrea Testnet Explorer", + "url": "https://explorer.testnet.citrea.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 5115, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Citrea Testnet", + "domainId": 5115, + "gasCurrencyCoinGeckoId": "bitcoin", + "isTestnet": true, + "name": "citreatestnet", + "nativeToken": { + "decimals": 18, + "name": "Citrea BTC", + "symbol": "cBTC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.testnet.citrea.xyz" + } + ] + }, + "connextsepolia": { + "blockExplorers": [ + { + "apiUrl": "https://scan.testnet.everclear.org/api", + "family": "blockscout", + "name": "Everclear Testnet Explorer", + "url": "https://scan.testnet.everclear.org/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 10, + "reorgPeriod": 0 + }, + "chainId": 6398, + "deployer": { + "name": "Everclear", + "url": "https://everclear.org" + }, + "displayName": "Everclear Sepolia", + "domainId": 6398, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 4950 + }, + "isTestnet": true, + "name": "connextsepolia", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.connext-sepolia.gelato.digital" + } + ], + "technicalStack": "arbitrumnitro" + }, + "ecotestnet": { + "blockExplorers": [ + { + "apiUrl": "https://eco-testnet.explorer.caldera.xyz/api", + "family": "blockscout", + "name": "ECO Testnet explorer", + "url": "https://eco-testnet.explorer.caldera.xyz/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 0 + }, + "chainId": 471923, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Eco Testnet", + "domainId": 471923, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "ecotestnet", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://eco-testnet.rpc.caldera.xyz/http" + } + ] + }, + "eclipsetestnet": { + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.4, + "reorgPeriod": 0 + }, + "chainId": 239092742, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Eclipse Testnet", + "domainId": 239092742, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "eclipsetestnet", + "nativeToken": { + "decimals": 9, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://testnet.dev2.eclipsenetwork.xyz" + } + ] + }, + "formtestnet": { + "blockExplorers": [ + { + "apiUrl": "https://sepolia-explorer.form.network/api", + "family": "blockscout", + "name": "Form Testnet Explorer", + "url": "https://sepolia-explorer.form.network" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 132902, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Form Testnet", + "domainId": 132902, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "formtestnet", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://testnet-rpc.form.network/http" + } + ] + }, + "fuji": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/testnet/evm/43113/etherscan/api", + "family": "etherscan", + "name": "SnowTrace", + "url": "https://testnet.snowtrace.io" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 2, + "reorgPeriod": 3 + }, + "chainId": 43113, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Fuji", + "domainId": 43113, + "gasCurrencyCoinGeckoId": "avalanche-2", + "isTestnet": true, + "name": "fuji", + "nativeToken": { + "decimals": 18, + "name": "Avalanche", + "symbol": "AVAX" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://api.avax-test.network/ext/bc/C/rpc", + "pagination": { + "maxBlockRange": 2048 + } + } + ] + }, + "holesky": { + "blockExplorers": [ + { + "apiUrl": "https://api-holesky.etherscan.io/api", + "family": "etherscan", + "name": "Etherscan", + "url": "https://holesky.etherscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 13, + "reorgPeriod": 2 + }, + "chainId": 17000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Holesky", + "domainId": 17000, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "holesky", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://ethereum-holesky-rpc.publicnode.com" + } + ] + }, + "inksepolia": { + "blockExplorers": [ + { + "apiUrl": "https://explorer-sepolia.inkonchain.com/api", + "family": "blockscout", + "name": "https://explorer-sepolia.inkonchain.com", + "url": "https://explorer-sepolia.inkonchain.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 763373, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Ink Sepolia", + "domainId": 763373, + "isTestnet": true, + "name": "inksepolia", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ { - "apiUrl": "https://explorer.celo.org/alfajores/api", + "http": "https://rpc-qnd-sepolia.inkonchain.com" + } + ], + "technicalStack": "opstack" + }, + "odysseytestnet": { + "blockExplorers": [ + { + "apiUrl": "https://odyssey-explorer.ithaca.xyz/api", "family": "blockscout", - "name": "Blockscout", - "url": "https://explorer.celo.org/alfajores" + "name": "Odyssey Explorer", + "url": "https://odyssey-explorer.ithaca.xyz" } ], "blocks": { "confirmations": 1, - "estimateBlockTime": 5, - "reorgPeriod": 0 + "estimateBlockTime": 1, + "reorgPeriod": 1 }, - "chainId": 44787, - "displayName": "Alfajores", - "domainId": 44787, + "chainId": 911867, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Odyssey Testnet", + "domainId": 911867, "isTestnet": true, - "name": "alfajores", + "name": "odysseytestnet", "nativeToken": { "decimals": 18, - "name": "CELO", - "symbol": "CELO" + "name": "Ether", + "symbol": "ETH" }, "protocol": "ethereum", "rpcUrls": [ { - "http": "https://alfajores-forno.celo-testnet.org" + "http": "https://odyssey.ithaca.xyz" } ] }, - "fuji": { + "optimismsepolia": { "blockExplorers": [ { - "apiUrl": "https://api-testnet.snowtrace.io/api", + "apiUrl": "https://api-sepolia-optimistic.etherscan.io/api", "family": "etherscan", - "name": "SnowTrace", - "url": "https://testnet.snowtrace.io" + "name": "OP Sepolia Explorer", + "url": "https://sepolia-optimistic.etherscan.io" } ], "blocks": { - "confirmations": 3, + "confirmations": 1, "estimateBlockTime": 2, - "reorgPeriod": 3 + "reorgPeriod": 0 }, - "chainId": 43113, - "displayName": "Fuji", - "domainId": 43113, + "chainId": 11155420, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Optimism Sepolia", + "domainId": 11155420, + "gasCurrencyCoinGeckoId": "ethereum", "isTestnet": true, - "name": "fuji", + "name": "optimismsepolia", "nativeToken": { "decimals": 18, - "name": "Avalanche", - "symbol": "AVAX" + "name": "Ether", + "symbol": "ETH" }, "protocol": "ethereum", "rpcUrls": [ { - "http": "https://api.avax-test.network/ext/bc/C/rpc", - "pagination": { - "maxBlockRange": 2048 - } + "http": "https://sepolia.optimism.io" } ] }, - "bsctestnet": { + "polygonamoy": { "blockExplorers": [ { - "apiUrl": "https://api-testnet.bscscan.com/api", + "apiUrl": "https://api-amoy.polygonscan.com/api", "family": "etherscan", - "name": "BscScan", - "url": "https://testnet.bscscan.com" + "name": "Polygon Amoy Explorer", + "url": "https://amoy.polygonscan.com" } ], "blocks": { - "confirmations": 1, - "estimateBlockTime": 3, - "reorgPeriod": 9 + "confirmations": 5, + "estimateBlockTime": 2, + "reorgPeriod": 10 }, - "chainId": 97, - "displayName": "BSC Testnet", - "domainId": 97, + "chainId": 80002, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Polygon Amoy", + "domainId": 80002, + "gasCurrencyCoinGeckoId": "polygon-ecosystem-token", "isTestnet": true, - "name": "bsctestnet", + "name": "polygonamoy", "nativeToken": { "decimals": 18, - "name": "BNB", - "symbol": "BNB" + "name": "Polygon Ecosystem Token", + "symbol": "POL" }, "protocol": "ethereum", "rpcUrls": [ { - "http": "https://bsc-testnet.publicnode.com" + "http": "https://rpc-amoy.polygon.technology" }, { - "http": "https://bsc-testnet.blockpi.network/v1/rpc/public" + "http": "https://polygon-amoy-bor-rpc.publicnode.com" + }, + { + "http": "https://polygon-amoy.blockpi.network/v1/rpc/public" + }, + { + "http": "https://rpc.ankr.com/polygon_amoy" } - ], - "transactionOverrides": { - "gasPrice": 80000000000 - } + ] }, "scrollsepolia": { "blockExplorers": [ @@ -122,8 +765,13 @@ "reorgPeriod": 1 }, "chainId": 534351, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, "displayName": "Scroll Sepolia", "domainId": 534351, + "gasCurrencyCoinGeckoId": "ethereum", "isTestnet": true, "name": "scrollsepolia", "nativeToken": { @@ -135,6 +783,18 @@ "rpcUrls": [ { "http": "https://sepolia-rpc.scroll.io" + }, + { + "http": "https://rpc.ankr.com/scroll_sepolia_testnet" + }, + { + "http": "https://scroll-sepolia.blockpi.network/v1/rpc/public" + }, + { + "http": "https://scroll-sepolia.chainstacklabs.com" + }, + { + "http": "https://scroll-public.scroll-testnet.quiknode.pro" } ] }, @@ -153,8 +813,14 @@ "reorgPeriod": 2 }, "chainId": 11155111, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, "displayName": "Sepolia", "domainId": 11155111, + "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-sepolia.safe.global", "isTestnet": true, "name": "sepolia", "nativeToken": { @@ -164,6 +830,9 @@ }, "protocol": "ethereum", "rpcUrls": [ + { + "http": "https://ethereum-sepolia.publicnode.com" + }, { "http": "https://ethereum-sepolia.blockpi.network/v1/rpc/public" }, @@ -172,45 +841,86 @@ } ] }, - "moonbasealpha": { + "solanatestnet": { "blockExplorers": [ { - "apiUrl": "https://api-moonbase.moonscan.io/api", - "family": "etherscan", - "name": "MoonScan", - "url": "https://moonbase.moonscan.io" + "apiUrl": "https://explorer.solana.com?cluster=testnet", + "family": "other", + "name": "Solana Explorer", + "url": "https://explorer.solana.com?cluster=testnet" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.4, + "reorgPeriod": 0 + }, + "chainId": 1399811150, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Solana Testnet", + "displayNameShort": "Sol Testnet", + "domainId": 1399811150, + "gasCurrencyCoinGeckoId": "solana", + "isTestnet": true, + "name": "solanatestnet", + "nativeToken": { + "decimals": 9, + "name": "Solana", + "symbol": "SOL" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://api.testnet.solana.com" + } + ] + }, + "soneiumtestnet": { + "blockExplorers": [ + { + "apiUrl": "https://explorer-testnet.soneium.org/api", + "family": "blockscout", + "name": "Soneium Minato Testnet Explorer", + "url": "https://explorer-testnet.soneium.org" } ], "blocks": { "confirmations": 1, - "estimateBlockTime": 12, + "estimateBlockTime": 2, "reorgPeriod": 1 }, - "chainId": 1287, - "displayName": "Moonbase Alpha", - "displayNameShort": "Moonbase", - "domainId": 1287, + "chainId": 1946, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Soneium Minato Testnet", + "domainId": 1946, + "gasCurrencyCoinGeckoId": "ethereum", "isTestnet": true, - "name": "moonbasealpha", + "name": "soneiumtestnet", "nativeToken": { "decimals": 18, - "name": "DEV", - "symbol": "DEV" + "name": "Ether", + "symbol": "ETH" }, "protocol": "ethereum", "rpcUrls": [ { - "http": "https://rpc.api.moonbase.moonbeam.network" + "http": "https://rpc.minato.soneium.org" } ] }, - "solanatestnet": { + "sonicsvmtestnet": { "blockExplorers": [ { - "apiUrl": "https://explorer.solana.com", + "apiUrl": "https://explorer.sonic.game/?cluster=testnet.v1", "family": "other", - "name": "Solana Explorer", - "url": "https://explorer.solana.com" + "name": "Sonic Explorer", + "url": "https://explorer.sonic.game/?cluster=testnet.v1" } ], "blocks": { @@ -218,52 +928,208 @@ "estimateBlockTime": 0.4, "reorgPeriod": 0 }, - "chainId": 1399811150, - "displayName": "Solana Testnet", - "displayNameShort": "Sol Testnet", - "domainId": 1399811150, + "chainId": 15153042, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic SVM Testnet", + "displayNameShort": "Sonic SVM Testnet", + "domainId": 15153042, "isTestnet": true, - "name": "solanatestnet", + "name": "sonicsvmtestnet", "nativeToken": { "decimals": 9, - "name": "Sol", + "name": "Solana", "symbol": "SOL" }, "protocol": "sealevel", "rpcUrls": [ { - "http": "https://api.testnet.solana.com" + "http": "https://api.testnet.sonic.game" } ] }, - "eclipsetestnet": { + "sonictestnet": { "blockExplorers": [ { - "apiUrl": "https://testnet.dev2.eclipsenetwork.xyz", - "family": "other", - "name": "Eclipse Testnet Explorer", - "url": "https://explorer.dev.eclipsenetwork.xyz/?cluster=testnet" + "apiUrl": "https://testnet.soniclabs.com/api", + "family": "routescan", + "name": "Sonic Testnet Explorer", + "url": "https://testnet.soniclabs.com" } ], "blocks": { "confirmations": 1, - "estimateBlockTime": 0.4, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 64165, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic Testnet", + "domainId": 64165, + "isTestnet": true, + "name": "sonictestnet", + "nativeToken": { + "decimals": 18, + "name": "Sonic", + "symbol": "S" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.testnet.soniclabs.com" + } + ] + }, + "suavetoliman": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.toliman.suave.flashbots.net/api", + "family": "blockscout", + "name": "SUAVE Toliman Testnet Explorer", + "url": "https://explorer.toliman.suave.flashbots.net" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 4, + "reorgPeriod": 1 + }, + "chainId": 33626250, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "SUAVE Toliman Testnet", + "domainId": 33626250, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "suavetoliman", + "nativeToken": { + "decimals": 18, + "name": "TEEth", + "symbol": "TEEth" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.toliman.suave.flashbots.net" + } + ] + }, + "superpositiontestnet": { + "blockExplorers": [ + { + "apiUrl": "https://testnet-explorer.superposition.so/api", + "family": "blockscout", + "name": "Superposition Testnet Explorer", + "url": "https://testnet-explorer.superposition.so" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 98985, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Superposition Testnet", + "domainId": 98985, + "gasCurrencyCoinGeckoId": "superposition", + "index": { + "from": 3111622 + }, + "isTestnet": true, + "name": "superpositiontestnet", + "nativeToken": { + "decimals": 18, + "name": "Superposition", + "symbol": "SPN" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://testnet-rpc.superposition.so" + } + ], + "technicalStack": "arbitrumnitro" + }, + "treasuretopaz": { + "blockExplorers": [ + { + "apiUrl": "https://rpc-explorer-verify.topaz.treasure.lol/contract_verification", + "family": "etherscan", + "name": "Treasure Topaz Block Explorer", + "url": "https://topaz.treasurescan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, "reorgPeriod": 0 }, - "chainId": 239092742, - "displayName": "Eclipse Testnet", - "domainId": 239092742, + "chainId": 978658, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Treasure Topaz Testnet", + "displayNameShort": "Treasure Testnet", + "domainId": 978658, "isTestnet": true, - "name": "eclipsetestnet", + "name": "treasuretopaz", "nativeToken": { - "decimals": 9, + "decimals": 18, + "name": "MAGIC", + "symbol": "MAGIC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.topaz.treasure.lol" + } + ], + "technicalStack": "zksync" + }, + "unichaintestnet": { + "blockExplorers": [ + { + "apiUrl": "https://unichain-sepolia.blockscout.com/api", + "family": "blockscout", + "name": "Unichain Sepolia Testnet Explorer", + "url": "https://unichain-sepolia.blockscout.com" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 1301, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Unichain Testnet", + "domainId": 1301, + "isTestnet": true, + "name": "unichaintestnet", + "nativeToken": { + "decimals": 18, "name": "Ether", "symbol": "ETH" }, - "protocol": "sealevel", + "protocol": "ethereum", "rpcUrls": [ { - "http": "https://testnet.dev2.eclipsenetwork.xyz" + "http": "https://sepolia.unichain.org" } ] } diff --git a/rust/sealevel/environments/testnet4/gas-oracle-configs.json b/rust/sealevel/environments/testnet4/gas-oracle-configs.json index 9e1cb73138..cadbe1ad78 100644 --- a/rust/sealevel/environments/testnet4/gas-oracle-configs.json +++ b/rust/sealevel/environments/testnet4/gas-oracle-configs.json @@ -25,5 +25,14 @@ "gasPrice": "28", "tokenDecimals": 9 } + }, + { + "domain": 15153042, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "10000000000000000000", + "gasPrice": "28", + "tokenDecimals": 9 + } } ] \ No newline at end of file diff --git a/rust/sealevel/environments/testnet4/multisig-ism-message-id/solanatestnet/hyperlane/multisig-config.json b/rust/sealevel/environments/testnet4/multisig-ism-message-id/solanatestnet/hyperlane/multisig-config.json index 4584eebed6..f5898786cc 100644 --- a/rust/sealevel/environments/testnet4/multisig-ism-message-id/solanatestnet/hyperlane/multisig-config.json +++ b/rust/sealevel/environments/testnet4/multisig-ism-message-id/solanatestnet/hyperlane/multisig-config.json @@ -1,61 +1,215 @@ { + "abstracttestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e" + ] + }, + "alephzeroevmtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x556cd94bcb6e5773e8df75e7eb3f91909d266a26" + ] + }, "alfajores": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x2233a5ce12f814bd64c9cdd73410bb8693124d40", "0xba279f965489d90f90490e3c49e860e0b43c2ae6", "0x86485dcec5f7bb8478dd251676372d054dea6653" - ], - "type": 3 + ] + }, + "arbitrumsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x09fabfbca0b8bf042e2a1161ee5010d147b0f603" + ] + }, + "arcadiatestnet2": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd39cd388ce3f616bc81be6dd3ec9348d7cdf4dff" + ] + }, + "basesepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x82e3b437a2944e3ff00258c93e72cd1ba5e0e921" + ] + }, + "berabartio": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x541dd3cb282cf869d72883557badae245b63e1fd" + ] }, "bsctestnet": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x242d8a855a8c932dec51f7999ae7d1e48b10c95e", "0xf620f5e3d25a3ae848fec74bccae5de3edcd8796", "0x1f030345963c54ff8229720dd3a711c15c554aeb" - ], - "type": 3 + ] + }, + "camptestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e" + ] + }, + "citreatestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x60d7380a41eb95c49be18f141efd2fde5e3dba20" + ] + }, + "connextsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xffbbec8c499585d80ef69eb613db624d27e089ab" + ] + }, + "eclipsetestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf344f34abca9a444545b5295066348a0ae22dda3" + ] + }, + "ecotestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xb3191420d463c2af8bd9b4a395e100ec5c05915a" + ] + }, + "formtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x72ad7fddf16d17ff902d788441151982fa31a7bc" + ] }, "fuji": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e", "0x895ae30bc83ff1493b9cf7781b0b813d23659857", "0x43e915573d9f1383cbf482049e4a012290759e7f" - ], - "type": 3 + ] }, - "moonbasealpha": { - "threshold": 2, + "holesky": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x7ab28ad88bb45867137ea823af88e2cb02359c03" + ] + }, + "inksepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xe61c846aee275070207fcbf43674eb254f06097a" + ] + }, + "odysseytestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, "validators": [ - "0x521877064bd7ac7500d300f162c8c47c256a2f9c", - "0xbc1c70f58ae0459d4b8a013245420a893837d568", - "0x01e42c2c44af81dda1ac16fec76fea2a7a54a44c" - ], - "type": 3 + "0xcc0a6e2d6aa8560b45b384ced7aa049870b66ea3" + ] + }, + "optimismsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x03efe4d0632ee15685d7e8f46dea0a874304aa29" + ] + }, + "polygonamoy": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf0290b06e446b320bd4e9c4a519420354d7ddccd" + ] }, "scrollsepolia": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xbe18dbd758afb367180260b524e6d4bcd1cb6d05", "0x9a11ed23ae962974018ab45bc133caabff7b3271", "0x7867bea3c9761fe64e6d124b171f91fd5dd79644" - ], - "type": 3 + ] }, "sepolia": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xb22b65f202558adf86a8bb2847b76ae1036686a5", "0x469f0940684d147defc44f3647146cb90dd0bc8e", "0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" - ], - "type": 3 + ] }, - "eclipsetestnet": { + "soneiumtestnet": { + "type": "messageIdMultisigIsm", "threshold": 1, - "validators": ["0xf344f34abca9a444545b5295066348a0ae22dda3"], - "type": 3 + "validators": [ + "0x2e2101020ccdbe76aeda1c27823b0150f43d0c63" + ] + }, + "sonicsvmtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x83d4ef35f170ec822a0eaadb22a0c40003d8de23" + ] + }, + "sonictestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x62e6591d00daec3fb658c3d19403828b4e9ddbb3" + ] + }, + "suavetoliman": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf58f6e30aabba34e8dd7f79b3168507192e2cc9b" + ] + }, + "superpositiontestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a" + ] + }, + "treasuretopaz": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x9750849beda0a7870462d4685f953fe39033a5ae" + ] + }, + "unichaintestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x5e99961cf71918308c3b17ef21b5f515a4f86fe5" + ] } } diff --git a/rust/sealevel/environments/testnet4/multisig-ism-message-id/sonicsvmtestnet/hyperlane/multisig-config.json b/rust/sealevel/environments/testnet4/multisig-ism-message-id/sonicsvmtestnet/hyperlane/multisig-config.json new file mode 100644 index 0000000000..48ae9db5c1 --- /dev/null +++ b/rust/sealevel/environments/testnet4/multisig-ism-message-id/sonicsvmtestnet/hyperlane/multisig-config.json @@ -0,0 +1,215 @@ +{ + "abstracttestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e" + ] + }, + "alephzeroevmtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x556cd94bcb6e5773e8df75e7eb3f91909d266a26" + ] + }, + "alfajores": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x2233a5ce12f814bd64c9cdd73410bb8693124d40", + "0xba279f965489d90f90490e3c49e860e0b43c2ae6", + "0x86485dcec5f7bb8478dd251676372d054dea6653" + ] + }, + "arbitrumsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x09fabfbca0b8bf042e2a1161ee5010d147b0f603" + ] + }, + "arcadiatestnet2": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd39cd388ce3f616bc81be6dd3ec9348d7cdf4dff" + ] + }, + "basesepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x82e3b437a2944e3ff00258c93e72cd1ba5e0e921" + ] + }, + "berabartio": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x541dd3cb282cf869d72883557badae245b63e1fd" + ] + }, + "bsctestnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x242d8a855a8c932dec51f7999ae7d1e48b10c95e", + "0xf620f5e3d25a3ae848fec74bccae5de3edcd8796", + "0x1f030345963c54ff8229720dd3a711c15c554aeb" + ] + }, + "camptestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e" + ] + }, + "citreatestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x60d7380a41eb95c49be18f141efd2fde5e3dba20" + ] + }, + "connextsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xffbbec8c499585d80ef69eb613db624d27e089ab" + ] + }, + "eclipsetestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf344f34abca9a444545b5295066348a0ae22dda3" + ] + }, + "ecotestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xb3191420d463c2af8bd9b4a395e100ec5c05915a" + ] + }, + "formtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x72ad7fddf16d17ff902d788441151982fa31a7bc" + ] + }, + "fuji": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e", + "0x895ae30bc83ff1493b9cf7781b0b813d23659857", + "0x43e915573d9f1383cbf482049e4a012290759e7f" + ] + }, + "holesky": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x7ab28ad88bb45867137ea823af88e2cb02359c03" + ] + }, + "inksepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xe61c846aee275070207fcbf43674eb254f06097a" + ] + }, + "odysseytestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xcc0a6e2d6aa8560b45b384ced7aa049870b66ea3" + ] + }, + "optimismsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x03efe4d0632ee15685d7e8f46dea0a874304aa29" + ] + }, + "polygonamoy": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf0290b06e446b320bd4e9c4a519420354d7ddccd" + ] + }, + "scrollsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbe18dbd758afb367180260b524e6d4bcd1cb6d05", + "0x9a11ed23ae962974018ab45bc133caabff7b3271", + "0x7867bea3c9761fe64e6d124b171f91fd5dd79644" + ] + }, + "sepolia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb22b65f202558adf86a8bb2847b76ae1036686a5", + "0x469f0940684d147defc44f3647146cb90dd0bc8e", + "0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" + ] + }, + "solanatestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5" + ] + }, + "soneiumtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x2e2101020ccdbe76aeda1c27823b0150f43d0c63" + ] + }, + "sonictestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x62e6591d00daec3fb658c3d19403828b4e9ddbb3" + ] + }, + "suavetoliman": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf58f6e30aabba34e8dd7f79b3168507192e2cc9b" + ] + }, + "superpositiontestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a" + ] + }, + "treasuretopaz": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x9750849beda0a7870462d4685f953fe39033a5ae" + ] + }, + "unichaintestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x5e99961cf71918308c3b17ef21b5f515a4f86fe5" + ] + } +} diff --git a/rust/sealevel/environments/testnet4/sonicsvmtestnet/core/program-ids.json b/rust/sealevel/environments/testnet4/sonicsvmtestnet/core/program-ids.json new file mode 100644 index 0000000000..4cd8925d41 --- /dev/null +++ b/rust/sealevel/environments/testnet4/sonicsvmtestnet/core/program-ids.json @@ -0,0 +1,8 @@ +{ + "mailbox": "6BaTtWPMpWdA6tHqdT2VbogC4XZ9QV5cNCYpBrx6WP7B", + "validator_announce": "84NjUotjZcNBVGBhvwERPNS6zaAfhkJkG33aSiNxPma2", + "multisig_ism_message_id": "DgLicFznJQbnapc9cLSTB2DxN1FnrFnZo5SwD55iTycA", + "igp_program_id": "2rRRMJhFU9QrfjHzBzwqwa33sZG2CrxSwA44PyNpVTDw", + "overhead_igp_account": "9Nq8bJdER4criKNYtkKt3WJDA2LjzHYCH11xKy53fX9", + "igp_account": "FSy4hQ92ZTPJVG2UmiWiymoogpwEDBcucKnLzLnbrBDt" +} diff --git a/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/program-ids.json b/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/program-ids.json new file mode 100644 index 0000000000..73f46e30ff --- /dev/null +++ b/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/program-ids.json @@ -0,0 +1,10 @@ +{ + "sonicsvmtestnet": { + "hex": "0xc71ae64693cca2472d95769cd8541c320f915259c0c36e3f410f6ebc1f7f709e", + "base58": "EQDvULvwhZwK349y6Qt2ouAyDhBbHZoaUG8guWcqYdxZ" + }, + "solanatestnet": { + "hex": "0xfd0509b8d03119deb0bc82989384fadcd3a6cb1b4d29c0ccbf8548777614732c", + "base58": "J2gbyytzDqQozPh1xgm38NchdDPNnvGKrSff47rnVsFh" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/token-config.json b/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/token-config.json new file mode 100644 index 0000000000..eb345bbc5e --- /dev/null +++ b/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/token-config.json @@ -0,0 +1,12 @@ +{ + "solanatestnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "hBHAApi5ZoeCYHqDdCKkCzVKmBdwywdT3hMqe327eZB" + }, + "sonicsvmtestnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "9Nq8bJdER4criKNYtkKt3WJDA2LjzHYCH11xKy53fX9" + } +} diff --git a/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml b/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml index 256b21d76b..f02e1865f8 100644 --- a/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml +++ b/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml @@ -6,6 +6,7 @@ version = "0.1.0" edition = "2021" [features] +default = ["no-spl-noop"] no-entrypoint = [] no-spl-noop = [] serde = ["dep:serde"] diff --git a/rust/sealevel/programs/mailbox/Cargo.toml b/rust/sealevel/programs/mailbox/Cargo.toml index 6ca7bc9e2b..1d09b5e935 100644 --- a/rust/sealevel/programs/mailbox/Cargo.toml +++ b/rust/sealevel/programs/mailbox/Cargo.toml @@ -6,6 +6,7 @@ version = "0.1.0" edition = "2021" [features] +default = ["no-spl-noop"] no-entrypoint = [] no-spl-noop = [] serde = ["dep:serde"] diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index a0babee028..7e701d003e 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,23 @@ # @hyperlane-xyz/core +## 5.9.1 + +### Patch Changes + +- @hyperlane-xyz/utils@8.1.0 + +## 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..4f94e4415d 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.1"; } 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/package.json b/solidity/package.json index b80646bd24..775fa20aac 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.1", "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/utils": "8.1.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..3688d5e885 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,9 @@ # @hyperlane-xyz/ccip-server +## 8.1.0 + +## 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..c217320a71 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.1.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..13195ee0f4 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,56 @@ # @hyperlane-xyz/cli +## 8.1.0 + +### Minor Changes + +- 2d018fa7a: Fix hyperlane warp send where --origin and --destination are out of order + +### Patch Changes + +- Updated dependencies [79c61c891] +- Updated dependencies [9518dbc84] +- Updated dependencies [9ab961a79] + - @hyperlane-xyz/sdk@8.1.0 + - @hyperlane-xyz/utils@8.1.0 + +## 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..184f92b94f 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.1.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.1.0", + "@hyperlane-xyz/utils": "8.1.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/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 7879523a19..cddd85810a 100644 --- a/typescript/cli/src/commands/send.ts +++ b/typescript/cli/src/commands/send.ts @@ -50,6 +50,10 @@ export const messageSendOptions: { [k: string]: Options } = { 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 { diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index 5d09047617..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, @@ -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 e710b6cf00..07064b5e87 100644 --- a/typescript/cli/src/config/chain.ts +++ b/typescript/cli/src/config/chain.ts @@ -5,6 +5,7 @@ import { stringify as yamlStringify } from 'yaml'; import { ChainMetadata, ChainMetadataSchema, + ChainTechnicalStack, EthJsonRpcBlockParameterTag, ExplorerFamily, ZChainName, @@ -87,14 +88,40 @@ 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, chainId, domainId: chainId, protocol: ProtocolType.Ethereum, + 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/consts.ts b/typescript/cli/src/consts.ts index 9fb27df9f2..9c931cab26 100644 --- a/typescript/cli/src/consts.ts +++ b/typescript/cli/src/consts.ts @@ -3,3 +3,4 @@ export const MINIMUM_WARP_DEPLOY_GAS = (3e7).toString(); export const MINIMUM_TEST_SEND_GAS = (3e5).toString(); export const MINIMUM_AVS_GAS = (3e6).toString(); export const PROXY_DEPLOYED_URL = 'https://proxy.hyperlane.xyz'; +export const EXPLORER_URL = 'https://explorer.hyperlane.xyz'; diff --git a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts index 8563e9e5d9..2bdd6f3d1a 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts @@ -138,16 +138,20 @@ export class MultiChainResolver implements ChainResolver { chains.push(argv.destination); } - if (!argv.chains) { - return Array.from( - new Set([...chains, ...this.getEvmChains(multiProvider)]), - ); + if (argv.chain) { + chains.push(argv.chain); + } + + if (!argv.chains && chains.length === 0) { + return Array.from(this.getEvmChains(multiProvider)); } return Array.from( new Set([ ...chains, - ...argv.chains.split(',').map((item: string) => item.trim()), + ...(argv.chains + ? argv.chains.split(',').map((item: string) => item.trim()) + : []), ]), ); } diff --git a/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts b/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts deleted file mode 100644 index 8dddaf3c4a..0000000000 --- a/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ChainMap, ChainName } from '@hyperlane-xyz/sdk'; - -import { runSingleChainSelectionStep } from '../../../utils/chains.js'; - -import { ChainResolver } from './types.js'; - -/** - * @title SingleChainResolver - * @notice Strategy implementation for managing single-chain operations - * @dev Primarily used for operations like 'core:apply' and 'warp:read' - */ -export class SingleChainResolver implements ChainResolver { - /** - * @notice Determines the chain to be used for signing operations - * @dev Either uses the chain specified in argv or prompts for interactive selection - */ - async resolveChains(argv: ChainMap): Promise { - argv.chain ||= await runSingleChainSelectionStep( - argv.context.chainMetadata, - 'Select chain to connect:', - ); - - return [argv.chain]; // Explicitly return as single-item array - } -} diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts index f8e411bad1..394e0b1391 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts @@ -6,7 +6,7 @@ import { ChainSubmissionStrategy, MultiProvider, } from '@hyperlane-xyz/sdk'; -import { assert, rootLogger } from '@hyperlane-xyz/utils'; +import { ProtocolType, assert, rootLogger } from '@hyperlane-xyz/utils'; import { ENV } from '../../../utils/env.js'; @@ -48,6 +48,12 @@ export class MultiProtocolSignerManager { */ protected initializeStrategies(): void { for (const chain of this.chains) { + if (this.multiProvider.getProtocol(chain) !== ProtocolType.Ethereum) { + this.logger.debug( + `Skipping signer strategy initialization for non-EVM chain ${chain}`, + ); + continue; + } const strategy = MultiProtocolSignerFactory.getSignerStrategy( chain, this.submissionStrategy, @@ -62,6 +68,12 @@ export class MultiProtocolSignerManager { */ async getMultiProvider(): Promise { for (const chain of this.chains) { + if (this.multiProvider.getProtocol(chain) !== ProtocolType.Ethereum) { + this.logger.debug( + `Skipping signer initialization for non-EVM chain ${chain}`, + ); + continue; + } const signer = await this.initSigner(chain); this.multiProvider.setSigner(chain, signer); } 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 0378ab7243..1f11f52596 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -51,7 +51,7 @@ export async function runPreflightChecksForChains({ throw new Error('Only Ethereum chains are supported for now'); const signer = multiProvider.getSigner(chain); assertSigner(signer); - logGreen(`✅ ${chain} signer is valid`); + logGreen(`✅ ${metadata.displayName ?? chain} signer is valid`); } logGreen('✅ Chains are valid'); diff --git a/typescript/cli/src/send/message.ts b/typescript/cli/src/send/message.ts index f7d5eb4e15..b6d75b4e51 100644 --- a/typescript/cli/src/send/message.ts +++ b/typescript/cli/src/send/message.ts @@ -3,7 +3,7 @@ import { stringify as yamlStringify } from 'yaml'; import { ChainName, HyperlaneCore, HyperlaneRelayer } from '@hyperlane-xyz/sdk'; import { addressToBytes32, timeout } from '@hyperlane-xyz/utils'; -import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; +import { EXPLORER_URL, MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { CommandContext, WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; @@ -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:', ); } @@ -102,6 +102,7 @@ async function executeDelivery({ ); logBlue(`Sent message from ${origin} to ${recipient} on ${destination}.`); logBlue(`Message ID: ${message.id}`); + logBlue(`Explorer Link: ${EXPLORER_URL}/message/${message.id}`); log(`Message:\n${indentYamlOrJson(yamlStringify(message, null, 2), 4)}`); if (selfRelay) { diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index 2929b09c6e..1fabc3c853 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -14,11 +14,10 @@ import { } from '@hyperlane-xyz/sdk'; import { parseWarpRouteMessage, timeout } from '@hyperlane-xyz/utils'; -import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; +import { EXPLORER_URL, 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({ @@ -179,6 +167,7 @@ async function executeDelivery({ `Sent transfer from sender (${signerAddress}) on ${origin} to recipient (${recipient}) on ${destination}.`, ); logBlue(`Message ID: ${message.id}`); + logBlue(`Explorer Link: ${EXPLORER_URL}/message/${message.id}`); log(`Message:\n${indentYamlOrJson(yamlStringify(message, null, 2), 4)}`); log(`Body:\n${indentYamlOrJson(yamlStringify(parsed, null, 2), 4)}`); @@ -199,5 +188,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 b5051b4c92..a63caa4e3e 100644 --- a/typescript/cli/src/status/message.ts +++ b/typescript/cli/src/status/message.ts @@ -24,7 +24,7 @@ export async function checkMessageStatus({ if (!origin) { origin = await runSingleChainSelectionStep( context.chainMetadata, - 'Select the origin chain', + 'Select the origin chain:', ); } diff --git a/typescript/cli/src/tests/commands/core.ts b/typescript/cli/src/tests/commands/core.ts index 5feabbe2cb..e1cbe0cb59 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. */ @@ -34,6 +68,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 7853815459..7fdb407324 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'; @@ -34,6 +34,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`; @@ -44,6 +45,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. */ @@ -154,7 +254,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: '', @@ -166,7 +270,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 dc80b6ad24..467446e045 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. */ 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/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/version.ts b/typescript/cli/src/version.ts index af959132f7..daf763c533 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.1.0'; diff --git a/typescript/github-proxy/CHANGELOG.md b/typescript/github-proxy/CHANGELOG.md index a5237280ae..8e4066e1d4 100644 --- a/typescript/github-proxy/CHANGELOG.md +++ b/typescript/github-proxy/CHANGELOG.md @@ -1,5 +1,9 @@ # @hyperlane-xyz/github-proxy +## 8.1.0 + +## 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..f3b15e75e0 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.1.0", "private": true, "scripts": { "deploy": "wrangler deploy", diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index 89cedf4d32..4cd55fc086 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,39 @@ # @hyperlane-xyz/helloworld +## 8.1.0 + +### Patch Changes + +- Updated dependencies [79c61c891] +- Updated dependencies [9518dbc84] +- Updated dependencies [9ab961a79] + - @hyperlane-xyz/sdk@8.1.0 + - @hyperlane-xyz/core@5.9.1 + +## 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..ad64eab492 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.1.0", "dependencies": { - "@hyperlane-xyz/core": "5.8.3", + "@hyperlane-xyz/core": "5.9.1", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "7.3.0", + "@hyperlane-xyz/sdk": "8.1.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..6f18e737c5 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,47 @@ # @hyperlane-xyz/infra +## 8.1.0 + +### Minor Changes + +- 2d4963c62: Add USDC between Ink and Ethereum +- fc80df5b4: Add rstETH/ethereum-zircuit warp config + +### Patch Changes + +- Updated dependencies [79c61c891] +- Updated dependencies [9518dbc84] +- Updated dependencies [9ab961a79] + - @hyperlane-xyz/sdk@8.1.0 + - @hyperlane-xyz/helloworld@8.1.0 + - @hyperlane-xyz/utils@8.1.0 + +## 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 7820908d81..d2bf764c7c 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -1,4 +1,10 @@ import { + AgentSealevelHeliusFeeLevel, + AgentSealevelPriorityFeeOracle, + AgentSealevelPriorityFeeOracleType, + AgentSealevelTransactionSubmitter, + AgentSealevelTransactionSubmitterType, + ChainName, GasPaymentEnforcement, GasPaymentEnforcementPolicyType, MatchingList, @@ -7,6 +13,7 @@ import { import { AgentChainConfig, + HELIUS_SECRET_URL_MARKER, RootAgentConfig, getAgentChainNamesFromConfig, } from '../../../src/config/agent/agent.js'; @@ -52,12 +59,14 @@ 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, @@ -97,7 +106,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, injective: true, @@ -119,6 +130,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< molten: true, moonbeam: true, morph: true, + nero: true, neutron: true, oortmainnet: true, optimism: true, @@ -142,13 +154,16 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< 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, @@ -156,6 +171,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -164,12 +180,14 @@ 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, @@ -209,7 +227,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, injective: true, @@ -231,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, @@ -255,13 +276,16 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< 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, @@ -269,6 +293,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -277,17 +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, aurora: true, - flame: true, avalanche: true, b3: true, base: true, @@ -314,6 +340,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< everclear: true, evmos: true, fantom: true, + flame: true, flare: true, flowmainnet: true, form: true, @@ -322,7 +349,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, ink: true, @@ -344,6 +373,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< molten: true, moonbeam: true, morph: true, + nero: true, neutron: true, oortmainnet: true, optimism: true, @@ -367,13 +397,16 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< 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, @@ -382,6 +415,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -396,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, @@ -403,6 +487,10 @@ const contextBase = { aws: { region: 'us-east-1', }, + sealevel: { + priorityFeeOracleConfigGetter: sealevelPriorityFeeOracleConfigGetter, + transactionSubmitterConfigGetter: sealevelTransactionSubmitterConfigGetter, + }, } as const; const gasPaymentEnforcement: GasPaymentEnforcement[] = [ @@ -412,6 +500,8 @@ 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), ], @@ -482,21 +572,21 @@ 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', }, }; @@ -532,11 +622,20 @@ const blacklistedMessageIds = [ // 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. @@ -553,7 +652,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '7c0c967-20241218-173053', + tag: 'abb5a8b-20250113-122226', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, @@ -563,7 +662,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '05e90bc-20241216-180035', + tag: '53fafa6-20250110-125541', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -573,7 +672,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'd84d8da-20241217-172447', + tag: 'd365e55-20250114-011047', }, resources: scraperResources, }, @@ -588,7 +687,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '7c0c967-20241218-173053', + tag: 'abb5a8b-20250113-122226', }, blacklist, // We're temporarily (ab)using the RC relayer as a way to increase @@ -622,7 +721,7 @@ const neutron: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '25a927d-20241114-171323', + tag: '234704d-20241226-192528', }, blacklist, gasPaymentEnforcement, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index 9ddb62b9d3..f187ecc3b2 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -21,6 +21,9 @@ "arbitrumnova": { "validators": ["0xd2a5e9123308d187383c87053811a2c21bd8af1f"] }, + "artela": { + "validators": ["0x8fcc1ebd4c0b463618db13f83e4565af3e166b00"] + }, "arthera": { "validators": ["0x13710ac11c36c169f62fba95767ae59a1e57098d"] }, @@ -159,9 +162,15 @@ "gravity": { "validators": ["0x23d549bf757a02a6f6068e9363196ecd958c974e"] }, + "guru": { + "validators": ["0x0d756d9051f12c4de6aee2ee972193a2adfe00ef"] + }, "harmony": { "validators": ["0xd677803a67651974b1c264171b5d7ca8838db8d5"] }, + "hemi": { + "validators": ["0x312dc72c17d01f3fd0abd31dd9b569bc473266dd"] + }, "immutablezkevmmainnet": { "validators": ["0xbdda85b19a5efbe09e52a32db1a072f043dd66da"] }, @@ -237,6 +246,9 @@ "morph": { "validators": ["0x4884535f393151ec419add872100d352f71af380"] }, + "nero": { + "validators": ["0xb86f872df37f11f33acbe75b6ed208b872b57183"] + }, "neutron": { "validators": [ "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", @@ -326,6 +338,9 @@ "sonic": { "validators": ["0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7"] }, + "soon": { + "validators": ["0x0e6723b3c1ed3db0c24347aa2cf16d28bc2a1f76"] + }, "superseed": { "validators": ["0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88"] }, @@ -344,6 +359,9 @@ "telos": { "validators": ["0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54"] }, + "torus": { + "validators": ["0x96982a325c28a842bc8cf61b63000737bb9f1f7d"] + }, "treasure": { "validators": ["0x6ad994819185553e8baa01533f0cd2c7cadfe6cc"] }, @@ -365,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 62c5dffdad..7cdc82abd0 100644 --- a/typescript/infra/config/environments/mainnet3/chains.ts +++ b/typescript/infra/config/environments/mainnet3/chains.ts @@ -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 @@ -91,6 +83,14 @@ export const chainMetadataOverrides: ChainMap> = { // 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 ( 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 19c72ec1e3..26870e4077 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -6968,5 +6968,401 @@ "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 e16bb07c90..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: '05e90bc-20241216-180025', + 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,12 +26,14 @@ 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', @@ -70,7 +72,9 @@ export const keyFunderConfig: KeyFunderConfig< fusemainnet: '20', gnosis: '5', gravity: '500', + guru: '100', harmony: '500', + hemi: '0.05', immutablezkevmmainnet: '25', inevm: '3', ink: '0.05', @@ -90,7 +94,8 @@ export const keyFunderConfig: KeyFunderConfig< mode: '0.2', molten: '3', moonbeam: '100', - morph: '0.05', + morph: '0.1', + nero: '5', oortmainnet: '2000', optimism: '0.5', orderly: '0.05', @@ -113,12 +118,14 @@ export const keyFunderConfig: KeyFunderConfig< 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', telos: '100', + torus: '5', treasure: '900', unichain: '0.05', // temporarily low until we're able to fund more @@ -127,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', @@ -139,6 +147,7 @@ export const keyFunderConfig: KeyFunderConfig< osmosis: '0', solanamainnet: '0', eclipsemainnet: '0', + soon: '0', }, // if not set, keyfunder defaults to 0 desiredKathyBalancePerChain: { @@ -194,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: { @@ -249,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 b260dfee48..57fb77c685 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -16,15 +16,19 @@ "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.025064", + "amount": "1.025195", "decimals": 9 }, "astar": { @@ -32,7 +36,7 @@ "decimals": 9 }, "astarzkevm": { - "amount": "0.263", + "amount": "0.165", "decimals": 9 }, "aurora": { @@ -48,7 +52,7 @@ "decimals": 9 }, "b3": { - "amount": "0.001000252", + "amount": "0.001000265", "decimals": 9 }, "base": { @@ -68,7 +72,7 @@ "decimals": 9 }, "boba": { - "amount": "0.001000068", + "amount": "0.001000071", "decimals": 9 }, "bsc": { @@ -92,7 +96,7 @@ "decimals": 9 }, "conflux": { - "amount": "20.0", + "amount": "20.0137155", "decimals": 9 }, "conwai": { @@ -132,7 +136,7 @@ "decimals": 9 }, "ethereum": { - "amount": "32.059172476", + "amount": "20.047740244", "decimals": 9 }, "everclear": { @@ -148,7 +152,7 @@ "decimals": 9 }, "flare": { - "amount": "25.0", + "amount": "25.932675252", "decimals": 9 }, "flowmainnet": { @@ -175,10 +179,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 @@ -204,11 +216,11 @@ "decimals": 9 }, "linea": { - "amount": "0.548523195", + "amount": "0.67121914", "decimals": 9 }, "lisk": { - "amount": "0.001001154", + "amount": "0.068378422", "decimals": 9 }, "lukso": { @@ -224,7 +236,7 @@ "decimals": 9 }, "mantapacific": { - "amount": "0.003000319", + "amount": "0.003000503", "decimals": 9 }, "mantle": { @@ -240,11 +252,11 @@ "decimals": 9 }, "metis": { - "amount": "1.105835936", + "amount": "1.30558024", "decimals": 9 }, "mint": { - "amount": "0.001000256", + "amount": "0.001000258", "decimals": 9 }, "mode": { @@ -263,6 +275,10 @@ "amount": "0.201", "decimals": 9 }, + "nero": { + "amount": "1.000000007", + "decimals": 9 + }, "neutron": { "amount": "0.0053", "decimals": 1 @@ -332,7 +348,7 @@ "decimals": 9 }, "sei": { - "amount": "3.328028877", + "amount": "7.41885212", "decimals": 9 }, "shibarium": { @@ -352,9 +368,13 @@ "decimals": 9 }, "sonic": { - "amount": "1.1", + "amount": "5.5", "decimals": 9 }, + "soon": { + "amount": "0.0000001", + "decimals": 1 + }, "stride": { "amount": "0.005", "decimals": 1 @@ -380,7 +400,11 @@ "decimals": 9 }, "telos": { - "amount": "522.500627641", + "amount": "522.109974741", + "decimals": 9 + }, + "torus": { + "amount": "31.25", "decimals": 9 }, "treasure": { @@ -392,7 +416,7 @@ "decimals": 9 }, "vana": { - "amount": "0.005", + "amount": "0.312673957", "decimals": 9 }, "viction": { @@ -400,7 +424,7 @@ "decimals": 9 }, "worldchain": { - "amount": "0.001000251", + "amount": "0.00100025", "decimals": 9 }, "xai": { @@ -411,8 +435,12 @@ "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/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/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index 75e4fc83b9..6c875f658c 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -8734,5 +8734,521 @@ "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 cd4c3ea01c..d6951a2ec2 100644 --- a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json +++ b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json @@ -2121,5 +2121,131 @@ "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 01fe1e84b5..45b707218f 100644 --- a/typescript/infra/config/environments/mainnet3/owners.ts +++ b/typescript/infra/config/environments/mainnet3/owners.ts @@ -188,6 +188,15 @@ export const icas: Partial< soneium: '0x5926599B8Aff45f1708b804B30213babdAD78C83', sonic: '0x5926599B8Aff45f1708b804B30213babdAD78C83', telos: '0xDde4Ce691d1c0579d48BCdd3491aA71472b6cC38', + + // Jan 13, 2025 batch + // ---------------------------------------------------------- + artela: '0x745CEA119757ea3e27093da590bC91f408bD4448', + guru: '0x825cF3d703F384E4aA846BA72eCf70f1985C91b6', + hemi: '0x8D18CBB212920e5ef070b23b813d82F8981cC276', + nero: '0xbBdb1682B2922C282b56DD716C29db5EFbdb5632', + torus: '0xc1e20A0D78E79B94D71d4bDBC8FD0Af7c856Dd7A', + xpla: '0x24832680dF0468967F413be1C83acfE24154F88D', } as const; export const DEPLOYER = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; @@ -243,4 +252,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 5d433fca5c..c3d31269a9 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -1,12 +1,14 @@ // 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', @@ -46,7 +48,9 @@ export const mainnet3SupportedChainNames = [ 'fusemainnet', 'gnosis', 'gravity', + 'guru', 'harmony', + 'hemi', 'immutablezkevmmainnet', 'inevm', 'ink', @@ -68,6 +72,7 @@ export const mainnet3SupportedChainNames = [ 'molten', 'moonbeam', 'morph', + 'nero', 'neutron', 'oortmainnet', 'optimism', @@ -91,13 +96,16 @@ export const mainnet3SupportedChainNames = [ 'solanamainnet', 'soneium', 'sonic', + 'soon', 'stride', + // 'subtensor', 'superseed', 'superpositionmainnet', 'swell', 'taiko', 'tangle', 'telos', + 'torus', 'treasure', 'unichain', 'vana', @@ -105,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 6d4517e2ad..e61445708c 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,111 +1,118 @@ { - "ancient8": "3862.21", - "alephzeroevmmainnet": "0.491237", - "apechain": "1.48", - "appchain": "3862.21", - "arbitrum": "3862.21", - "arbitrumnova": "3862.21", - "arthera": "0.079162", - "astar": "0.068176", - "astarzkevm": "3862.21", - "aurora": "3862.21", - "flame": "6.24", - "avalanche": "46.58", - "b3": "3862.21", - "base": "3862.21", - "bitlayer": "104188", - "blast": "3862.21", - "bob": "3862.21", - "boba": "3862.21", - "bsc": "715.42", - "bsquared": "104188", - "celo": "0.763128", - "cheesechain": "0.00147642", - "chilizmainnet": "0.101585", - "conflux": "0.187951", - "conwai": "0.00457053", - "coredao": "1.23", - "corn": "104188", - "cyber": "3862.21", - "degenchain": "0.01304206", - "dogechain": "0.385834", - "duckchain": "5.75", - "eclipsemainnet": "3862.21", - "endurance": "2.42", - "ethereum": "3862.21", - "everclear": "3862.21", - "evmos": "0.02761808", - "fantom": "1.3", - "flare": "0.02941065", - "flowmainnet": "0.856226", - "form": "3862.21", - "fraxtal": "3854.07", - "fusemainnet": "0.034729", - "gnosis": "1.005", - "gravity": "0.03098347", - "harmony": "0.03085585", - "immutablezkevmmainnet": "1.68", - "inevm": "26.54", - "ink": "3862.21", - "injective": "26.54", - "kaia": "0.257712", - "kroma": "3862.21", - "linea": "3862.21", - "lisk": "3862.21", - "lukso": "2.82", - "lumia": "1.89", - "lumiaprism": "1.81", - "mantapacific": "3862.21", - "mantle": "1.19", - "merlin": "104171", - "metal": "3862.21", - "metis": "53.23", - "mint": "3862.21", - "mode": "3862.21", - "molten": "0.504259", - "moonbeam": "0.278919", - "morph": "3862.21", - "neutron": "0.47823", - "oortmainnet": "0.176273", - "optimism": "3862.21", - "orderly": "3862.21", - "osmosis": "0.550513", - "polygon": "0.55632", - "polygonzkevm": "3862.21", - "polynomialfi": "3862.21", - "prom": "6.34", - "proofofplay": "3862.21", - "rarichain": "3862.21", - "real": "1", - "redstone": "3862.21", - "rivalz": "3862.21", - "rootstockmainnet": "103948", - "sanko": "62.71", - "scroll": "3862.21", - "sei": "0.517789", - "shibarium": "0.555228", - "snaxchain": "3862.21", - "solanamainnet": "216.87", - "soneium": "3862.21", - "sonic": "1.3", - "stride": "0.658767", - "superseed": "3862.21", - "superpositionmainnet": "3862.21", - "swell": "3862.21", - "taiko": "3862.21", + "ancient8": "3157.26", + "alephzeroevmmainnet": "0.289682", + "apechain": "1.033", + "appchain": "3157.26", + "arbitrum": "3157.26", + "arbitrumnova": "3157.26", + "artela": "1", + "arthera": "0.064897", + "astar": "0.055919", + "astarzkevm": "3157.26", + "aurora": "3157.26", + "flame": "4.59", + "avalanche": "34.4", + "b3": "3157.26", + "base": "3157.26", + "bitlayer": "92945", + "blast": "3157.26", + "bob": "3157.26", + "boba": "3157.26", + "bsc": "673.59", + "bsquared": "92945", + "celo": "0.581847", + "cheesechain": "0.00078503", + "chilizmainnet": "0.076522", + "conflux": "0.136733", + "conwai": "0.00370253", + "coredao": "0.911992", + "corn": "92945", + "cyber": "3157.26", + "degenchain": "0.00881689", + "dogechain": "0.324508", + "duckchain": "5.12", + "eclipsemainnet": "3157.26", + "endurance": "1.67", + "ethereum": "3157.26", + "everclear": "3157.26", + "evmos": "0.01831153", + "fantom": "0.691242", + "flare": "0.02285478", + "flowmainnet": "0.684473", + "form": "3157.26", + "fraxtal": "3168.75", + "fusemainnet": "0.02671613", + "gnosis": "1.001", + "gravity": "0.02856525", + "guru": "0.01237776", + "harmony": "0.02187577", + "hemi": "3157.26", + "immutablezkevmmainnet": "1.15", + "inevm": "19.6", + "ink": "3157.26", + "injective": "19.6", + "kaia": "0.196648", + "kroma": "3157.26", + "linea": "3157.26", + "lisk": "3157.26", + "lukso": "1.86", + "lumia": "1.22", + "lumiaprism": "1.028", + "mantapacific": "3157.26", + "mantle": "1.075", + "merlin": "93829", + "metal": "3157.26", + "metis": "33.39", + "mint": "3157.26", + "mode": "3157.26", + "molten": "0.684775", + "moonbeam": "0.203587", + "morph": "3157.26", + "nero": "1", + "neutron": "0.311287", + "oortmainnet": "0.130473", + "optimism": "3157.26", + "orderly": "3157.26", + "osmosis": "0.424539", + "polygon": "0.426288", + "polygonzkevm": "3157.26", + "polynomialfi": "3157.26", + "prom": "8.71", + "proofofplay": "3157.26", + "rarichain": "3157.26", + "real": "3157.26", + "redstone": "3157.26", + "rivalz": "3157.26", + "rootstockmainnet": "92886", + "sanko": "28.27", + "scroll": "3157.26", + "sei": "0.354988", + "shibarium": "0.428417", + "snaxchain": "3157.26", + "solanamainnet": "180", + "soneium": "3157.26", + "sonic": "0.691242", + "soon": "3157.26", + "stride": "0.496384", + "superseed": "3157.26", + "superpositionmainnet": "3157.26", + "swell": "3157.26", + "taiko": "3157.26", "tangle": "1", - "telos": "0.300906", - "treasure": "0.535464", - "unichain": "3862.21", - "vana": "17.77", - "viction": "0.43386", - "worldchain": "3862.21", - "xai": "0.292813", - "xlayer": "51.34", - "zeronetwork": "3862.21", - "zetachain": "0.672943", - "zircuit": "3862.21", - "zklink": "3862.21", - "zksync": "3862.21", - "zoramainnet": "3862.21" + "telos": "0.187567", + "torus": "1", + "treasure": "0.431467", + "unichain": "3157.26", + "vana": "12.43", + "viction": "0.342602", + "worldchain": "3157.26", + "xai": "0.188817", + "xlayer": "46.4", + "xpla": "0.082477", + "zeronetwork": "3157.26", + "zetachain": "0.483465", + "zircuit": "3157.26", + "zklink": "3157.26", + "zksync": "3157.26", + "zoramainnet": "3157.26" } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 73e4985a50..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', @@ -1375,6 +1377,28 @@ export const validatorChainConfig = ( '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, @@ -1386,5 +1410,87 @@ export const validatorChainConfig = ( // '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/getArtelaBaseUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseUSDCWarpConfig.ts new file mode 100644 index 0000000000..43f1238608 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseUSDCWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const artelaOwner = '0x801e8135867D65e742eb070A9fC0aD9c2f69B4cd'; +const baseOwner = '0x801e8135867D65e742eb070A9fC0aD9c2f69B4cd'; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getArtelaBaseUSDCWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const artela: HypTokenRouterConfig = { + ...routerConfig.artela, + owner: artelaOwner, + type: TokenType.synthetic, + symbol: 'USDC.a', + interchainSecurityModule: ISM_CONFIG, + }; + + const base: HypTokenRouterConfig = { + ...routerConfig.base, + owner: baseOwner, + type: TokenType.collateral, + token: tokens.base.USDC, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + artela, + base, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.ts new file mode 100644 index 0000000000..06756c06e4 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const artelaOwner = '0x801e8135867D65e742eb070A9fC0aD9c2f69B4cd'; +const baseOwner = '0x801e8135867D65e742eb070A9fC0aD9c2f69B4cd'; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getArtelaBaseWETHWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const artela: HypTokenRouterConfig = { + ...routerConfig.artela, + owner: artelaOwner, + type: TokenType.synthetic, + symbol: 'WETH.a', + interchainSecurityModule: ISM_CONFIG, + }; + + const base: HypTokenRouterConfig = { + ...routerConfig.base, + owner: baseOwner, + type: TokenType.collateral, + token: tokens.base.WETH, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + artela, + 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/getBaseSolanamainnetTONYWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseSolanamainnetTONYWarpConfig.ts new file mode 100644 index 0000000000..dc16268fa7 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseSolanamainnetTONYWarpConfig.ts @@ -0,0 +1,46 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + OwnableConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + +// Cod3x SAFE +const baseOwner = '0xfEfcb2fb19b9A70B30646Fdc1A0860Eb12F7ff8b'; +// Cod3x Squads vault +const solanamainnetOwner = '7dRAVvdmV3dy4JieuRAirBQ9oSpYaHgmYwupoK5YZcFR'; + +export async function getBaseSolanamainnetTONYWarpConfig( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> { + let base: HypTokenRouterConfig = { + mailbox: routerConfig.base.mailbox, + owner: baseOwner, + type: TokenType.collateral, + token: tokens.base.TONY, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const solanamainnet: HypTokenRouterConfig = { + mailbox: routerConfig.solanamainnet.mailbox, + owner: solanamainnetOwner, + type: TokenType.synthetic, + foreignDeployment: '4AQVPTCAeLswnjksQdutxUDuxEJxUBwoWmVimGuPtGSt', + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + base, + solanamainnet, + }; +} diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.ts new file mode 100644 index 0000000000..263e13fc76 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.ts @@ -0,0 +1,48 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const owners = { + ethereum: '0x9b948CC7CfC4B67262CbbcC37f9d09B61ea6f0E3', + bsc: '0xA788b57518bBE602ac94CCEE5ae7E4831a546Bfd', + lumiaprism: '0x1C4A50f3E9Bfeb268448D19d0D3fe6d58CB0f7BE', +}; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getBscEthereumLumiaPrismPNDRWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: owners.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.PNDR, + interchainSecurityModule: ISM_CONFIG, + }; + + const bsc: HypTokenRouterConfig = { + ...routerConfig.bsc, + owner: owners.bsc, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + const lumiaprism: HypTokenRouterConfig = { + ...routerConfig.lumiaprism, + owner: owners.lumiaprism, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + ethereum, + bsc, + lumiaprism, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.ts new file mode 100644 index 0000000000..2118a3860f --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.ts @@ -0,0 +1,43 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +// Safes from the FORM team +const safeOwners: ChainMap
= { + ethereum: '0xec5ad23e29203301B2C1a765718Cc1de7A8d3FbF', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getEthereumFormUSDCWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(safeOwners.ethereum), + type: TokenType.collateral, + token: tokens.ethereum.USDC, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + // FiatTokenProxy 0xFBf489bb4783D4B1B2e7D07ba39873Fb8068507D + // MasterMinter 0x9Dec8Dfafcce2d45E8FF8C7792DB1D704AB1dc9D + const form: HypTokenRouterConfig = { + ...routerConfig.form, + ...getOwnerConfigForAddress(safeOwners.form), + type: TokenType.collateralFiat, + token: '0xFBf489bb4783D4B1B2e7D07ba39873Fb8068507D', + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + form, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.ts new file mode 100644 index 0000000000..aa8bd4013a --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.ts @@ -0,0 +1,40 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +// Safes from the FORM team +const safeOwners: ChainMap
= { + ethereum: '0xec5ad23e29203301B2C1a765718Cc1de7A8d3FbF', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getEthereumFormUSDTWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(safeOwners.ethereum), + type: TokenType.collateral, + token: tokens.ethereum.USDT, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + ...getOwnerConfigForAddress(safeOwners.form), + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + form, + }; +}; 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..2f65c69323 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts @@ -0,0 +1,53 @@ +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'; + +// pumpBTC team +const ethereumOwner = '0x77A0545Dc1Dc6bAee8d9c1d436c6688a75Ae5777'; +const seiOwner = '0x14A359aE2446eaC89495b3F28b7a29cE2A17f392'; + +export const getEthereumSeiPumpBTCWarpConfig = async ( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), + proxyAdmin: { + // Address explicitly specified as move away from the AW proxy admin + address: '0x64d4ba42f033927ca3babbbebaa11ac8caed9472', + owner: ethereumOwner, + }, + type: TokenType.collateral, + token: tokens.ethereum.pumpBTCsei, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const sei: HypTokenRouterConfig = { + ...routerConfig.sei, + ...getOwnerConfigForAddress(seiOwner), + proxyAdmin: { + // Address explicitly specified as move away from the AW proxy admin + address: '0x932a0a357CbE9a06c0FCec8C56335DA162c5D071', + owner: seiOwner, + }, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + sei, + }; +}; 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 d9bf87760d..98cc569ce4 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -6,6 +6,8 @@ export enum WarpRouteIds { ArbitrumNeutronEclip = 'ECLIP/arbitrum-neutron', ArbitrumNeutronTIA = 'TIA/arbitrum-neutron', ArbitrumTreasureMAGIC = 'MAGIC/arbitrum-treasure', + BscEthereumLumiaPrismPNDR = 'PNDR/bsc-ethereum-lumiaprism', + BaseSolanamainnetTONY = 'TONY/base-solanamainnet', EclipseEthereumApxEth = 'APXETH/eclipsemainnet-ethereum', EclipseEthereumSolanaUSDC = 'USDC/eclipsemainnet-ethereum-solanamainnet', EclipseEthereumSolanaUSDT = 'USDT/eclipsemainnet-ethereum-solanamainnet', @@ -14,6 +16,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', @@ -21,7 +25,9 @@ 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', @@ -38,4 +44,17 @@ export enum WarpRouteIds { 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', + EthereumFormUSDT = 'USDT/ethereum-form', + EthereumFormUSDC = 'USDC/ethereum-form', + 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', + ArtelaBaseUSDC = 'USDC/artela-base', + ArtelaBaseWETH = 'WETH/artela-base', + SolanaSoonBonk = 'Bonk/solanamainnet-soon', + SolanaSoonSOL = 'SOL/solanamainnet-soon', } diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index d34e53657d..76857dab51 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -66,8 +66,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< polygonamoy: true, scrollsepolia: true, sepolia: true, - solanatestnet: false, + solanatestnet: true, soneiumtestnet: true, + sonicsvmtestnet: true, sonictestnet: true, suavetoliman: true, superpositiontestnet: true, @@ -100,8 +101,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< polygonamoy: true, scrollsepolia: true, sepolia: true, - solanatestnet: false, + solanatestnet: true, soneiumtestnet: true, + sonicsvmtestnet: true, sonictestnet: true, suavetoliman: true, superpositiontestnet: true, @@ -136,6 +138,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< sepolia: true, solanatestnet: false, soneiumtestnet: true, + sonicsvmtestnet: false, sonictestnet: true, suavetoliman: true, superpositiontestnet: false, @@ -219,7 +222,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '7c0c967-20241218-173053', + tag: 'bd00efa-20241231-191107', }, blacklist: [...releaseCandidateHelloworldMatchingList, ...relayBlacklist], gasPaymentEnforcement, @@ -241,7 +244,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'bb4e82b-20241107-190434', + tag: 'bd00efa-20241231-191107', }, chains: validatorChainConfig(Contexts.Hyperlane), resources: validatorResources, diff --git a/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json b/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json index f18b6a10b8..dab4161a8b 100644 --- a/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json @@ -82,9 +82,15 @@ "0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" ] }, + "solanatestnet": { + "validators": ["0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5"] + }, "soneiumtestnet": { "validators": ["0x2e2101020ccdbe76aeda1c27823b0150f43d0c63"] }, + "sonicsvmtestnet": { + "validators": ["0x83d4ef35f170ec822a0eaadb22a0c40003d8de23"] + }, "sonictestnet": { "validators": ["0x62e6591d00daec3fb658c3d19403828b4e9ddbb3"] }, 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/funding.ts b/typescript/infra/config/environments/testnet4/funding.ts index 154619d301..87b5e1ff9f 100644 --- a/typescript/infra/config/environments/testnet4/funding.ts +++ b/typescript/infra/config/environments/testnet4/funding.ts @@ -52,9 +52,11 @@ export const keyFunderConfig: KeyFunderConfig< polygonamoy: '0.2', scrollsepolia: '1', sepolia: '5', - // no funding for solana + // no funding for SVM chains solanatestnet: '0', soneiumtestnet: '0.1', + // no funding for SVM chains + sonicsvmtestnet: '0', sonictestnet: '1', suavetoliman: '0.1', superpositiontestnet: '1', diff --git a/typescript/infra/config/environments/testnet4/gasPrices.json b/typescript/infra/config/environments/testnet4/gasPrices.json index cba1c9fa25..ebb9736d5b 100644 --- a/typescript/infra/config/environments/testnet4/gasPrices.json +++ b/typescript/infra/config/environments/testnet4/gasPrices.json @@ -1,6 +1,6 @@ { "abstracttestnet": { - "amount": "0.060764843", + "amount": "0.025", "decimals": 9 }, "alephzeroevmtestnet": { @@ -20,15 +20,15 @@ "decimals": 9 }, "basesepolia": { - "amount": "0.00236715", + "amount": "0.001000846", "decimals": 9 }, "berabartio": { - "amount": "10.832064411", + "amount": "10", "decimals": 9 }, "bsctestnet": { - "amount": "100.0", + "amount": "2.351230079", "decimals": 9 }, "camptestnet": { @@ -36,7 +36,7 @@ "decimals": 9 }, "citreatestnet": { - "amount": "5.032361163", + "amount": "0.0100001", "decimals": 9 }, "connextsepolia": { @@ -56,11 +56,11 @@ "decimals": 9 }, "fuji": { - "amount": "25.000000001", + "amount": "1.000000001", "decimals": 9 }, "holesky": { - "amount": "0.760231049", + "amount": "0.001000035", "decimals": 9 }, "inksepolia": { @@ -68,39 +68,43 @@ "decimals": 9 }, "odysseytestnet": { - "amount": "2.000000252", + "amount": "1.000000252", "decimals": 9 }, "optimismsepolia": { - "amount": "0.001000256", + "amount": "0.001000298", "decimals": 9 }, "polygonamoy": { - "amount": "56.722205902", + "amount": "55", "decimals": 9 }, "scrollsepolia": { - "amount": "2.398017347", + "amount": "0.042291812", "decimals": 9 }, "sepolia": { - "amount": "4.349910601", + "amount": "5", "decimals": 9 }, "solanatestnet": { - "amount": "0.001", - "decimals": 9 + "amount": "0.0001", + "decimals": 1 }, "soneiumtestnet": { - "amount": "0.001000259", + "amount": "0.001000267", "decimals": 9 }, + "sonicsvmtestnet": { + "amount": "0.0001", + "decimals": 1 + }, "sonictestnet": { "amount": "1.025001", "decimals": 9 }, "suavetoliman": { - "amount": "2.0736", + "amount": "10.0", "decimals": 9 }, "superpositiontestnet": { @@ -108,11 +112,11 @@ "decimals": 9 }, "treasuretopaz": { - "amount": "0.060735501", + "amount": "10", "decimals": 9 }, "unichaintestnet": { - "amount": "0.001000264", + "amount": "0.001000256", "decimals": 9 } } diff --git a/typescript/infra/config/environments/testnet4/owners.ts b/typescript/infra/config/environments/testnet4/owners.ts index 00f3b00f96..2d86e6fab6 100644 --- a/typescript/infra/config/environments/testnet4/owners.ts +++ b/typescript/infra/config/environments/testnet4/owners.ts @@ -13,4 +13,13 @@ export const owners: ChainMap = { ]), ), // [chainMetadata.solanadevnet.name]: SEALEVEL_DEPLOYER_ADDRESS, + eclipsetestnet: { + owner: 'n/a - SVM not supported here', + }, + solanatestnet: { + owner: 'n/a - SVM not supported here', + }, + sonicsvmtestnet: { + owner: 'n/a - SVM not supported here', + }, }; diff --git a/typescript/infra/config/environments/testnet4/supportedChainNames.ts b/typescript/infra/config/environments/testnet4/supportedChainNames.ts index a4a7cb9e50..c3f9e0e2db 100644 --- a/typescript/infra/config/environments/testnet4/supportedChainNames.ts +++ b/typescript/infra/config/environments/testnet4/supportedChainNames.ts @@ -27,6 +27,7 @@ export const testnet4SupportedChainNames = [ 'sepolia', 'solanatestnet', 'soneiumtestnet', + 'sonicsvmtestnet', 'sonictestnet', 'suavetoliman', 'superpositiontestnet', diff --git a/typescript/infra/config/environments/testnet4/validators.ts b/typescript/infra/config/environments/testnet4/validators.ts index 4a97ebaa44..515ac4d293 100644 --- a/typescript/infra/config/environments/testnet4/validators.ts +++ b/typescript/infra/config/environments/testnet4/validators.ts @@ -306,6 +306,18 @@ export const validatorChainConfig = ( 'unichaintestnet', ), }, + solanatestnet: { + interval: 5, + reorgPeriod: getReorgPeriod('solanatestnet'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5'], + [Contexts.ReleaseCandidate]: [], + [Contexts.Neutron]: [], + }, + 'solanatestnet', + ), + }, sonictestnet: { interval: 5, reorgPeriod: getReorgPeriod('sonictestnet'), @@ -318,6 +330,18 @@ export const validatorChainConfig = ( 'sonictestnet', ), }, + sonicsvmtestnet: { + interval: 5, + reorgPeriod: getReorgPeriod('sonicsvmtestnet'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x83d4ef35f170ec822a0eaadb22a0c40003d8de23'], + [Contexts.ReleaseCandidate]: [], + [Contexts.Neutron]: [], + }, + 'sonicsvmtestnet', + ), + }, arcadiatestnet2: { interval: 5, reorgPeriod: getReorgPeriod('arcadiatestnet2'), diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index c68e2221d9..e9a6fc3401 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -20,8 +20,14 @@ import { getArbitrumEthereumMantleModePolygonScrollZeroNetworkUSDTWarpConfig } f 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 { getArtelaBaseUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getArtelaBaseUSDCWarpConfig.js'; +import { getArtelaBaseWETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.js'; +import { getBaseFormAIXBTWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.js'; +import { getBaseFormGAMEWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.js'; +import { getBaseSolanamainnetTONYWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseSolanamainnetTONYWarpConfig.js'; import { getBaseZeroNetworkCBBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseZeroNetworkCBBTCWarpConfig.js'; import { getBobaBsquaredSwellUBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBobaBsquaredSwellUBTCWarpConfig.js'; +import { getBscEthereumLumiaPrismPNDRWarpConfig } from './environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.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'; @@ -30,17 +36,28 @@ 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 { getEthereumFormUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.js'; +import { getEthereumFormUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.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 = ( @@ -59,8 +76,13 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiSwellTaikoZircuitEZETH]: getRenzoEZETHWarpConfig, [WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig, + [WarpRouteIds.BaseSolanamainnetTONY]: getBaseSolanamainnetTONYWarpConfig, + [WarpRouteIds.BscEthereumLumiaPrismPNDR]: + getBscEthereumLumiaPrismPNDRWarpConfig, [WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig, + [WarpRouteIds.EthereumInkUSDC]: getEthereumInkUSDCConfig, [WarpRouteIds.EthereumSeiFastUSD]: getEthereumSeiFastUSDWarpConfig, + [WarpRouteIds.EthereumSeiPumpBTC]: getEthereumSeiPumpBTCWarpConfig, [WarpRouteIds.EthereumVictionETH]: getEthereumVictionETHWarpConfig, [WarpRouteIds.EthereumVictionUSDC]: getEthereumVictionUSDCWarpConfig, [WarpRouteIds.EthereumVictionUSDT]: getEthereumVictionUSDTWarpConfig, @@ -84,6 +106,17 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.AppchainBaseUSDC]: getAppChainBaseUSDCWarpConfig, [WarpRouteIds.BobaBsquaredSwellUBTC]: getBobaBsquaredSwellUBTCWarpConfig, [WarpRouteIds.EthereumZircuitRe7LRT]: getEthereumZircuitRe7LRTWarpConfig, + [WarpRouteIds.EthereumFormUSDT]: getEthereumFormUSDTWarpConfig, + [WarpRouteIds.EthereumFormUSDC]: getEthereumFormUSDCWarpConfig, + [WarpRouteIds.EthereumSuperseedUSDT]: getEthereumSuperseedUSDTConfig, + [WarpRouteIds.OptimismSuperseedOP]: getOptimismSuperseedOPConfig, + [WarpRouteIds.EthereumZircuitRstETH]: getEthereumZircuitRstETHWarpConfig, + [WarpRouteIds.EthereumFormWBTC]: getEthereumFormWBTCWarpConfig, + [WarpRouteIds.EthereumFormWSTETH]: getEthereumFormWSTETHWarpConfig, + [WarpRouteIds.BaseFormAIXBT]: getBaseFormAIXBTWarpConfig, + [WarpRouteIds.BaseFormGAME]: getBaseFormGAMEWarpConfig, + [WarpRouteIds.ArtelaBaseUSDC]: getArtelaBaseUSDCWarpConfig, + [WarpRouteIds.ArtelaBaseWETH]: getArtelaBaseWETHWarpConfig, }; export async function getWarpConfig( diff --git a/typescript/infra/package.json b/typescript/infra/package.json index a1aebb8998..b938d3a429 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.1.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.1.0", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "7.3.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/sdk": "8.1.0", + "@hyperlane-xyz/utils": "8.1.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 e60d137f95..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( @@ -376,7 +383,7 @@ export async function getAgentConfigsBasedOnArgs(argv?: { } // Sanity check that the validator agent config is valid. - ensureValidatorConfigConsistency(agentConfig); + ensureValidatorConfigConsistency(agentConfig, context); return { agentConfig, @@ -404,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-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/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/send-test-messages.ts b/typescript/infra/scripts/send-test-messages.ts index d028263982..6775ac5534 100644 --- a/typescript/infra/scripts/send-test-messages.ts +++ b/typescript/infra/scripts/send-test-messages.ts @@ -1,9 +1,16 @@ import { Provider } from '@ethersproject/providers'; -import { Wallet } from 'ethers'; +import { BigNumber, Wallet } from 'ethers'; import fs from 'fs'; import yargs from 'yargs'; -import { Mailbox, TestSendReceiver__factory } from '@hyperlane-xyz/core'; +import { + InterchainGasPaymaster, + InterchainGasPaymaster__factory, + Mailbox, + StorageGasOracle, + StorageGasOracle__factory, + TestSendReceiver__factory, +} from '@hyperlane-xyz/core'; import { ChainName, HookType, @@ -11,7 +18,7 @@ import { MultiProvider, TestChainName, } from '@hyperlane-xyz/sdk'; -import { addressToBytes32, sleep } from '@hyperlane-xyz/utils'; +import { addressToBytes32, formatMessage, sleep } from '@hyperlane-xyz/utils'; const ANVIL_KEY = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'; @@ -47,6 +54,44 @@ async function setMailboxHook( console.log(`set the ${mailboxHookType} hook on ${local} to ${hook}`); } +async function setIgpConfig( + remoteId: number, + signer: Wallet, + provider: Provider, + mailbox: Mailbox, + addresses: any, + local: ChainName, +) { + const storageGasOracleF = new StorageGasOracle__factory( + signer.connect(provider), + ); + const storageGasOracle = await storageGasOracleF.deploy(); + await storageGasOracle.deployTransaction.wait(); + + const oracleConfigs: Array = []; + oracleConfigs.push({ + remoteDomain: remoteId, + tokenExchangeRate: '10000000000', + gasPrice: '1000000000', + }); + await storageGasOracle.setRemoteGasDataConfigs(oracleConfigs); + + const gasParamsToSet: InterchainGasPaymaster.GasParamStruct[] = []; + gasParamsToSet.push({ + remoteDomain: remoteId, + config: { + gasOracle: storageGasOracle.address, + gasOverhead: 1000000, + }, + }); + + const igpHook = InterchainGasPaymaster__factory.connect( + addresses[local].interchainGasPaymaster, + signer.connect(provider), + ); + await igpHook.setDestinationGasConfigs(gasParamsToSet); +} + const chainSummary = async (core: HyperlaneCore, chain: ChainName) => { const coreContracts = core.getContracts(chain); const mailbox = coreContracts.mailbox; @@ -157,15 +202,33 @@ async function main() { MailboxHookType.REQUIRED, requiredHook, ); + + if ( + defaultHook === HookType.AGGREGATION || + defaultHook === HookType.INTERCHAIN_GAS_PAYMASTER + ) { + console.log('Setting IGP config for message ...'); + await setIgpConfig(remoteId, signer, provider, mailbox, addresses, local); + } + + const message = formatMessage( + 1, + 0, + multiProvider.getDomainId(local), + recipient.address, + multiProvider.getDomainId(remote), + recipient.address, + '0x1234', + ); const quote = await mailbox['quoteDispatch(uint32,bytes32,bytes)']( remoteId, addressToBytes32(recipient.address), - '0x1234', + message, ); - await recipient['dispatchToSelf(address,uint32,bytes)']( - mailbox.address, + await mailbox['dispatch(uint32,bytes32,bytes)']( remoteId, - '0x1234', + addressToBytes32(recipient.address), + message, { value: quote, }, @@ -173,7 +236,9 @@ async function main() { console.log( `send to ${recipient.address} on ${remote} via mailbox ${ mailbox.address - } on ${local} with nonce ${(await mailbox.nonce()) - 1}`, + } on ${local} with nonce ${ + (await mailbox.nonce()) - 1 + } and quote ${quote.toString()}`, ); console.log(await chainSummary(core, local)); console.log(await chainSummary(core, remote)); 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 4eecc1f736..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'), ]; @@ -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 2ceb1c8cb1..0954bb71af 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -12,7 +12,11 @@ export const tokens: ChainMap> = { USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88', + pumpBTCsei: '0xe9ebd666954B7F0B5B044704c86B126651f6235d', Re7LRT: '0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a', + PNDR: '0x73624d2dEF952C77a1f3B5AD995eef53E49639EC', + rstETH: '0x7a4EffD87C2f3C55CA251080b1343b605f327E3a', + WSTETH: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', }, sei: { fastUSD: '0x37a4dD9CED2b19Cfe8FAC251cd727b5787E45269', @@ -20,6 +24,10 @@ export const tokens: ChainMap> = { base: { cbBTC: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', USDC: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', + AIXBT: '0x4F9Fd6Be4a90f2620860d680c0d4d5Fb53d1A825', + GAME: '0x1C4CcA7C5DB003824208aDDA61Bd749e55F463a3', + WETH: '0x4200000000000000000000000000000000000006', + TONY: '0xb22a793a81ff5b6ad37f40d5fe1e0ac4184d52f3', }, bsquared: { uBTC: '0x796e4D53067FF374B89b2Ac101ce0c1f72ccaAc2', @@ -49,6 +57,7 @@ export const tokens: ChainMap> = { }, optimism: { USDC: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', + OP: '0x4200000000000000000000000000000000000042', }, gnosis: { WETH: '0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1', diff --git a/typescript/infra/src/govern/HyperlaneHaasGovernor.ts b/typescript/infra/src/govern/HyperlaneHaasGovernor.ts index 6fa6ebcd18..42703c1726 100644 --- a/typescript/infra/src/govern/HyperlaneHaasGovernor.ts +++ b/typescript/infra/src/govern/HyperlaneHaasGovernor.ts @@ -1,3 +1,5 @@ +import chalk from 'chalk'; + import { ChainName, CheckerViolation, @@ -5,7 +7,11 @@ import { HyperlaneCore, HyperlaneCoreChecker, InterchainAccount, + ViolationType, } from '@hyperlane-xyz/sdk'; +import { ProtocolType, rootLogger } from '@hyperlane-xyz/utils'; + +import { chainsToSkip } from '../config/chain.js'; import { AnnotatedCallData, @@ -71,8 +77,52 @@ export class HyperlaneHaasGovernor extends HyperlaneAppGovernor< } async check(chainsToCheck?: ChainName[]) { - await this.icaChecker.check(chainsToCheck); - await this.coreChecker.check(chainsToCheck); + // Get all EVM chains from core config + const evmChains = this.coreChecker.getEvmChains(); + + // Mark any EVM chains that are not deployed + const appChains = this.coreChecker.app.chains(); + for (const chain of evmChains) { + if (!appChains.includes(chain)) { + this.coreChecker.addViolation({ + type: ViolationType.NotDeployed, + chain, + expected: '', + actual: '', + }); + } + } + + // Finally, check the chains that were explicitly requested + // If no chains were requested, check all app chains + const chains = + !chainsToCheck || chainsToCheck.length === 0 ? appChains : chainsToCheck; + const failedChains: ChainName[] = []; + if (chainsToSkip.length > 0) { + rootLogger.info( + chalk.yellow('Skipping chains:', chainsToSkip.join(', ')), + ); + } + await Promise.allSettled( + chains + .filter( + (chain) => + this.coreChecker.multiProvider.getChainMetadata(chain).protocol === + ProtocolType.Ethereum && !chainsToSkip.includes(chain), + ) + .map(async (chain) => { + try { + await this.checkChain(chain); + } catch (err) { + rootLogger.error(chalk.red(`Failed to check chain ${chain}:`, err)); + failedChains.push(chain); + } + }), + ); + + if (failedChains.length > 0) { + rootLogger.error(chalk.red('Failed chains:', failedChains.join(', '))); + } } async checkChain(chain: ChainName) { 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 855393473a..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,8 +90,17 @@ 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. @@ -100,6 +110,11 @@ export function removeHelmRelease(releaseName: string, namespace: string) { export type HelmValues = Record; +export interface HelmCommandOptions { + dryRun?: boolean; + updateRepoCache?: boolean; +} + export abstract class HelmManager { abstract readonly helmReleaseName: string; abstract readonly helmChartPath: string; @@ -111,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'); @@ -141,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 80c2f2353b..a773d4462a 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '7e520fb-20241215-234731', + tag: '700e53a-20250115-183228', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, 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..52c9bf5a95 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,46 @@ # @hyperlane-xyz/sdk +## 8.1.0 + +### Minor Changes + +- 9ab961a79: Deploy to new chains: artela, guru, hemi, nero, xpla. + +### Patch Changes + +- 79c61c891: Fix the return type of multisig and aggregation ISMs for zksync-stack chains. +- 9518dbc84: Enroll new validators for artela, guru, hemi, nero, soneium, torus, xpla. + - @hyperlane-xyz/utils@8.1.0 + - @hyperlane-xyz/core@5.9.1 + +## 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 1c383e1839..966369a475 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,15 +1,15 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "7.3.0", + "version": "8.1.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", - "@hyperlane-xyz/core": "5.8.3", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/core": "5.9.1", + "@hyperlane-xyz/utils": "8.1.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 0febbb803c..86ea0b4d06 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,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + artela: { + threshold: 2, + validators: [ + { + address: '0x8fcc1ebd4c0b463618db13f83e4565af3e166b00', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + arthera: { threshold: 2, validators: [ @@ -842,6 +864,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + guru: { + threshold: 2, + validators: [ + { + address: '0x0d756d9051f12c4de6aee2ee972193a2adfe00ef', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + harmony: { threshold: 2, validators: [ @@ -854,6 +888,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + hemi: { + threshold: 2, + validators: [ + { + address: '0x312dc72c17d01f3fd0abd31dd9b569bc473266dd', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + holesky: { threshold: 1, validators: [ @@ -1219,6 +1265,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + nero: { + threshold: 2, + validators: [ + { + address: '0xb86f872df37f11f33acbe75b6ed208b872b57183', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + neutron: { threshold: 4, validators: [ @@ -1617,12 +1675,26 @@ export const defaultMultisigConfigs: ChainMap = { }, soneium: { - threshold: 1, + threshold: 4, validators: [ { address: '0xd4b7af853ed6a2bfc329ecef545df90c959cbee8', alias: AW_VALIDATOR_ALIAS, }, + { + address: '0x9f4fa50ce49815b0932428a0eb1988382cef4a97', + alias: 'Imperator', + }, + { + address: '0x8d2f8ebd61d055d58768cf3b07cb2fb565d87716', + alias: 'Enigma', + }, + { + address: '0x6c5f6ab7a369222e6691218ad981fe08a5def094', + alias: 'Luganodes', + }, + DEFAULT_BWARE_LABS_VALIDATOR, + DEFAULT_TESSELLATED_VALIDATOR, ], }, @@ -1648,6 +1720,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + sonicsvmtestnet: { + threshold: 1, + validators: [ + { + address: '0x83d4ef35f170ec822a0eaadb22a0c40003d8de23', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + sonictestnet: { threshold: 1, validators: [ @@ -1658,6 +1740,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + soon: { + threshold: 2, + validators: [ + { + address: '0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + stride: { threshold: 6, validators: [ @@ -1702,6 +1796,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + subtensor: { + threshold: 1, + validators: [ + { + address: '0xd5f8196d7060b85bea491f0b52a671e05f3d10a2', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + superpositionmainnet: { threshold: 2, validators: [ @@ -1811,6 +1915,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + torus: { + threshold: 2, + validators: [ + { + address: '0x96982a325c28a842bc8cf61b63000737bb9f1f7d', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + treasure: { threshold: 3, validators: [ @@ -1939,6 +2055,18 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + xpla: { + threshold: 2, + validators: [ + { + address: '0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + ], + }, + zeronetwork: { threshold: 2, validators: [ diff --git a/typescript/sdk/src/hook/EvmHookModule.ts b/typescript/sdk/src/hook/EvmHookModule.ts index eddbb1c788..45235304a6 100644 --- a/typescript/sdk/src/hook/EvmHookModule.ts +++ b/typescript/sdk/src/hook/EvmHookModule.ts @@ -631,6 +631,8 @@ export class EvmHookModule extends HyperlaneModule< ); } + this.logger.debug(`Deploying hook of type ${config.type}`); + switch (config.type) { case HookType.MERKLE_TREE: return this.deployer.deployContract(this.chain, HookType.MERKLE_TREE, [ diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index dd94504fcd..ce71e653c6 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, @@ -166,6 +166,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, @@ -209,18 +210,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, @@ -236,15 +243,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 { @@ -299,9 +306,6 @@ export { MultiProviderOptions, } from './providers/MultiProvider.js'; export { - ProviderBuilderFn, - ProviderBuilderMap, - TypedProviderBuilderFn, defaultEthersV5ProviderBuilder, defaultFuelProviderBuilder, defaultProviderBuilder, @@ -309,6 +313,9 @@ export { defaultSolProviderBuilder, defaultViemProviderBuilder, protocolToDefaultProviderBuilder, + ProviderBuilderFn, + ProviderBuilderMap, + TypedProviderBuilderFn, } from './providers/providerBuilders.js'; export { CosmJsContract, @@ -348,9 +355,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 { @@ -412,13 +419,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, @@ -458,17 +466,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 { @@ -491,8 +499,8 @@ export { export { IHypTokenAdapter, IHypXERC20Adapter, - ITokenAdapter, InterchainGasQuote, + ITokenAdapter, TransferParams, TransferRemoteParams, } from './token/adapters/ITokenAdapter.js'; @@ -505,9 +513,9 @@ export { SealevelTokenAdapter, } from './token/adapters/SealevelTokenAdapter.js'; export { - SealevelHypTokenInstruction, SealevelHyperlaneTokenData, SealevelHyperlaneTokenDataSchema, + SealevelHypTokenInstruction, SealevelTransferRemoteInstruction, SealevelTransferRemoteSchema, } from './token/adapters/serialization.js'; @@ -515,11 +523,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'; @@ -528,16 +536,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, @@ -545,8 +554,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, @@ -556,6 +567,12 @@ export { HypTokenConfigSchema, HypTokenRouterConfig, HypTokenRouterConfigSchema, + isCollateralRebaseTokenConfig, + isCollateralTokenConfig, + isNativeTokenConfig, + isSyntheticRebaseTokenConfig, + isSyntheticTokenConfig, + isTokenMetadata, NativeTokenConfig, NativeTokenConfigSchema, SyntheticRebaseTokenConfig, @@ -567,12 +584,6 @@ export { WarpRouteDeployConfig, WarpRouteDeployConfigSchema, WarpRouteDeployConfigSchemaErrors, - isCollateralRebaseTokenConfig, - isCollateralTokenConfig, - isNativeTokenConfig, - isSyntheticRebaseTokenConfig, - isSyntheticTokenConfig, - isTokenMetadata, } from './token/types.js'; export { ChainMap, @@ -610,9 +621,9 @@ 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 { @@ -628,4 +639,3 @@ export { WarpTypedTransaction, } from './warp/types.js'; export { WarpCore, WarpCoreOptions } from './warp/WarpCore.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/ism/HyperlaneIsmFactory.ts b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts index c8c987a5d9..515a2da0a9 100644 --- a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts +++ b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts @@ -131,7 +131,7 @@ export class HyperlaneIsmFactory extends HyperlaneApp { const logger = this.logger.child({ destination, ismType }); logger.debug( - `Deploying ${ismType} to ${destination} ${ + `Deploying ISM of type ${ismType} to ${destination} ${ origin ? `(for verifying ${origin})` : '' }`, ); diff --git a/typescript/sdk/src/metadata/agentConfig.ts b/typescript/sdk/src/metadata/agentConfig.ts index cb570e29eb..58a80dc709 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; }); @@ -248,8 +310,8 @@ export const AgentConfigSchema = z.object({ .optional(), }); -const CommaSeperatedChainList = z.string().regex(/^[a-z0-9]+(,[a-z0-9]+)*$/); -const CommaSeperatedDomainList = z.string().regex(/^\d+(,\d+)*$/); +const CommaSeparatedChainList = z.string().regex(/^[a-z0-9]+(,[a-z0-9]+)*$/); +const CommaSeparatedDomainList = z.string().regex(/^\d+(,\d+)*$/); export enum GasPaymentEnforcementPolicyType { None = 'none', @@ -293,7 +355,7 @@ export const RelayerAgentConfigSchema = AgentConfigSchema.extend({ .min(1) .optional() .describe('The path to the relayer database.'), - relayChains: CommaSeperatedChainList.describe( + relayChains: CommaSeparatedChainList.describe( 'Comma separated list of chains to relay messages between.', ), gasPaymentEnforcement: z @@ -321,7 +383,7 @@ export const RelayerAgentConfigSchema = AgentConfigSchema.extend({ transactionGasLimit: ZUWei.optional().describe( 'This is optional. If not specified, any amount of gas will be valid, otherwise this is the max allowed gas in wei to relay a transaction.', ), - skipTransactionGasLimitFor: CommaSeperatedDomainList.optional().describe( + skipTransactionGasLimitFor: CommaSeparatedDomainList.optional().describe( 'Comma separated List of chain names to skip applying the transaction gas limit to.', ), allowLocalCheckpointSyncers: z @@ -342,7 +404,7 @@ export type RelayerConfig = z.infer; export const ScraperAgentConfigSchema = AgentConfigSchema.extend({ db: z.string().min(1).describe('Database connection string'), - chainsToScrape: CommaSeperatedChainList.describe( + chainsToScrape: CommaSeparatedChainList.describe( 'Comma separated list of chain names to scrape', ), }); 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/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/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index 3cf2756603..232c213369 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,17 @@ # @hyperlane-xyz/utils +## 8.1.0 + +## 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..a1c461a1de 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.1.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/widgets/CHANGELOG.md b/typescript/widgets/CHANGELOG.md index be73ca35c6..60c3b63817 100644 --- a/typescript/widgets/CHANGELOG.md +++ b/typescript/widgets/CHANGELOG.md @@ -1,5 +1,42 @@ # @hyperlane-xyz/widgets +## 8.1.0 + +### Patch Changes + +- Updated dependencies [79c61c891] +- Updated dependencies [9518dbc84] +- Updated dependencies [9ab961a79] + - @hyperlane-xyz/sdk@8.1.0 + - @hyperlane-xyz/utils@8.1.0 + +## 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..11d0aad02c 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.1.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.1.0", + "@hyperlane-xyz/utils": "8.1.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/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 da261caf33..471c94f7ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7321,11 +7321,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.1.0" + "@hyperlane-xyz/utils": "npm:8.1.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" @@ -7360,13 +7361,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:5.8.3, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:5.9.1, @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.1.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -7417,14 +7418,14 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/helloworld@npm:7.3.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:8.1.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.1" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -7473,10 +7474,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.1.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.1.0" + "@hyperlane-xyz/utils": "npm:8.1.0" "@inquirer/prompts": "npm:3.3.2" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" @@ -7546,7 +7547,7 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:7.3.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:8.1.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: @@ -7556,8 +7557,8 @@ __metadata: "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:5.8.3" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/core": "npm:5.9.1" + "@hyperlane-xyz/utils": "npm:8.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -7600,7 +7601,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/utils@npm:7.3.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:8.1.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: @@ -7642,8 +7643,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.1.0" + "@hyperlane-xyz/utils": "npm:8.1.0" "@interchain-ui/react": "npm:^1.23.28" "@rainbow-me/rainbowkit": "npm:^2.2.0" "@solana/wallet-adapter-react": "npm:^0.15.32" @@ -7737,6 +7738,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" @@ -7790,6 +7808,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" @@ -7841,6 +7866,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" @@ -7872,6 +7911,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" @@ -29046,6 +29094,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"