diff --git a/.changeset/empty-dodos-clap.md b/.changeset/empty-dodos-clap.md new file mode 100644 index 0000000000..cd2826f718 --- /dev/null +++ b/.changeset/empty-dodos-clap.md @@ -0,0 +1,6 @@ +--- +'@hyperlane-xyz/cli': minor +'@hyperlane-xyz/sdk': minor +--- + +Remove ismFactoryAddresses from warpConfig diff --git a/.changeset/empty-needles-cough.md b/.changeset/empty-needles-cough.md deleted file mode 100644 index ab064a5a26..0000000000 --- a/.changeset/empty-needles-cough.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperlane-xyz/utils': major -'@hyperlane-xyz/sdk': major ---- - -Upgrade Viem to 2.2 and Solana Web3 to 1.9 -Rename `chainMetadataToWagmiChain` to `chainMetadataToViemChain` diff --git a/.changeset/hip-mugs-fold.md b/.changeset/hip-mugs-fold.md deleted file mode 100644 index 6cf1960cdf..0000000000 --- a/.changeset/hip-mugs-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Deploy to alephzeroevmtestnet, update deployment for arcadiatestnet2. diff --git a/.changeset/lazy-carpets-nail.md b/.changeset/lazy-carpets-nail.md deleted file mode 100644 index e838512e88..0000000000 --- a/.changeset/lazy-carpets-nail.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor -'@hyperlane-xyz/sdk': minor -'@hyperlane-xyz/core': minor ---- - -Add storage based multisig ISM types diff --git a/.changeset/shy-taxis-suffer.md b/.changeset/shy-taxis-suffer.md deleted file mode 100644 index 17d53d2a3a..0000000000 --- a/.changeset/shy-taxis-suffer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/utils': patch ---- - -Added a mustGet helper diff --git a/.codespell/ignore.txt b/.codespell/ignore.txt index 85cd6f56a9..ec0437cb91 100644 --- a/.codespell/ignore.txt +++ b/.codespell/ignore.txt @@ -5,3 +5,4 @@ receivedFrom ser readded re-use +superseed diff --git a/.github/workflows/monorepo-docker.yml b/.github/workflows/monorepo-docker.yml index e697aae22c..750a903d19 100644 --- a/.github/workflows/monorepo-docker.yml +++ b/.github/workflows/monorepo-docker.yml @@ -6,8 +6,9 @@ on: - '**' pull_request: paths: - # For now, because this image is only used to use `infra`, we just build for infra changes + # For now, because this image is only used to use `infra`, we just build for infra or .registryrc changes - 'typescript/infra/**' + - '.registryrc' - 'Dockerfile' - '.dockerignore' - '.github/workflows/monorepo-docker.yml' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b780d6585d..52410ecd6f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -109,9 +109,18 @@ jobs: - name: Unit Tests run: yarn test:ci - cli-e2e: + cli-e2e-matrix: runs-on: ubuntu-latest needs: [yarn-install] + strategy: + fail-fast: false + matrix: + test: + - core + - relay + - warp-read + - warp-apply + - warp-deploy steps: - uses: actions/checkout@v4 with: @@ -130,8 +139,21 @@ jobs: - name: Checkout registry uses: ./.github/actions/checkout-registry - - name: CLI e2e tests + - name: CLI e2e tests (${{ matrix.test }}) run: yarn --cwd typescript/cli test:e2e + env: + CLI_E2E_TEST: ${{ matrix.test }} + + cli-e2e: + runs-on: ubuntu-latest + needs: cli-e2e-matrix + if: always() + steps: + - name: Check cli-e2e matrix status + if: ${{ needs.cli-e2e-matrix.result != 'success' }} + run: | + echo "CLI E2E tests failed" + exit 1 agent-configs: runs-on: ubuntu-latest diff --git a/.registryrc b/.registryrc index f83527ac36..bf93b8106a 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -4e52093acfe3dc75a35771905f3a7757b368ac50 +3cd1c7d8af8718fcac340027d147ba3c4a6df12c diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index b6f02ecfee..28f0f74c2c 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -2564,7 +2564,8 @@ dependencies = [ [[package]] name = "ed25519-dalek" version = "1.0.1" -source = "git+https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek?branch=main#7529d65506147b6cb24ca6d8f4fc062cac33b395" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ "curve25519-dalek 3.2.2", "ed25519 1.5.3", @@ -4629,6 +4630,7 @@ dependencies = [ "hyperlane-sealevel-multisig-ism-message-id", "hyperlane-sealevel-validator-announce", "jsonrpc-core", + "lazy_static", "multisig-ism", "num-traits", "reqwest", @@ -8352,7 +8354,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "Inflector", "base64 0.13.1", @@ -8376,7 +8378,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "bytemuck", @@ -8396,7 +8398,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "chrono", "clap 2.34.0", @@ -8413,7 +8415,7 @@ dependencies = [ [[package]] name = "solana-cli-config" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "dirs-next", "lazy_static", @@ -8428,7 +8430,7 @@ dependencies = [ [[package]] name = "solana-client" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "async-mutex", "async-trait", @@ -8481,7 +8483,7 @@ dependencies = [ [[package]] name = "solana-config-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "chrono", @@ -8494,7 +8496,7 @@ dependencies = [ [[package]] name = "solana-faucet" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "byteorder", @@ -8517,7 +8519,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "ahash 0.7.8", "blake3", @@ -8550,7 +8552,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -8561,7 +8563,7 @@ dependencies = [ [[package]] name = "solana-logger" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "env_logger", "lazy_static", @@ -8571,7 +8573,7 @@ dependencies = [ [[package]] name = "solana-measure" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "solana-sdk", @@ -8580,7 +8582,7 @@ dependencies = [ [[package]] name = "solana-metrics" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "gethostname", @@ -8593,7 +8595,7 @@ dependencies = [ [[package]] name = "solana-net-utils" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "clap 3.2.25", @@ -8614,7 +8616,7 @@ dependencies = [ [[package]] name = "solana-perf" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "ahash 0.7.8", "bincode", @@ -8640,7 +8642,7 @@ dependencies = [ [[package]] name = "solana-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "base64 0.13.1", "bincode", @@ -8688,7 +8690,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "base64 0.13.1", "bincode", @@ -8714,7 +8716,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "lazy_static", "num_cpus", @@ -8723,7 +8725,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "console", "dialoguer", @@ -8741,7 +8743,7 @@ dependencies = [ [[package]] name = "solana-sdk" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "assert_matches", "base64 0.13.1", @@ -8791,7 +8793,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bs58 0.4.0", "proc-macro2 1.0.86", @@ -8803,7 +8805,7 @@ dependencies = [ [[package]] name = "solana-streamer" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "futures-util", @@ -8831,7 +8833,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "Inflector", "base64 0.13.1", @@ -8859,7 +8861,7 @@ dependencies = [ [[package]] name = "solana-version" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "rustc_version", @@ -8874,7 +8876,7 @@ dependencies = [ [[package]] name = "solana-vote-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "log", @@ -8894,7 +8896,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "aes-gcm-siv", "arrayref", diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index 0f1ec5f743..0059867e13 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -83,6 +83,7 @@ itertools = "*" jobserver = "=0.1.26" jsonrpc-core = "18.0" k256 = { version = "0.13.4", features = ["arithmetic", "std", "ecdsa"] } +lazy_static = "1.5.0" log = "0.4" macro_rules_attribute = "0.2" maplit = "1.0" @@ -125,24 +126,9 @@ sha2 = { version = "0.10.6", default-features = false } sha256 = "1.1.4" sha3 = "0.10" solana-account-decoder = "=1.14.13" -solana-banks-client = "=1.14.13" -solana-banks-interface = "=1.14.13" -solana-banks-server = "=1.14.13" -solana-clap-utils = "=1.14.13" -solana-cli-config = "=1.14.13" solana-client = "=1.14.13" -solana-program = "=1.14.13" -solana-program-test = "=1.14.13" solana-sdk = "=1.14.13" solana-transaction-status = "=1.14.13" -solana-zk-token-sdk = "=1.14.13" -spl-associated-token-account = { version = "=1.1.2", features = [ - "no-entrypoint", -] } -spl-noop = { version = "=0.1.3", features = ["no-entrypoint"] } -spl-token = { version = "=3.5.0", features = ["no-entrypoint"] } -spl-token-2022 = { version = "=0.5.0", features = ["no-entrypoint"] } -spl-type-length-value = "=0.1.0" static_assertions = "1.1" strum = "0.26.2" strum_macros = "0.26.2" @@ -238,11 +224,6 @@ branch = "v3.2.2-relax-zeroize" git = "https://github.com/Eclipse-Laboratories-Inc/curve25519-dalek" version = "3.2.2" -[patch.crates-io.ed25519-dalek] -branch = "main" -git = "https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek" -version = "1.0.1" - [patch.crates-io.primitive-types] branch = "hyperlane" git = "https://github.com/hyperlane-xyz/parity-common.git" @@ -255,42 +236,42 @@ version = "=0.5.2" [patch.crates-io.solana-account-decoder] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-clap-utils] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-cli-config] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-client] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-program] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-sdk] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-transaction-status] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-zk-token-sdk] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.spl-associated-token-account] diff --git a/rust/main/agents/relayer/src/msg/pending_message.rs b/rust/main/agents/relayer/src/msg/pending_message.rs index cee00aed78..d63b7b03f3 100644 --- a/rust/main/agents/relayer/src/msg/pending_message.rs +++ b/rust/main/agents/relayer/src/msg/pending_message.rs @@ -468,7 +468,7 @@ impl PendingOperation for PendingMessage { actual_gas_for_message = ?gas_used_by_operation, message_gas_estimate = ?operation_estimate, submission_gas_estimate = ?submission_estimated_cost, - message = ?self.message, + hyp_message = ?self.message, "Gas used by message submission" ); } diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index 1ac619792c..6bd1a63a8d 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -152,6 +152,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() @@ -166,6 +167,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() @@ -180,6 +182,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() diff --git a/rust/main/agents/scraper/src/agent.rs b/rust/main/agents/scraper/src/agent.rs index fd9afc6d7c..443d1c7fac 100644 --- a/rust/main/agents/scraper/src/agent.rs +++ b/rust/main/agents/scraper/src/agent.rs @@ -3,16 +3,17 @@ use std::{collections::HashMap, sync::Arc}; use async_trait::async_trait; use derive_more::AsRef; use futures::future::try_join_all; +use hyperlane_core::{Delivery, HyperlaneDomain, HyperlaneMessage, InterchainGasPayment, H512}; +use tokio::{sync::mpsc::Receiver as MpscReceiver, task::JoinHandle}; +use tracing::{info_span, instrument::Instrumented, trace, Instrument}; + use hyperlane_base::{ broadcast::BroadcastMpscSender, metrics::AgentMetrics, settings::IndexSettings, AgentMetadata, BaseAgent, ChainMetrics, ContractSyncMetrics, ContractSyncer, CoreMetrics, HyperlaneAgentCore, MetricsUpdater, SyncOptions, }; -use hyperlane_core::{Delivery, HyperlaneDomain, HyperlaneMessage, InterchainGasPayment, H512}; -use tokio::{sync::mpsc::Receiver as MpscReceiver, task::JoinHandle}; -use tracing::{info_span, instrument::Instrumented, trace, Instrument}; -use crate::{chain_scraper::HyperlaneSqlDb, db::ScraperDb, settings::ScraperSettings}; +use crate::{db::ScraperDb, settings::ScraperSettings, store::HyperlaneDbStore}; /// A message explorer scraper agent #[derive(Debug, AsRef)] @@ -31,7 +32,7 @@ pub struct Scraper { #[derive(Debug)] struct ChainScraper { index_settings: IndexSettings, - db: HyperlaneSqlDb, + store: HyperlaneDbStore, domain: HyperlaneDomain, } @@ -59,7 +60,7 @@ impl BaseAgent for Scraper { for domain in settings.chains_to_scrape.iter() { let chain_setup = settings.chain_setup(domain).expect("Missing chain config"); - let db = HyperlaneSqlDb::new( + let store = HyperlaneDbStore::new( db.clone(), chain_setup.addresses.mailbox, domain.clone(), @@ -74,7 +75,7 @@ impl BaseAgent for Scraper { domain.id(), ChainScraper { domain: domain.clone(), - db, + store, index_settings: chain_setup.index.clone(), }, ); @@ -132,7 +133,7 @@ impl Scraper { /// This will spawn long-running contract sync tasks async fn scrape(&self, domain_id: u32) -> Instrumented> { let scraper = self.scrapers.get(&domain_id).unwrap(); - let db = scraper.db.clone(); + let store = scraper.store.clone(); let index_settings = scraper.index_settings.clone(); let domain = scraper.domain.clone(); @@ -142,7 +143,7 @@ impl Scraper { domain.clone(), self.core_metrics.clone(), self.contract_sync_metrics.clone(), - db.clone(), + store.clone(), index_settings.clone(), ) .await; @@ -152,7 +153,7 @@ impl Scraper { domain.clone(), self.core_metrics.clone(), self.contract_sync_metrics.clone(), - db.clone(), + store.clone(), index_settings.clone(), ) .await, @@ -162,7 +163,7 @@ impl Scraper { domain, self.core_metrics.clone(), self.contract_sync_metrics.clone(), - db, + store, index_settings.clone(), BroadcastMpscSender::::map_get_receiver(maybe_broadcaster.as_ref()).await, ) @@ -183,7 +184,7 @@ impl Scraper { domain: HyperlaneDomain, metrics: Arc, contract_sync_metrics: Arc, - db: HyperlaneSqlDb, + store: HyperlaneDbStore, index_settings: IndexSettings, ) -> ( Instrumented>, @@ -196,7 +197,8 @@ impl Scraper { &domain, &metrics.clone(), &contract_sync_metrics.clone(), - db.into(), + store.into(), + true, ) .await .unwrap(); @@ -217,7 +219,7 @@ impl Scraper { domain: HyperlaneDomain, metrics: Arc, contract_sync_metrics: Arc, - db: HyperlaneSqlDb, + store: HyperlaneDbStore, index_settings: IndexSettings, ) -> Instrumented> { let sync = self @@ -227,7 +229,8 @@ impl Scraper { &domain, &metrics.clone(), &contract_sync_metrics.clone(), - Arc::new(db.clone()) as _, + Arc::new(store.clone()) as _, + true, ) .await .unwrap(); @@ -248,7 +251,7 @@ impl Scraper { domain: HyperlaneDomain, metrics: Arc, contract_sync_metrics: Arc, - db: HyperlaneSqlDb, + store: HyperlaneDbStore, index_settings: IndexSettings, tx_id_receiver: Option>, ) -> Instrumented> { @@ -259,7 +262,8 @@ impl Scraper { &domain, &metrics.clone(), &contract_sync_metrics.clone(), - Arc::new(db.clone()), + Arc::new(store.clone()), + true, ) .await .unwrap(); diff --git a/rust/main/agents/scraper/src/db/generated/domain.rs b/rust/main/agents/scraper/src/db/generated/domain.rs index 25f521929f..cf1aaa2a7c 100644 --- a/rust/main/agents/scraper/src/db/generated/domain.rs +++ b/rust/main/agents/scraper/src/db/generated/domain.rs @@ -65,7 +65,7 @@ impl ColumnTrait for Column { Self::TimeUpdated => ColumnType::DateTime.def(), Self::Name => ColumnType::Text.def(), Self::NativeToken => ColumnType::Text.def(), - Self::ChainId => ColumnType::BigInteger.def().null().unique(), + Self::ChainId => ColumnType::BigInteger.def().null(), Self::IsTestNet => ColumnType::Boolean.def(), Self::IsDeprecated => ColumnType::Boolean.def(), } diff --git a/rust/main/agents/scraper/src/db/message.rs b/rust/main/agents/scraper/src/db/message.rs index 423c24058a..0796400f6b 100644 --- a/rust/main/agents/scraper/src/db/message.rs +++ b/rust/main/agents/scraper/src/db/message.rs @@ -31,36 +31,6 @@ pub struct StorableMessage<'a> { } impl ScraperDb { - /// Get the highest message nonce that is stored in the database. - #[instrument(skip(self))] - pub async fn last_message_nonce( - &self, - origin_domain: u32, - origin_mailbox: &H256, - ) -> Result> { - #[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] - enum QueryAs { - Nonce, - } - - let last_nonce = message::Entity::find() - .filter(message::Column::Origin.eq(origin_domain)) - .filter(message::Column::OriginMailbox.eq(address_to_bytes(origin_mailbox))) - .select_only() - .column_as(message::Column::Nonce.max(), QueryAs::Nonce) - .into_values::() - .one(&self.0) - .await? - .map(|idx| idx as u32); - debug!( - ?last_nonce, - origin_domain, - ?origin_mailbox, - "Queried last message nonce from database" - ); - Ok(last_nonce) - } - /// Get the dispatched message associated with a nonce. #[instrument(skip(self))] pub async fn retrieve_message_by_nonce( diff --git a/rust/main/agents/scraper/src/main.rs b/rust/main/agents/scraper/src/main.rs index cab1a09633..f9b0d5971f 100644 --- a/rust/main/agents/scraper/src/main.rs +++ b/rust/main/agents/scraper/src/main.rs @@ -17,13 +17,12 @@ use agent::Scraper; use eyre::Result; use hyperlane_base::agent_main; -mod db; - mod agent; -mod chain_scraper; mod conversions; mod date_time; +mod db; mod settings; +mod store; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<()> { diff --git a/rust/main/agents/scraper/src/store.rs b/rust/main/agents/scraper/src/store.rs new file mode 100644 index 0000000000..58c55a2441 --- /dev/null +++ b/rust/main/agents/scraper/src/store.rs @@ -0,0 +1,6 @@ +pub use storage::HyperlaneDbStore; + +mod deliveries; +mod dispatches; +mod payments; +mod storage; diff --git a/rust/main/agents/scraper/src/store/deliveries.rs b/rust/main/agents/scraper/src/store/deliveries.rs new file mode 100644 index 0000000000..dc805baaa2 --- /dev/null +++ b/rust/main/agents/scraper/src/store/deliveries.rs @@ -0,0 +1,43 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use eyre::Result; + +use hyperlane_core::{Delivery, HyperlaneLogStore, Indexed, LogMeta, H512}; + +use crate::db::StorableDelivery; +use crate::store::storage::{HyperlaneDbStore, TxnWithId}; + +#[async_trait] +impl HyperlaneLogStore for HyperlaneDbStore { + /// Store delivered message ids from the destination mailbox into the database. + /// We store only delivered messages ids from blocks and transaction which we could successfully + /// insert into database. + async fn store_logs(&self, deliveries: &[(Indexed, LogMeta)]) -> Result { + if deliveries.is_empty() { + return Ok(0); + } + let txns: HashMap = self + .ensure_blocks_and_txns(deliveries.iter().map(|r| &r.1)) + .await? + .map(|t| (t.hash, t)) + .collect(); + let storable = deliveries + .iter() + .filter_map(|(message_id, meta)| { + txns.get(&meta.transaction_id) + .map(|txn| (*message_id.inner(), meta, txn.id)) + }) + .map(|(message_id, meta, txn_id)| StorableDelivery { + message_id, + meta, + txn_id, + }); + + let stored = self + .db + .store_deliveries(self.domain.id(), self.mailbox_address, storable) + .await?; + Ok(stored as u32) + } +} diff --git a/rust/main/agents/scraper/src/store/dispatches.rs b/rust/main/agents/scraper/src/store/dispatches.rs new file mode 100644 index 0000000000..31aecedd97 --- /dev/null +++ b/rust/main/agents/scraper/src/store/dispatches.rs @@ -0,0 +1,64 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use eyre::Result; + +use hyperlane_core::{ + unwrap_or_none_result, HyperlaneLogStore, HyperlaneMessage, + HyperlaneSequenceAwareIndexerStoreReader, Indexed, LogMeta, H512, +}; + +use crate::db::StorableMessage; +use crate::store::storage::{HyperlaneDbStore, TxnWithId}; + +#[async_trait] +impl HyperlaneLogStore for HyperlaneDbStore { + /// Store dispatched messages from the origin mailbox into the database. + /// We store only messages from blocks and transaction which we could successfully insert + /// into database. + async fn store_logs(&self, messages: &[(Indexed, LogMeta)]) -> Result { + if messages.is_empty() { + return Ok(0); + } + let txns: HashMap = self + .ensure_blocks_and_txns(messages.iter().map(|r| &r.1)) + .await? + .map(|t| (t.hash, t)) + .collect(); + let storable = messages + .iter() + .filter_map(|(message, meta)| { + txns.get(&meta.transaction_id) + .map(|t| (message.inner().clone(), meta, t.id)) + }) + .map(|(msg, meta, txn_id)| StorableMessage { msg, meta, txn_id }); + let stored = self + .db + .store_dispatched_messages(self.domain.id(), &self.mailbox_address, storable) + .await?; + Ok(stored as u32) + } +} + +#[async_trait] +impl HyperlaneSequenceAwareIndexerStoreReader for HyperlaneDbStore { + /// Gets a message by its nonce. + async fn retrieve_by_sequence(&self, sequence: u32) -> Result> { + let message = self + .db + .retrieve_message_by_nonce(self.domain.id(), &self.mailbox_address, sequence) + .await?; + Ok(message) + } + + /// Gets the block number at which the log occurred. + async fn retrieve_log_block_number_by_sequence(&self, sequence: u32) -> Result> { + let tx_id = unwrap_or_none_result!( + self.db + .retrieve_dispatched_tx_id(self.domain.id(), &self.mailbox_address, sequence) + .await? + ); + let block_id = unwrap_or_none_result!(self.db.retrieve_block_id(tx_id).await?); + Ok(self.db.retrieve_block_number(block_id).await?) + } +} diff --git a/rust/main/agents/scraper/src/store/payments.rs b/rust/main/agents/scraper/src/store/payments.rs new file mode 100644 index 0000000000..4c5ee465f0 --- /dev/null +++ b/rust/main/agents/scraper/src/store/payments.rs @@ -0,0 +1,43 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use eyre::Result; + +use hyperlane_core::{HyperlaneLogStore, Indexed, InterchainGasPayment, LogMeta, H512}; + +use crate::db::StorablePayment; +use crate::store::storage::HyperlaneDbStore; + +#[async_trait] +impl HyperlaneLogStore for HyperlaneDbStore { + /// Store interchain gas payments into the database. + /// We store only interchain gas payments from blocks and transaction which we could + /// successfully insert into database. + async fn store_logs( + &self, + payments: &[(Indexed, LogMeta)], + ) -> Result { + if payments.is_empty() { + return Ok(0); + } + let txns: HashMap = self + .ensure_blocks_and_txns(payments.iter().map(|r| &r.1)) + .await? + .map(|t| (t.hash, t)) + .collect(); + let storable = payments + .iter() + .filter_map(|(payment, meta)| { + txns.get(&meta.transaction_id) + .map(|txn| (payment.inner(), meta, txn.id)) + }) + .map(|(payment, meta, txn_id)| StorablePayment { + payment, + meta, + txn_id, + }); + + let stored = self.db.store_payments(self.domain.id(), storable).await?; + Ok(stored as u32) + } +} diff --git a/rust/main/agents/scraper/src/chain_scraper/mod.rs b/rust/main/agents/scraper/src/store/storage.rs similarity index 67% rename from rust/main/agents/scraper/src/chain_scraper/mod.rs rename to rust/main/agents/scraper/src/store/storage.rs index 0be5b2ef13..5dcde4ed3b 100644 --- a/rust/main/agents/scraper/src/chain_scraper/mod.rs +++ b/rust/main/agents/scraper/src/store/storage.rs @@ -12,15 +12,11 @@ use tracing::{trace, warn}; use hyperlane_base::settings::IndexSettings; use hyperlane_core::{ - unwrap_or_none_result, BlockId, BlockInfo, Delivery, HyperlaneDomain, HyperlaneLogStore, - HyperlaneMessage, HyperlaneProvider, HyperlaneSequenceAwareIndexerStoreReader, - HyperlaneWatermarkedLogStore, Indexed, InterchainGasPayment, LogMeta, H256, H512, + BlockId, BlockInfo, HyperlaneDomain, HyperlaneLogStore, HyperlaneProvider, + HyperlaneWatermarkedLogStore, LogMeta, H256, H512, }; -use crate::db::{ - BasicBlock, BlockCursor, ScraperDb, StorableDelivery, StorableMessage, StorablePayment, - StorableTxn, -}; +use crate::db::{BasicBlock, BlockCursor, ScraperDb, StorableTxn}; /// Maximum number of records to query at a time. This came about because when a /// lot of messages are sent in a short period of time we were ending up with a @@ -31,16 +27,16 @@ const CHUNK_SIZE: usize = 50; /// A chain scraper is comprised of all the information and contract/provider /// connections needed to scrape the contracts on a single blockchain. #[derive(Clone, Debug)] -pub struct HyperlaneSqlDb { - mailbox_address: H256, - domain: HyperlaneDomain, - db: ScraperDb, +pub struct HyperlaneDbStore { + pub(crate) mailbox_address: H256, + pub(crate) domain: HyperlaneDomain, + pub(crate) db: ScraperDb, provider: Arc, cursor: Arc, } #[allow(unused)] -impl HyperlaneSqlDb { +impl HyperlaneDbStore { pub async fn new( db: ScraperDb, mailbox_address: H256, @@ -61,21 +57,11 @@ impl HyperlaneSqlDb { }) } - pub fn domain(&self) -> &HyperlaneDomain { - &self.domain - } - - pub async fn last_message_nonce(&self) -> Result> { - self.db - .last_message_nonce(self.domain.id(), &self.mailbox_address) - .await - } - /// Takes a list of txn and block hashes and ensure they are all in the /// database. If any are not it will fetch the data and insert them. /// /// Returns the relevant transaction info. - async fn ensure_blocks_and_txns( + pub(crate) async fn ensure_blocks_and_txns( &self, log_meta: impl Iterator, ) -> Result> { @@ -262,7 +248,7 @@ impl HyperlaneSqlDb { self.db .store_blocks( - self.domain().id(), + self.domain.id(), blocks_to_insert .iter_mut() .map(|(_, info)| info.take().unwrap()), @@ -293,129 +279,9 @@ impl HyperlaneSqlDb { } #[async_trait] -impl HyperlaneLogStore for HyperlaneSqlDb { - /// Store dispatched messages from the origin mailbox into the database. - /// We store only messages from blocks and transaction which we could successfully insert - /// into database. - async fn store_logs(&self, messages: &[(Indexed, LogMeta)]) -> Result { - if messages.is_empty() { - return Ok(0); - } - let txns: HashMap = self - .ensure_blocks_and_txns(messages.iter().map(|r| &r.1)) - .await? - .map(|t| (t.hash, t)) - .collect(); - let storable = messages - .iter() - .filter_map(|(message, meta)| { - txns.get(&meta.transaction_id) - .map(|t| (message.inner().clone(), meta, t.id)) - }) - .map(|(msg, meta, txn_id)| StorableMessage { msg, meta, txn_id }); - let stored = self - .db - .store_dispatched_messages(self.domain().id(), &self.mailbox_address, storable) - .await?; - Ok(stored as u32) - } -} - -#[async_trait] -impl HyperlaneLogStore for HyperlaneSqlDb { - /// Store delivered message ids from the destination mailbox into the database. - /// We store only delivered messages ids from blocks and transaction which we could successfully - /// insert into database. - async fn store_logs(&self, deliveries: &[(Indexed, LogMeta)]) -> Result { - if deliveries.is_empty() { - return Ok(0); - } - let txns: HashMap = self - .ensure_blocks_and_txns(deliveries.iter().map(|r| &r.1)) - .await? - .map(|t| (t.hash, t)) - .collect(); - let storable = deliveries - .iter() - .filter_map(|(message_id, meta)| { - txns.get(&meta.transaction_id) - .map(|txn| (*message_id.inner(), meta, txn.id)) - }) - .map(|(message_id, meta, txn_id)| StorableDelivery { - message_id, - meta, - txn_id, - }); - - let stored = self - .db - .store_deliveries(self.domain().id(), self.mailbox_address, storable) - .await?; - Ok(stored as u32) - } -} - -#[async_trait] -impl HyperlaneLogStore for HyperlaneSqlDb { - /// Store interchain gas payments into the database. - /// We store only interchain gas payments from blocks and transaction which we could - /// successfully insert into database. - async fn store_logs( - &self, - payments: &[(Indexed, LogMeta)], - ) -> Result { - if payments.is_empty() { - return Ok(0); - } - let txns: HashMap = self - .ensure_blocks_and_txns(payments.iter().map(|r| &r.1)) - .await? - .map(|t| (t.hash, t)) - .collect(); - let storable = payments - .iter() - .filter_map(|(payment, meta)| { - txns.get(&meta.transaction_id) - .map(|txn| (payment.inner(), meta, txn.id)) - }) - .map(|(payment, meta, txn_id)| StorablePayment { - payment, - meta, - txn_id, - }); - - let stored = self.db.store_payments(self.domain().id(), storable).await?; - Ok(stored as u32) - } -} - -#[async_trait] -impl HyperlaneSequenceAwareIndexerStoreReader for HyperlaneSqlDb { - /// Gets a message by its nonce. - async fn retrieve_by_sequence(&self, sequence: u32) -> Result> { - let message = self - .db - .retrieve_message_by_nonce(self.domain().id(), &self.mailbox_address, sequence) - .await?; - Ok(message) - } - - /// Gets the block number at which the log occurred. - async fn retrieve_log_block_number_by_sequence(&self, sequence: u32) -> Result> { - let tx_id = unwrap_or_none_result!( - self.db - .retrieve_dispatched_tx_id(self.domain().id(), &self.mailbox_address, sequence) - .await? - ); - let block_id = unwrap_or_none_result!(self.db.retrieve_block_id(tx_id).await?); - Ok(self.db.retrieve_block_number(block_id).await?) - } -} - -#[async_trait] -impl HyperlaneWatermarkedLogStore for HyperlaneSqlDb +impl HyperlaneWatermarkedLogStore for HyperlaneDbStore where - HyperlaneSqlDb: HyperlaneLogStore, + HyperlaneDbStore: HyperlaneLogStore, { /// Gets the block number high watermark async fn retrieve_high_watermark(&self) -> Result> { @@ -429,9 +295,9 @@ where } #[derive(Debug, Clone)] -struct TxnWithId { - hash: H512, - id: i64, +pub(crate) struct TxnWithId { + pub hash: H512, + pub id: i64, } #[derive(Debug, Clone)] diff --git a/rust/main/agents/validator/src/validator.rs b/rust/main/agents/validator/src/validator.rs index 30830fe178..bd800941ec 100644 --- a/rust/main/agents/validator/src/validator.rs +++ b/rust/main/agents/validator/src/validator.rs @@ -170,6 +170,7 @@ impl SingleValidator { &metrics, &contract_sync_metrics, msg_db.clone().into(), + false, ) .await?; diff --git a/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs b/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs index a9141e7b7f..cec2b9b45f 100644 --- a/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs +++ b/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs @@ -334,6 +334,7 @@ where tx, self.provider.clone(), &self.conn.transaction_overrides.clone(), + &self.domain, ) .await } @@ -382,6 +383,7 @@ where call, provider: self.provider.clone(), transaction_overrides: self.conn.transaction_overrides.clone(), + domain: self.domain.clone(), } } } @@ -418,12 +420,18 @@ pub struct SubmittableBatch { pub call: ContractCall>, provider: Arc, transaction_overrides: TransactionOverrides, + domain: HyperlaneDomain, } impl SubmittableBatch { pub async fn submit(self) -> ChainResult { - let call_with_gas_overrides = - fill_tx_gas_params(self.call, self.provider, &self.transaction_overrides).await?; + let call_with_gas_overrides = fill_tx_gas_params( + self.call, + self.provider, + &self.transaction_overrides, + &self.domain, + ) + .await?; let outcome = report_tx(call_with_gas_overrides).await?; Ok(outcome.into()) } @@ -615,10 +623,10 @@ mod test { TxCostEstimate, H160, H256, U256, }; - use crate::{contracts::EthereumMailbox, ConnectionConf, RpcConnectionConf}; - - /// An amount of gas to add to the estimated gas - const GAS_ESTIMATE_BUFFER: u32 = 75_000; + use crate::{ + contracts::EthereumMailbox, tx::apply_gas_estimate_buffer, ConnectionConf, + RpcConnectionConf, + }; fn get_test_mailbox( domain: HyperlaneDomain, @@ -650,9 +658,9 @@ mod test { #[tokio::test] async fn test_process_estimate_costs_sets_l2_gas_limit_for_arbitrum() { + let domain = HyperlaneDomain::Known(KnownHyperlaneDomain::PlumeTestnet); // An Arbitrum Nitro chain - let (mailbox, mock_provider) = - get_test_mailbox(HyperlaneDomain::Known(KnownHyperlaneDomain::PlumeTestnet)); + let (mailbox, mock_provider) = get_test_mailbox(domain.clone()); let message = HyperlaneMessage::default(); let metadata: Vec = vec![]; @@ -696,8 +704,8 @@ mod test { .await .unwrap(); - // The TxCostEstimate's gas limit includes the buffer - let estimated_gas_limit = gas_limit.saturating_add(GAS_ESTIMATE_BUFFER.into()); + // The TxCostEstimate's gas limit includes a buffer + let estimated_gas_limit = apply_gas_estimate_buffer(gas_limit, &domain).unwrap(); assert_eq!( tx_cost_estimate, diff --git a/rust/main/chains/hyperlane-ethereum/src/contracts/validator_announce.rs b/rust/main/chains/hyperlane-ethereum/src/contracts/validator_announce.rs index 2da1078f90..f37c6edb85 100644 --- a/rust/main/chains/hyperlane-ethereum/src/contracts/validator_announce.rs +++ b/rust/main/chains/hyperlane-ethereum/src/contracts/validator_announce.rs @@ -92,7 +92,13 @@ where announcement.value.storage_location, serialized_signature.into(), ); - fill_tx_gas_params(tx, self.provider.clone(), &self.conn.transaction_overrides).await + fill_tx_gas_params( + tx, + self.provider.clone(), + &self.conn.transaction_overrides, + &self.domain, + ) + .await } } diff --git a/rust/main/chains/hyperlane-ethereum/src/tx.rs b/rust/main/chains/hyperlane-ethereum/src/tx.rs index 05cc4da44e..31975643b3 100644 --- a/rust/main/chains/hyperlane-ethereum/src/tx.rs +++ b/rust/main/chains/hyperlane-ethereum/src/tx.rs @@ -16,7 +16,8 @@ use ethers_core::{ }, }; use hyperlane_core::{ - utils::bytes_to_hex, ChainCommunicationError, ChainResult, ReorgPeriod, H256, U256, + utils::bytes_to_hex, ChainCommunicationError, ChainResult, HyperlaneDomain, ReorgPeriod, H256, + U256, }; use tracing::{debug, error, info, warn}; @@ -25,8 +26,26 @@ use crate::{EthereumReorgPeriod, Middleware, TransactionOverrides}; /// An amount of gas to add to the estimated gas pub const GAS_ESTIMATE_BUFFER: u32 = 75_000; -pub fn apply_gas_estimate_buffer(gas: U256) -> U256 { - gas.saturating_add(GAS_ESTIMATE_BUFFER.into()) +// A multiplier to apply to the estimated gas, i.e. 10%. +pub const GAS_ESTIMATE_MULTIPLIER_NUMERATOR: u32 = 11; +pub const GAS_ESTIMATE_MULTIPLIER_DENOMINATOR: u32 = 10; + +pub fn apply_gas_estimate_buffer(gas: U256, domain: &HyperlaneDomain) -> ChainResult { + // Arbitrum Nitro chains use 2d fees are are especially prone to costs increasing + // by the time the transaction lands on chain, requiring a higher gas limit. + // In this case, we apply a multiplier to the gas estimate. + let gas = if domain.is_arbitrum_nitro() { + gas.saturating_mul(GAS_ESTIMATE_MULTIPLIER_NUMERATOR.into()) + .checked_div(GAS_ESTIMATE_MULTIPLIER_DENOMINATOR.into()) + .ok_or_else(|| { + ChainCommunicationError::from_other_str("Gas estimate buffer divide by zero") + })? + } else { + gas + }; + + // Always add a flat buffer + Ok(gas.saturating_add(GAS_ESTIMATE_BUFFER.into())) } const PENDING_TRANSACTION_POLLING_INTERVAL: Duration = Duration::from_secs(2); @@ -92,17 +111,19 @@ pub(crate) async fn fill_tx_gas_params( tx: ContractCall, provider: Arc, transaction_overrides: &TransactionOverrides, + domain: &HyperlaneDomain, ) -> ChainResult> where M: Middleware + 'static, D: Detokenize, { // either use the pre-estimated gas limit or estimate it - let estimated_gas_limit: U256 = match tx.tx.gas() { + let mut estimated_gas_limit: U256 = match tx.tx.gas() { Some(&estimate) => estimate.into(), None => tx.estimate_gas().await?.into(), }; - let estimated_gas_limit = apply_gas_estimate_buffer(estimated_gas_limit); + + estimated_gas_limit = apply_gas_estimate_buffer(estimated_gas_limit, domain)?; let gas_limit: U256 = if let Some(gas_limit) = transaction_overrides.gas_limit { estimated_gas_limit.max(gas_limit) } else { diff --git a/rust/main/chains/hyperlane-sealevel/Cargo.toml b/rust/main/chains/hyperlane-sealevel/Cargo.toml index 3a1bda12ff..666ebee877 100644 --- a/rust/main/chains/hyperlane-sealevel/Cargo.toml +++ b/rust/main/chains/hyperlane-sealevel/Cargo.toml @@ -11,6 +11,7 @@ bincode.workspace = true borsh.workspace = true derive-new.workspace = true jsonrpc-core.workspace = true +lazy_static.workspace = true num-traits.workspace = true reqwest.workspace = true serde.workspace = true diff --git a/rust/main/chains/hyperlane-sealevel/src/error.rs b/rust/main/chains/hyperlane-sealevel/src/error.rs index 569c5cff5a..cb93061580 100644 --- a/rust/main/chains/hyperlane-sealevel/src/error.rs +++ b/rust/main/chains/hyperlane-sealevel/src/error.rs @@ -42,6 +42,12 @@ pub enum HyperlaneSealevelError { /// Empty compute units consumed #[error("received empty compute units consumed in transaction")] EmptyComputeUnitsConsumed, + /// Too many non-native programs + #[error("transaction contains too many non-native programs, hash: {0:?}")] + TooManyNonNativePrograms(H512), + /// No non-native programs + #[error("transaction contains no non-native programs, hash: {0:?}")] + NoNonNativePrograms(H512), } impl From for ChainCommunicationError { diff --git a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs index 3c2cbd1c16..4d5e819de3 100644 --- a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs +++ b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs @@ -6,16 +6,17 @@ use hyperlane_sealevel_igp::{ accounts::{GasPaymentAccount, ProgramDataAccount}, igp_gas_payment_pda_seeds, igp_program_data_pda_seeds, }; -use solana_sdk::{account::Account, pubkey::Pubkey}; +use solana_sdk::{account::Account, clock::Slot, pubkey::Pubkey}; use tracing::{info, instrument}; use hyperlane_core::{ config::StrOrIntParseError, ChainCommunicationError, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexed, Indexer, - InterchainGasPaymaster, InterchainGasPayment, LogMeta, SequenceAwareIndexer, H256, H512, + InterchainGasPaymaster, InterchainGasPayment, LogMeta, SequenceAwareIndexer, H256, H512, U256, }; use crate::account::{search_accounts_by_discriminator, search_and_validate_account}; +use crate::log_meta_composer::{is_interchain_payment_instruction, LogMetaComposer}; use crate::{ConnectionConf, SealevelProvider, SealevelRpcClient}; /// The offset to get the `unique_gas_payment_pubkey` field from the serialized GasPaymentData. @@ -90,6 +91,8 @@ impl InterchainGasPaymaster for SealevelInterchainGasPaymaster {} pub struct SealevelInterchainGasPaymasterIndexer { rpc_client: SealevelRpcClient, igp: SealevelInterchainGasPaymaster, + log_meta_composer: LogMetaComposer, + advanced_log_meta: bool, } /// IGP payment data on Sealevel @@ -105,12 +108,25 @@ impl SealevelInterchainGasPaymasterIndexer { pub async fn new( conf: &ConnectionConf, igp_account_locator: ContractLocator<'_>, + advanced_log_meta: bool, ) -> ChainResult { // Set the `processed` commitment at rpc level let rpc_client = SealevelRpcClient::new(conf.url.to_string()); let igp = SealevelInterchainGasPaymaster::new(conf, &igp_account_locator).await?; - Ok(Self { rpc_client, igp }) + + let log_meta_composer = LogMetaComposer::new( + igp.program_id, + "interchain gas payment".to_owned(), + is_interchain_payment_instruction, + ); + + Ok(Self { + rpc_client, + igp, + log_meta_composer, + advanced_log_meta, + }) } #[instrument(err, skip(self))] @@ -155,12 +171,14 @@ impl SealevelInterchainGasPaymasterIndexer { gas_amount: gas_payment_account.gas_amount.into(), }; - Ok(SealevelGasPayment::new( - Indexed::new(igp_payment).with_sequence( - sequence_number - .try_into() - .map_err(StrOrIntParseError::from)?, - ), + let log_meta = if self.advanced_log_meta { + self.interchain_payment_log_meta( + U256::from(sequence_number), + &valid_payment_pda_pubkey, + &gas_payment_account.slot, + ) + .await? + } else { LogMeta { address: self.igp.program_id.to_bytes().into(), block_number: gas_payment_account.slot, @@ -170,7 +188,16 @@ impl SealevelInterchainGasPaymasterIndexer { transaction_id: H512::zero(), transaction_index: 0, log_index: sequence_number.into(), - }, + } + }; + + Ok(SealevelGasPayment::new( + Indexed::new(igp_payment).with_sequence( + sequence_number + .try_into() + .map_err(StrOrIntParseError::from)?, + ), + log_meta, H256::from(gas_payment_account.igp.to_bytes()), )) } @@ -188,6 +215,19 @@ impl SealevelInterchainGasPaymasterIndexer { })?; Ok(expected_pubkey) } + + async fn interchain_payment_log_meta( + &self, + log_index: U256, + payment_pda_pubkey: &Pubkey, + payment_pda_slot: &Slot, + ) -> ChainResult { + let block = self.rpc_client.get_block(*payment_pda_slot).await?; + + self.log_meta_composer + .log_meta(block, log_index, payment_pda_pubkey, payment_pda_slot) + .map_err(Into::::into) + } } #[async_trait] @@ -221,7 +261,10 @@ impl Indexer for SealevelInterchainGasPaymasterIndexer { #[instrument(level = "debug", err, ret, skip(self))] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn get_finalized_block_number(&self) -> ChainResult { - self.rpc_client.get_block_height().await + // we should not report block height since SequenceAwareIndexer uses block slot in + // `latest_sequence_count_and_tip` and we should not report block slot here + // since block slot cannot be used as watermark + unimplemented!() } } @@ -241,7 +284,7 @@ impl SequenceAwareIndexer for SealevelInterchainGasPaymast .payment_count .try_into() .map_err(StrOrIntParseError::from)?; - let tip = self.rpc_client.get_block_height().await?; + let tip = self.igp.provider.rpc().get_slot().await?; Ok((Some(payment_count), tip)) } } diff --git a/rust/main/chains/hyperlane-sealevel/src/lib.rs b/rust/main/chains/hyperlane-sealevel/src/lib.rs index 941c64a7bd..90a2e01b66 100644 --- a/rust/main/chains/hyperlane-sealevel/src/lib.rs +++ b/rust/main/chains/hyperlane-sealevel/src/lib.rs @@ -19,12 +19,12 @@ mod account; mod error; mod interchain_gas; mod interchain_security_module; +mod log_meta_composer; mod mailbox; mod merkle_tree_hook; mod multisig_ism; mod provider; mod rpc; mod trait_builder; -mod transaction; 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 new file mode 100644 index 0000000000..f530b04e0f --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs @@ -0,0 +1,292 @@ +use std::collections::HashMap; + +use solana_sdk::{clock::Slot, pubkey::Pubkey}; +use solana_transaction_status::{ + option_serializer::OptionSerializer, EncodedTransaction, EncodedTransactionWithStatusMeta, + UiCompiledInstruction, UiConfirmedBlock, UiInstruction, UiMessage, UiTransaction, + UiTransactionStatusMeta, +}; +use tracing::warn; + +use hyperlane_core::{LogMeta, H512, U256}; + +use crate::error::HyperlaneSealevelError; +use crate::utils::{decode_h256, decode_h512, from_base58}; + +#[derive(Debug)] +pub struct LogMetaComposer { + program_id: Pubkey, + transaction_description: String, + is_specified_instruction: fn(&[u8]) -> bool, +} + +impl LogMetaComposer { + pub fn new( + program_id: Pubkey, + transaction_description: String, + is_specified_instruction: fn(&[u8]) -> bool, + ) -> Self { + Self { + program_id, + transaction_description, + is_specified_instruction, + } + } + + pub fn log_meta( + &self, + block: UiConfirmedBlock, + log_index: U256, + pda_pubkey: &Pubkey, + pda_slot: &Slot, + ) -> Result { + let block_hash = decode_h256(&block.blockhash)?; + + let transactions = block + .transactions + .ok_or(HyperlaneSealevelError::NoTransactions(format!( + "block which should contain {} transaction does not contain any transaction", + self.transaction_description, + )))?; + + let transaction_hashes = search_transactions( + transactions, + &self.program_id, + pda_pubkey, + self.is_specified_instruction, + ); + + // We expect to see that there is only one transaction + if transaction_hashes.len() > 1 { + Err(HyperlaneSealevelError::TooManyTransactions(format!( + "block contains more than one {} transactions operating on the same PDA", + self.transaction_description, + )))? + } + + let (transaction_index, transaction_hash) = + transaction_hashes + .into_iter() + .next() + .ok_or(HyperlaneSealevelError::NoTransactions(format!( + "block which should contain {} transaction does not contain any after filtering", + self.transaction_description, + )))?; + + let log_meta = LogMeta { + address: self.program_id.to_bytes().into(), + block_number: *pda_slot, + block_hash, + transaction_id: transaction_hash, + transaction_index: transaction_index as u64, + log_index, + }; + + Ok(log_meta) + } +} + +pub fn is_message_dispatch_instruction(instruction_data: &[u8]) -> bool { + use hyperlane_sealevel_mailbox::instruction::Instruction; + + let instruction = match Instruction::from_instruction_data(instruction_data) { + Ok(ii) => ii, + Err(_) => return false, + }; + + matches!(instruction, Instruction::OutboxDispatch(_)) +} + +pub fn is_message_delivery_instruction(instruction_data: &[u8]) -> bool { + use hyperlane_sealevel_mailbox::instruction::Instruction; + + let instruction = match Instruction::from_instruction_data(instruction_data) { + Ok(ii) => ii, + Err(_) => return false, + }; + + matches!(instruction, Instruction::InboxProcess(_)) +} + +pub fn is_interchain_payment_instruction(instruction_data: &[u8]) -> bool { + use hyperlane_sealevel_igp::instruction::Instruction; + + let instruction = match Instruction::from_instruction_data(instruction_data) { + Ok(ii) => ii, + Err(_) => return false, + }; + + matches!(instruction, Instruction::PayForGas(_)) +} + +/// This function searches for relevant transactions in the vector of provided transactions and +/// returns the relative index and hashes of such transactions. +/// +/// This function takes a program identifier and the identifier for PDA and searches transactions +/// which act upon this program and the PDA. +/// +/// When the vector of transaction contains all the transactions from a block and in the order +/// in which these transaction appear in the block, the function returns indexes of the relevant +/// transaction in the block. +/// +/// The transaction will be searched with the following criteria: +/// 1. Transaction contains program id in the list of accounts. +/// 2. Transaction contains the given PDA in the list of accounts. +/// 3. Transaction is executing the program upon the PDA with the specified instruction. +/// +/// * `transactions` - List of transactions +/// * `program_id` - Identifier of program for which we are searching transactions for. +/// * `pda_pubkey` - Identifier for PDA the relevant transaction should operate upon. +/// * `is_specified_instruction` - Function which returns `true` for instruction which should be +/// included into the relevant transaction. +fn search_transactions( + transactions: Vec, + program_id: &Pubkey, + pda_pubkey: &Pubkey, + is_specified_instruction: fn(&[u8]) -> bool, +) -> Vec<(usize, H512)> { + transactions + .into_iter() + .enumerate() + .filter_map(|(index, tx)| filter_by_encoding(tx).map(|(tx, meta)| (index, tx, meta))) + .filter_map(|(index, tx, meta)| { + filter_by_validity(tx, meta) + .map(|(hash, account_keys, instructions)| (index, hash, account_keys, instructions)) + }) + .filter_map(|(index, hash, account_keys, instructions)| { + filter_by_relevancy( + program_id, + pda_pubkey, + hash, + account_keys, + instructions, + is_specified_instruction, + ) + .map(|hash| (index, hash)) + }) + .collect::>() +} + +fn filter_by_relevancy( + program_id: &Pubkey, + message_storage_pda_pubkey: &Pubkey, + hash: H512, + account_keys: Vec, + instructions: Vec, + is_specified_instruction: fn(&[u8]) -> bool, +) -> Option { + let account_index_map = account_index_map(account_keys); + + let program_id_str = program_id.to_string(); + let program_index = match account_index_map.get(&program_id_str) { + Some(i) => *i as u8, + None => return None, // If account keys do not contain program, transaction is not relevant + }; + + let pda_pubkey_str = message_storage_pda_pubkey.to_string(); + let pda_account_index = match account_index_map.get(&pda_pubkey_str) { + Some(i) => *i as u8, + None => return None, // If account keys do not contain the given PDA account, transaction is not relevant + }; + + let program_maybe = instructions + .into_iter() + .find(|instruction| instruction.program_id_index == program_index); + + let program = match program_maybe { + Some(p) => p, + None => return None, // If transaction does not contain call into program, transaction is not relevant + }; + + // If program does not operate on the given PDA account, transaction is not relevant + if !program.accounts.contains(&pda_account_index) { + return None; + } + + let instruction_data = match from_base58(&program.data) { + Ok(d) => d, + Err(_) => return None, // If we cannot decode instruction data, transaction is not relevant + }; + + // If the call into program is not the specified instruction, transaction is not relevant + if !is_specified_instruction(&instruction_data) { + return None; + } + + Some(hash) +} + +fn filter_by_validity( + tx: UiTransaction, + meta: UiTransactionStatusMeta, +) -> Option<(H512, Vec, Vec)> { + let Some(transaction_hash) = tx + .signatures + .first() + .map(|signature| decode_h512(signature)) + .and_then(|r| r.ok()) + else { + warn!( + transaction = ?tx, + "transaction does not have any signatures or signatures cannot be decoded", + ); + return None; + }; + + let UiMessage::Raw(message) = tx.message else { + warn!(message = ?tx.message, "we expect messages in Raw format"); + return None; + }; + + let instructions = instructions(message.instructions, meta); + + Some((transaction_hash, message.account_keys, instructions)) +} + +fn filter_by_encoding( + tx: EncodedTransactionWithStatusMeta, +) -> Option<(UiTransaction, UiTransactionStatusMeta)> { + match (tx.transaction, tx.meta) { + // We support only transactions encoded as JSON + // We need none-empty metadata as well + (EncodedTransaction::Json(t), Some(m)) => Some((t, m)), + t => { + warn!( + ?t, + "transaction is not encoded as json or metadata is empty" + ); + None + } + } +} + +fn account_index_map(account_keys: Vec) -> HashMap { + account_keys + .into_iter() + .enumerate() + .map(|(index, key)| (key, index)) + .collect::>() +} + +/// Extract all instructions from transaction +fn instructions( + instruction: Vec, + meta: UiTransactionStatusMeta, +) -> Vec { + let inner_instructions = match meta.inner_instructions { + OptionSerializer::Some(ii) => ii + .into_iter() + .flat_map(|ii| ii.instructions) + .flat_map(|ii| match ii { + UiInstruction::Compiled(ci) => Some(ci), + _ => None, + }) + .collect::>(), + OptionSerializer::None | OptionSerializer::Skip => vec![], + }; + + [instruction, inner_instructions].concat() +} + +#[cfg(test)] +mod tests; diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_txn.json b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_txn.json new file mode 100644 index 0000000000..a778e63546 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_txn.json @@ -0,0 +1,187 @@ +{ + "blockTime": 1726514134, + "meta": { + "computeUnitsConsumed": 200654, + "err": null, + "fee": 5000, + "innerInstructions": [ + { + "index": 1, + "instructions": [ + { + "accounts": [ + 10 + ], + "data": "8YGwT5LUTP4", + "programIdIndex": 9, + "stackHeight": 2 + }, + { + "accounts": [ + 12 + ], + "data": "2848tnNKZjKzgKikguTY4s5nESn7KLYUbLsrp6Z1FYq4BmM31xRwBXnJU5RW9rEvRUjJfJa58kXdgQYEQpg4sDrRfx5HnGsgXfitkxJw5NKVcFAYLSqKvpkYxer2tAn3a8ZzPvuDD9iqyLkvJnRZ3TbcoAHNisFfvBeWK95YL8zxsyzDS9ZBMaoYrLKQx9b915xj9oijw2UNk7FF5qxThZDKwF8rwckb6t2o6ypzFEqYeQCsRW5quayYsLBjHi8RdY18NDkcnPVkQbdR7FmfrncV4H5ZYZaayMtgAs6kHxRgeuuBEtrYG1UbGjWTQAss9zmeXcKipqS3S2bee96U5w9Cd981e8dkakCtKR7KusjE9nhsFTfXoxcwkRhi3TzqDicrqt7Erf78K", + "programIdIndex": 8, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 3 + ], + "data": "11117UpxCJ2YqmddN2ykgdMGRXkyPgnqEtj5XYrnk1iC4P1xrvXq2zvZQkj3uNaitHEw2k", + "programIdIndex": 5, + "stackHeight": 2 + }, + { + "accounts": [ + 11, + 5, + 10, + 1, + 5, + 2 + ], + "data": "7MHiQP8ahsZcB5cM9ZXGa2foMYQENm7GnrFaV4AmfgKNzSndaXhrcqbVNRgN2kGmrrsfTi8bNEGkAJn6MWjY95PnakaF2HAchXrUUBzQrWKQdRp8VbKjDsnH1tEUiAWm439Y12TpWTW3uSphh1oycpTJP", + "programIdIndex": 9, + "stackHeight": 2 + }, + { + "accounts": [ + 2, + 1 + ], + "data": "3Bxs4ThwQbE4vyj5", + "programIdIndex": 5, + "stackHeight": 3 + } + ] + } + ], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi invoke [1]", + "Program 4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg invoke [2]", + "Program 4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg consumed 4402 of 1363482 compute units", + "Program return: 4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg AA==", + "Program 4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg success", + "Program 372D5YP7jMYUgYBXTVJ7BZtzKv1mq1J6wvjSFLNTRreC invoke [2]", + "Program 372D5YP7jMYUgYBXTVJ7BZtzKv1mq1J6wvjSFLNTRreC consumed 106563 of 1353660 compute units", + "Program 372D5YP7jMYUgYBXTVJ7BZtzKv1mq1J6wvjSFLNTRreC success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program 4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg invoke [2]", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Warp route transfer completed from origin: 1408864445, recipient: 528MctBmY7rXqufM3r8k7t9DTfVNuB4K1rr8xVU4naJM, remote_amount: 100000", + "Program 4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg consumed 28117 of 1240216 compute units", + "Program 4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg success", + "Program log: Hyperlane inbox processed message 0x34ed0705362554568a1a2d24aef6bfde71894dd1bb2f0457fb4bd66016074fcc", + "Program E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi consumed 200504 of 1399850 compute units", + "Program E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi success" + ], + "postBalances": [ + 338367600, + 199691000, + 891880, + 1287600, + 1211040, + 1, + 1, + 1141440, + 1141440, + 1141440, + 2686560, + 0, + 8017920, + 1141440 + ], + "postTokenBalances": [], + "preBalances": [ + 339660200, + 199591000, + 991880, + 0, + 1211040, + 1, + 1, + 1141440, + 1141440, + 1141440, + 2686560, + 0, + 8017920, + 1141440 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "slot": 290198208, + "transaction": { + "message": { + "accountKeys": [ + "G5FM3UKwcBJ47PwLWLLY1RQpqNtTMgnqnd6nZGcJqaBp", + "528MctBmY7rXqufM3r8k7t9DTfVNuB4K1rr8xVU4naJM", + "5H4cmX5ybSqK6Ro6nvr9eiR8G8ATTYRwVsZ42VRRW3wa", + "Dj7jk47KKXvw4nseNGdyHtNHtjPes2XSfByhF8xymrtS", + "H3EgdESu59M4hn5wrbeyi9VjmFiLYM7iUAbGtrA5uHNE", + "11111111111111111111111111111111", + "ComputeBudget111111111111111111111111111111", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "372D5YP7jMYUgYBXTVJ7BZtzKv1mq1J6wvjSFLNTRreC", + "4UMNyNWW75zo69hxoJaRX5iXNUa5FdRPZZa9vDVCiESg", + "A2nmLy86tmraneRMEZ5yWbDGq6YsPKNcESGaTZKkRWZU", + "DmU32nL975xAshVYgLLdyMoaUzHa2aCzHJyfLyKRdz3M", + "E2jimXLCtTiuZ6jbXP8B7SyZ5vVc1PKYYnMeho9yJ1en", + "E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 9, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "K1FDJ7", + "programIdIndex": 6, + "stackHeight": null + }, + { + "accounts": [ + 0, + 5, + 4, + 11, + 3, + 10, + 7, + 8, + 12, + 9, + 5, + 10, + 1, + 5, + 2 + ], + "data": "3RwSrioTudpACxczi2EejzKoZCPVuzq6qWLCQYAWoZoTcRPBobUn7tB5SFvMPNHGJ551rmjXDyKdaQLuzX3d5bjHSrSsquwHqWgM6L2kMEEJZjtygNyx3RhJD9GyZqekDuK19cfYfn1dyLuo7SSqswV3t6yptLhnCv8DhxBLRuXhV2GdNy9PLU3VNc9PvPWxg1Grtr9UZ5GnmdKDeqRvonM9AqmuN6mnv3UaqjjAEX8yDKPhWHm6w1HRzfgbjkXQVL5aSqdgJeF3EVBKJCzvMKbUVjTRgD6iHQyUVrSYvrHpKZxc6EctBHN6tyeZrW5RD1M6giasnm4WqrjDwUyz9xwvk31srJrZp7W7D6i2tTajmBbiKjpNo75iaHj4dycf1H", + "programIdIndex": 13, + "stackHeight": null + } + ], + "recentBlockhash": "AzQN8x5uKk7ExXW4eUu2FiqRG1BX73uvfHcQeBDHcu8a" + }, + "signatures": [ + "5pBEVfDD3siir1CBf9taeWuee44GspA7EixYkKnzN1hkeYXLxtKYrbe3aE6hxswbY3hhDRVPDor1ZsSXUorC7bcR" + ] + } +} \ No newline at end of file diff --git a/rust/main/chains/hyperlane-sealevel/src/transaction/tests.rs b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_txn.json similarity index 91% rename from rust/main/chains/hyperlane-sealevel/src/transaction/tests.rs rename to rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_txn.json index 759f15de97..59b411eb59 100644 --- a/rust/main/chains/hyperlane-sealevel/src/transaction/tests.rs +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_txn.json @@ -1,29 +1,3 @@ -use solana_transaction_status::EncodedTransactionWithStatusMeta; - -use crate::transaction::search_dispatched_message_transactions; -use crate::utils::decode_pubkey; - -#[test] -pub fn test_search_dispatched_message_transaction() { - // given - let mailbox_program_id = decode_pubkey("E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi").unwrap(); - let dispatched_message_pda_account = - decode_pubkey("6eG8PheL41qLFFUtPjSYMtsp4aoAQsMgcsYwkGCB8kwT").unwrap(); - let transaction = serde_json::from_str::(JSON).unwrap(); - let transactions = vec![transaction]; - - // when - let transaction_hashes = search_dispatched_message_transactions( - &mailbox_program_id, - &dispatched_message_pda_account, - transactions, - ); - - // then - assert!(!transaction_hashes.is_empty()); -} - -const JSON: &str = r#" { "blockTime": 1729865514, "meta": { @@ -325,5 +299,4 @@ const JSON: &str = r#" "hXjvQbAuFH9vAxZMdGqfnSjN7t7Z7NLTzRq1SG8i6fLr9LS6XahTduPWqakiTsLDyWSofvq3MSncUAkbQLEj85f" ] } -} -"#; +} \ 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 new file mode 100644 index 0000000000..d1097b1b08 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs @@ -0,0 +1,83 @@ +use std::fs; +use std::path::PathBuf; + +use solana_transaction_status::EncodedTransactionWithStatusMeta; + +use crate::log_meta_composer::{ + is_interchain_payment_instruction, is_message_delivery_instruction, + is_message_dispatch_instruction, search_transactions, +}; +use crate::utils::decode_pubkey; + +#[test] +pub fn test_search_dispatched_message_transaction() { + // given + let mailbox_program_id = decode_pubkey("E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi").unwrap(); + let dispatched_message_pda_account = + decode_pubkey("6eG8PheL41qLFFUtPjSYMtsp4aoAQsMgcsYwkGCB8kwT").unwrap(); + let transactions = transactions(&read_json("dispatch_message_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 + let mailbox_program_id = decode_pubkey("E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi").unwrap(); + let delivered_message_pda_account = + decode_pubkey("Dj7jk47KKXvw4nseNGdyHtNHtjPes2XSfByhF8xymrtS").unwrap(); + let transactions = transactions(&read_json("delivery_message_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 + let interchain_payment_program_id = + decode_pubkey("BhNcatUDC2D5JTyeaqrdSukiVFsEHK7e3hVmKMztwefv").unwrap(); + let payment_pda_account = + decode_pubkey("9yMwrDqHsbmmvYPS9h4MLPbe2biEykcL51W7qJSDL5hF").unwrap(); + let transactions = transactions(&read_json("dispatch_message_txn.json")); + + // when + let transaction_hashes = search_transactions( + transactions, + &interchain_payment_program_id, + &payment_pda_account, + is_interchain_payment_instruction, + ); + + // then + assert!(!transaction_hashes.is_empty()); +} + +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"); + fs::read_to_string(absolute).expect("should have been able to read the file") +} + +fn transactions(json: &str) -> Vec { + let transaction = serde_json::from_str::(json).unwrap(); + let transactions = vec![transaction]; + transactions +} diff --git a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs index 45e4461279..cc88da72f0 100644 --- a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs +++ b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs @@ -33,6 +33,7 @@ use solana_client::{ use solana_sdk::{ account::Account, bs58, + clock::Slot, commitment_config::CommitmentConfig, compute_budget::ComputeBudgetInstruction, hash::Hash, @@ -45,8 +46,9 @@ use solana_sdk::{ }; use solana_transaction_status::{ EncodedConfirmedBlock, EncodedTransaction, EncodedTransactionWithStatusMeta, TransactionStatus, - UiCompiledInstruction, UiInnerInstructions, UiInstruction, UiMessage, UiParsedInstruction, - UiReturnDataEncoding, UiTransaction, UiTransactionReturnData, UiTransactionStatusMeta, + UiCompiledInstruction, UiConfirmedBlock, UiInnerInstructions, UiInstruction, UiMessage, + UiParsedInstruction, UiReturnDataEncoding, UiTransaction, UiTransactionReturnData, + UiTransactionStatusMeta, }; use tracing::{debug, info, instrument, warn}; @@ -61,7 +63,10 @@ use hyperlane_core::{ use crate::account::{search_accounts_by_discriminator, search_and_validate_account}; use crate::error::HyperlaneSealevelError; -use crate::transaction::search_dispatched_message_transactions; +use crate::log_meta_composer::{ + is_interchain_payment_instruction, is_message_delivery_instruction, + is_message_dispatch_instruction, LogMetaComposer, +}; use crate::utils::{decode_h256, decode_h512, from_base58}; use crate::{ConnectionConf, SealevelProvider, SealevelRpcClient}; @@ -641,15 +646,38 @@ impl Mailbox for SealevelMailbox { pub struct SealevelMailboxIndexer { mailbox: SealevelMailbox, program_id: Pubkey, + dispatch_message_log_meta_composer: LogMetaComposer, + delivery_message_log_meta_composer: LogMetaComposer, + advanced_log_meta: bool, } impl SealevelMailboxIndexer { - pub fn new(conf: &ConnectionConf, locator: ContractLocator) -> ChainResult { + pub fn new( + conf: &ConnectionConf, + locator: ContractLocator, + advanced_log_meta: bool, + ) -> ChainResult { let program_id = Pubkey::from(<[u8; 32]>::from(locator.address)); let mailbox = SealevelMailbox::new(conf, locator, None)?; + + let dispatch_message_log_meta_composer = LogMetaComposer::new( + mailbox.program_id, + "message dispatch".to_owned(), + is_message_dispatch_instruction, + ); + + let delivery_message_log_meta_composer = LogMetaComposer::new( + mailbox.program_id, + "message delivery".to_owned(), + is_message_delivery_instruction, + ); + Ok(Self { program_id, mailbox, + dispatch_message_log_meta_composer, + delivery_message_log_meta_composer, + advanced_log_meta, }) } @@ -657,10 +685,6 @@ impl SealevelMailboxIndexer { &self.mailbox.rpc() } - async fn get_finalized_block_number(&self) -> ChainResult { - self.rpc().get_block_height().await - } - async fn get_dispatched_message_with_nonce( &self, nonce: u32, @@ -694,44 +718,27 @@ impl SealevelMailboxIndexer { let hyperlane_message = HyperlaneMessage::read_from(&mut &dispatched_message_account.encoded_message[..])?; - let block = self - .mailbox - .provider - .rpc() - .get_block(dispatched_message_account.slot) - .await?; - let block_hash = decode_h256(&block.blockhash)?; - - let transactions = - block.transactions.ok_or(HyperlaneSealevelError::NoTransactions("block which should contain message dispatch transaction does not contain any transaction".to_owned()))?; - - let transaction_hashes = search_dispatched_message_transactions( - &self.mailbox.program_id, - &valid_message_storage_pda_pubkey, - transactions, - ); - - // We expect to see that there is only one message dispatch transaction - if transaction_hashes.len() > 1 { - Err(HyperlaneSealevelError::TooManyTransactions("Block contains more than one dispatch message transaction operating on the same dispatch message store PDA".to_owned()))? - } - - let (transaction_index, transaction_hash) = transaction_hashes - .into_iter() - .next() - .ok_or(HyperlaneSealevelError::NoTransactions("block which should contain message dispatch transaction does not contain any after filtering".to_owned()))?; - - Ok(( - hyperlane_message.into(), + let log_meta = if self.advanced_log_meta { + self.dispatch_message_log_meta( + U256::from(nonce), + &valid_message_storage_pda_pubkey, + &dispatched_message_account.slot, + ) + .await? + } else { LogMeta { - address: self.mailbox.program_id.to_bytes().into(), + address: self.program_id.to_bytes().into(), block_number: dispatched_message_account.slot, - block_hash, - transaction_id: transaction_hash, - transaction_index: transaction_index as u64, - log_index: U256::from(nonce), - }, - )) + // TODO: get these when building out scraper support. + // It's inconvenient to get these :| + block_hash: H256::zero(), + transaction_id: H512::zero(), + transaction_index: 0, + log_index: U256::zero(), + } + }; + + Ok((hyperlane_message.into(), log_meta)) } fn dispatched_message_account(&self, account: &Account) -> ChainResult { @@ -748,6 +755,29 @@ impl SealevelMailboxIndexer { Ok(expected_pubkey) } + async fn dispatch_message_log_meta( + &self, + log_index: U256, + message_storage_pda_pubkey: &Pubkey, + message_account_slot: &Slot, + ) -> ChainResult { + let block = self + .mailbox + .provider + .rpc() + .get_block(*message_account_slot) + .await?; + + self.dispatch_message_log_meta_composer + .log_meta( + block, + log_index, + message_storage_pda_pubkey, + message_account_slot, + ) + .map_err(Into::::into) + } + async fn get_delivered_message_with_nonce( &self, nonce: u32, @@ -782,10 +812,16 @@ impl SealevelMailboxIndexer { .into_inner(); let message_id = delivered_message_account.message_id; - Ok(( - message_id.into(), + let log_meta = if self.advanced_log_meta { + self.delivered_message_log_meta( + U256::from(nonce), + &valid_message_storage_pda_pubkey, + &delivered_message_account.slot, + ) + .await? + } else { LogMeta { - address: self.mailbox.program_id.to_bytes().into(), + address: self.program_id.to_bytes().into(), block_number: delivered_message_account.slot, // TODO: get these when building out scraper support. // It's inconvenient to get these :| @@ -793,8 +829,10 @@ impl SealevelMailboxIndexer { transaction_id: H512::zero(), transaction_index: 0, log_index: U256::zero(), - }, - )) + } + }; + + Ok((message_id.into(), log_meta)) } fn delivered_message_account(&self, account: &Account) -> ChainResult { @@ -808,16 +846,28 @@ impl SealevelMailboxIndexer { })?; Ok(expected_pubkey) } -} -#[async_trait] -impl SequenceAwareIndexer for SealevelMailboxIndexer { - #[instrument(err, skip(self))] - async fn latest_sequence_count_and_tip(&self) -> ChainResult<(Option, u32)> { - let tip = Indexer::::get_finalized_block_number(self).await?; - // TODO: need to make sure the call and tip are at the same height? - let count = Mailbox::count(&self.mailbox, &ReorgPeriod::None).await?; - Ok((Some(count), tip)) + async fn delivered_message_log_meta( + &self, + log_index: U256, + message_storage_pda_pubkey: &Pubkey, + message_account_slot: &Slot, + ) -> ChainResult { + let block = self + .mailbox + .provider + .rpc() + .get_block(*message_account_slot) + .await?; + + self.delivery_message_log_meta_composer + .log_meta( + block, + log_index, + message_storage_pda_pubkey, + message_account_slot, + ) + .map_err(Into::::into) } } @@ -841,7 +891,21 @@ impl Indexer for SealevelMailboxIndexer { } async fn get_finalized_block_number(&self) -> ChainResult { - self.get_finalized_block_number().await + // we should not report block height since SequenceAwareIndexer uses block slot in + // `latest_sequence_count_and_tip` and we should not report block slot here + // since block slot cannot be used as watermark + unimplemented!() + } +} + +#[async_trait] +impl SequenceAwareIndexer for SealevelMailboxIndexer { + #[instrument(err, skip(self))] + async fn latest_sequence_count_and_tip(&self) -> ChainResult<(Option, u32)> { + let tip = self.mailbox.provider.rpc().get_slot().await?; + // TODO: need to make sure the call and tip are at the same height? + let count = Mailbox::count(&self.mailbox, &ReorgPeriod::None).await?; + Ok((Some(count), tip)) } } @@ -865,7 +929,10 @@ impl Indexer for SealevelMailboxIndexer { } async fn get_finalized_block_number(&self) -> ChainResult { - self.get_finalized_block_number().await + // we should not report block height since SequenceAwareIndexer uses block slot in + // `latest_sequence_count_and_tip` and we should not report block slot here + // since block slot cannot be used as watermark + unimplemented!() } } @@ -874,7 +941,7 @@ impl SequenceAwareIndexer for SealevelMailboxIndexer { async fn latest_sequence_count_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when sealevel scraper support is implemented info!("Message delivery indexing not implemented"); - let tip = Indexer::::get_finalized_block_number(self).await?; + let tip = self.mailbox.provider.rpc().get_slot().await?; Ok((Some(1), tip)) } } diff --git a/rust/main/chains/hyperlane-sealevel/src/merkle_tree_hook.rs b/rust/main/chains/hyperlane-sealevel/src/merkle_tree_hook.rs index a0813bfba8..c2fc81909f 100644 --- a/rust/main/chains/hyperlane-sealevel/src/merkle_tree_hook.rs +++ b/rust/main/chains/hyperlane-sealevel/src/merkle_tree_hook.rs @@ -93,7 +93,10 @@ impl Indexer for SealevelMerkleTreeHookIndexer { } async fn get_finalized_block_number(&self) -> ChainResult { - Indexer::::get_finalized_block_number(&self.0).await + // we should not report block height since SequenceAwareIndexer uses block slot in + // `latest_sequence_count_and_tip` and we should not report block slot here + // since block slot cannot be used as watermark + unimplemented!() } } diff --git a/rust/main/chains/hyperlane-sealevel/src/provider.rs b/rust/main/chains/hyperlane-sealevel/src/provider.rs index 144cc9c968..7c431558ae 100644 --- a/rust/main/chains/hyperlane-sealevel/src/provider.rs +++ b/rust/main/chains/hyperlane-sealevel/src/provider.rs @@ -1,10 +1,13 @@ +use std::collections::HashSet; use std::sync::Arc; use async_trait::async_trait; +use lazy_static::lazy_static; use solana_sdk::signature::Signature; use solana_transaction_status::{ option_serializer::OptionSerializer, EncodedTransaction, EncodedTransactionWithStatusMeta, - UiMessage, UiTransaction, UiTransactionStatusMeta, + UiInstruction, UiMessage, UiParsedInstruction, UiParsedMessage, UiTransaction, + UiTransactionStatusMeta, }; use tracing::warn; @@ -18,6 +21,19 @@ use crate::error::HyperlaneSealevelError; use crate::utils::{decode_h256, decode_h512, decode_pubkey}; use crate::{ConnectionConf, SealevelRpcClient}; +lazy_static! { + static ref NATIVE_PROGRAMS: HashSet = HashSet::from([ + solana_sdk::bpf_loader_upgradeable::ID.to_string(), + solana_sdk::compute_budget::ID.to_string(), + solana_sdk::config::program::ID.to_string(), + solana_sdk::ed25519_program::ID.to_string(), + solana_sdk::secp256k1_program::ID.to_string(), + solana_sdk::stake::program::ID.to_string(), + solana_sdk::system_program::ID.to_string(), + solana_sdk::vote::program::ID.to_string(), + ]); +} + /// A wrapper around a Sealevel provider to get generic blockchain information. #[derive(Debug)] pub struct SealevelProvider { @@ -33,7 +49,7 @@ impl SealevelProvider { let rpc_client = Arc::new(SealevelRpcClient::new(conf.url.to_string())); let native_token = conf.native_token.clone(); - SealevelProvider { + Self { domain, rpc_client, native_token, @@ -64,12 +80,7 @@ impl SealevelProvider { } fn sender(hash: &H512, txn: &UiTransaction) -> ChainResult { - let message = match &txn.message { - UiMessage::Parsed(m) => m, - m => Err(Into::::into( - HyperlaneSealevelError::UnsupportedMessageEncoding(m.clone()), - ))?, - }; + let message = Self::parsed_message(txn)?; let signer = message .account_keys @@ -80,6 +91,39 @@ impl SealevelProvider { Ok(sender) } + fn recipient(hash: &H512, txn: &UiTransaction) -> ChainResult { + let message = Self::parsed_message(txn)?; + + let programs = message + .instructions + .iter() + .filter_map(|ii| { + if let UiInstruction::Parsed(iii) = ii { + Some(iii) + } else { + None + } + }) + .map(|ii| match ii { + UiParsedInstruction::Parsed(iii) => &iii.program_id, + UiParsedInstruction::PartiallyDecoded(iii) => &iii.program_id, + }) + .filter(|program_id| !NATIVE_PROGRAMS.contains(*program_id)) + .collect::>(); + + if programs.len() > 1 { + Err(HyperlaneSealevelError::TooManyNonNativePrograms(*hash))?; + } + + let program_id = programs + .first() + .ok_or(HyperlaneSealevelError::NoNonNativePrograms(*hash))?; + + let pubkey = decode_pubkey(program_id)?; + let recipient = H256::from_slice(&pubkey.to_bytes()); + Ok(recipient) + } + fn gas(meta: &UiTransactionStatusMeta) -> ChainResult { let OptionSerializer::Some(gas) = meta.compute_units_consumed else { Err(HyperlaneSealevelError::EmptyComputeUnitsConsumed)? @@ -108,6 +152,15 @@ impl SealevelProvider { .ok_or(HyperlaneSealevelError::EmptyMetadata)?; Ok(meta) } + + fn parsed_message(txn: &UiTransaction) -> ChainResult<&UiParsedMessage> { + Ok(match &txn.message { + UiMessage::Parsed(m) => m, + m => Err(Into::::into( + HyperlaneSealevelError::UnsupportedMessageEncoding(m.clone()), + ))?, + }) + } } impl HyperlaneChain for SealevelProvider { @@ -165,6 +218,7 @@ impl HyperlaneProvider for SealevelProvider { Self::validate_transaction(hash, txn)?; let sender = Self::sender(hash, txn)?; + let recipient = Self::recipient(hash, txn)?; let meta = Self::meta(txn_with_meta)?; let gas_used = Self::gas(meta)?; let fee = self.fee(meta)?; @@ -189,7 +243,7 @@ impl HyperlaneProvider for SealevelProvider { gas_price, nonce: 0, sender, - recipient: None, + recipient: Some(recipient), receipt: Some(receipt), raw_input_data: None, }) diff --git a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs index 9eae0b8ae0..4d557c0d16 100644 --- a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs +++ b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs @@ -112,31 +112,19 @@ impl SealevelRpcClient { Ok(balance.into()) } - pub async fn get_block(&self, height: u64) -> ChainResult { + pub async fn get_block(&self, slot: u64) -> ChainResult { let config = RpcBlockConfig { commitment: Some(CommitmentConfig::finalized()), max_supported_transaction_version: Some(0), ..Default::default() }; self.0 - .get_block_with_config(height, config) + .get_block_with_config(slot, config) .await .map_err(HyperlaneSealevelError::ClientError) .map_err(Into::into) } - pub async fn get_block_height(&self) -> ChainResult { - let height = self - .0 - .get_block_height_with_commitment(CommitmentConfig::finalized()) - .await - .map_err(ChainCommunicationError::from_other)? - .try_into() - // FIXME solana block height is u64... - .expect("sealevel block height exceeds u32::MAX"); - Ok(height) - } - pub async fn get_multiple_accounts_with_finalized_commitment( &self, pubkeys: &[Pubkey], @@ -183,6 +171,18 @@ impl SealevelRpcClient { .map_err(ChainCommunicationError::from_other) } + pub async fn get_slot(&self) -> ChainResult { + let slot = self + .0 + .get_slot_with_commitment(CommitmentConfig::finalized()) + .await + .map_err(ChainCommunicationError::from_other)? + .try_into() + // FIXME solana block height is u64... + .expect("sealevel block slot exceeds u32::MAX"); + Ok(slot) + } + pub async fn get_transaction( &self, signature: &Signature, @@ -273,3 +273,6 @@ impl std::fmt::Debug for SealevelRpcClient { f.write_str("RpcClient { ... }") } } + +#[cfg(test)] +mod tests; diff --git a/rust/main/chains/hyperlane-sealevel/src/rpc/client/tests.rs b/rust/main/chains/hyperlane-sealevel/src/rpc/client/tests.rs new file mode 100644 index 0000000000..81859559c2 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/rpc/client/tests.rs @@ -0,0 +1,14 @@ +use crate::SealevelRpcClient; + +//#[tokio::test] +async fn _test_get_block() { + // given + let client = SealevelRpcClient::new("".to_string()); + + // when + let slot = 301337842; // block which requires latest version of solana-client + let result = client.get_block(slot).await; + + // then + assert!(result.is_ok()); +} diff --git a/rust/main/chains/hyperlane-sealevel/src/transaction.rs b/rust/main/chains/hyperlane-sealevel/src/transaction.rs deleted file mode 100644 index 26a0722cf2..0000000000 --- a/rust/main/chains/hyperlane-sealevel/src/transaction.rs +++ /dev/null @@ -1,188 +0,0 @@ -use std::collections::HashMap; - -use hyperlane_sealevel_mailbox::instruction::Instruction; -use solana_sdk::pubkey::Pubkey; -use solana_transaction_status::option_serializer::OptionSerializer; -use solana_transaction_status::{ - EncodedTransaction, EncodedTransactionWithStatusMeta, UiCompiledInstruction, UiInstruction, - UiMessage, UiTransaction, UiTransactionStatusMeta, -}; -use tracing::warn; - -use hyperlane_core::H512; - -use crate::utils::{decode_h512, from_base58}; - -/// This function searches for a transaction which dispatches Hyperlane message and returns -/// list of hashes of such transactions. -/// -/// This function takes the mailbox program identifier and the identifier for PDA for storing -/// a dispatched message and searches a message dispatch transaction in a list of transaction. -/// The list of transaction is usually comes from a block. The function returns list of hashes -/// of such transactions. -/// -/// The transaction will be searched with the following criteria: -/// 1. Transaction contains Mailbox program id in the list of accounts. -/// 2. Transaction contains dispatched message PDA in the list of accounts. -/// 3. Transaction is performing message dispatch (OutboxDispatch). -/// -/// * `mailbox_program_id` - Identifier of Mailbox program -/// * `message_storage_pda_pubkey` - Identifier for dispatch message store PDA -/// * `transactions` - List of transactions -pub fn search_dispatched_message_transactions( - mailbox_program_id: &Pubkey, - message_storage_pda_pubkey: &Pubkey, - transactions: Vec, -) -> Vec<(usize, H512)> { - transactions - .into_iter() - .enumerate() - .filter_map(|(index, tx)| filter_by_encoding(tx).map(|(tx, meta)| (index, tx, meta))) - .filter_map(|(index, tx, meta)| { - filter_by_validity(tx, meta) - .map(|(hash, account_keys, instructions)| (index, hash, account_keys, instructions)) - }) - .filter_map(|(index, hash, account_keys, instructions)| { - filter_not_relevant( - mailbox_program_id, - message_storage_pda_pubkey, - hash, - account_keys, - instructions, - ) - .map(|hash| (index, hash)) - }) - .collect::>() -} - -fn filter_not_relevant( - mailbox_program_id: &Pubkey, - message_storage_pda_pubkey: &Pubkey, - hash: H512, - account_keys: Vec, - instructions: Vec, -) -> Option { - let account_index_map = account_index_map(account_keys); - - let mailbox_program_id_str = mailbox_program_id.to_string(); - let mailbox_program_index = match account_index_map.get(&mailbox_program_id_str) { - Some(i) => *i as u8, - None => return None, // If account keys do not contain Mailbox program, transaction is not message dispatch. - }; - - let message_storage_pda_pubkey_str = message_storage_pda_pubkey.to_string(); - let dispatch_message_pda_account_index = - match account_index_map.get(&message_storage_pda_pubkey_str) { - Some(i) => *i as u8, - None => return None, // If account keys do not contain dispatch message store PDA account, transaction is not message dispatch. - }; - - let mailbox_program_maybe = instructions - .into_iter() - .find(|instruction| instruction.program_id_index == mailbox_program_index); - - let mailbox_program = match mailbox_program_maybe { - Some(p) => p, - None => return None, // If transaction does not contain call into Mailbox, transaction is not message dispatch. - }; - - // If Mailbox program does not operate on dispatch message store PDA account, transaction is not message dispatch. - if !mailbox_program - .accounts - .contains(&dispatch_message_pda_account_index) - { - return None; - } - - let instruction_data = match from_base58(&mailbox_program.data) { - Ok(d) => d, - Err(_) => return None, // If we cannot decode instruction data, transaction is not message dispatch. - }; - - let instruction = match Instruction::from_instruction_data(&instruction_data) { - Ok(ii) => ii, - Err(_) => return None, // If we cannot parse instruction data, transaction is not message dispatch. - }; - - // If the call into Mailbox program is not OutboxDispatch, transaction is not message dispatch. - if !matches!(instruction, Instruction::OutboxDispatch(_)) { - return None; - } - - Some(hash) -} - -fn filter_by_validity( - tx: UiTransaction, - meta: UiTransactionStatusMeta, -) -> Option<(H512, Vec, Vec)> { - let Some(transaction_hash) = tx - .signatures - .first() - .map(|signature| decode_h512(signature)) - .and_then(|r| r.ok()) - else { - warn!( - transaction = ?tx, - "transaction does not have any signatures or signatures cannot be decoded", - ); - return None; - }; - - let UiMessage::Raw(message) = tx.message else { - warn!(message = ?tx.message, "we expect messages in Raw format"); - return None; - }; - - let instructions = instructions(message.instructions, meta); - - Some((transaction_hash, message.account_keys, instructions)) -} - -fn filter_by_encoding( - tx: EncodedTransactionWithStatusMeta, -) -> Option<(UiTransaction, UiTransactionStatusMeta)> { - match (tx.transaction, tx.meta) { - // We support only transactions encoded as JSON - // We need none-empty metadata as well - (EncodedTransaction::Json(t), Some(m)) => Some((t, m)), - t => { - warn!( - ?t, - "transaction is not encoded as json or metadata is empty" - ); - None - } - } -} - -fn account_index_map(account_keys: Vec) -> HashMap { - account_keys - .into_iter() - .enumerate() - .map(|(index, key)| (key, index)) - .collect::>() -} - -/// Extract all instructions from transaction -fn instructions( - instruction: Vec, - meta: UiTransactionStatusMeta, -) -> Vec { - let inner_instructions = match meta.inner_instructions { - OptionSerializer::Some(ii) => ii - .into_iter() - .flat_map(|ii| ii.instructions) - .flat_map(|ii| match ii { - UiInstruction::Compiled(ci) => Some(ci), - _ => None, - }) - .collect::>(), - OptionSerializer::None | OptionSerializer::Skip => vec![], - }; - - [instruction, inner_instructions].concat() -} - -#[cfg(test)] -mod tests; diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 6388fd2d39..a24d40749a 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": "0x259Da872714f84B74B4473fab45e9839f3453a40", + "interchainSecurityModule": "0xECd85a9d1215eab1a53364dA71A57634b1a0e1C8", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x811808Dd29ba8B0FC6C0ec0b5537035E59745162", @@ -100,7 +100,7 @@ "interchainAccountIsm": "0x2A7574358Ec53522CE2452887661AB4c86F7d400", "interchainAccountRouter": "0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6", "interchainGasPaymaster": "0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22", - "interchainSecurityModule": "0xDeeE785e0b3De36A7F1aF5d0A0a1F86e7c356a58", + "interchainSecurityModule": "0x25ebF66b71a3De55D25CcFea5C0d4f974931CeeA", "mailbox": "0x979Ca5202784112f4738403dBec5D0F3B9daabB9", "merkleTreeHook": "0x748040afB89B8FdBb992799808215419d36A0930", "name": "arbitrum", @@ -172,7 +172,7 @@ "interchainAccountIsm": "0x27a3233c05C1Df7c163123301D14bE9349E3Cb48", "interchainAccountRouter": "0xa82a0227e6d6db53AF4B264A852bfF91C6504a51", "interchainGasPaymaster": "0x95519ba800BBd0d34eeAE026fEc620AD978176C0", - "interchainSecurityModule": "0x8Ea008E1E39D9770312b9b516D1f0C41DD3feCb3", + "interchainSecurityModule": "0x57576C0A653d3E9697E16f331ef8aBd8f9c9f64e", "mailbox": "0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6", "merkleTreeHook": "0x84eea61D679F42D92145fA052C89900CBAccE95A", "name": "avalanche", @@ -245,7 +245,7 @@ "interchainAccountIsm": "0x223F7D3f27E6272266AE4B5B91Fd5C7A2d798cD8", "interchainAccountRouter": "0x4767D22117bBeeb295413000B620B93FD8522d53", "interchainGasPaymaster": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", - "interchainSecurityModule": "0x875a788e4A887848ac0B5d4431125Ecd5cdB3dAe", + "interchainSecurityModule": "0x4EC3B7A1E41032C7b557fBb5c7FEbB255D23d41E", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x19dc38aeae620380430C200a6E990D5Af5480117", "name": "base", @@ -309,14 +309,14 @@ "domainRoutingIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "fallbackRoutingHook": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa", "gasCurrencyCoinGeckoId": "ethereum", - "gnosisSafeTransactionServiceUrl": "https://transaction.blast-safe.io", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-blast.safe.global", "index": { "from": 2496427 }, "interchainAccountIsm": "0xe93f2f409ad8B5000431D234472973fe848dcBEC", "interchainAccountRouter": "0x2f4Eb04189e11Af642237Da62d163Ab714614498", "interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", - "interchainSecurityModule": "0x518C62D6771b7a6b393E429ba5f9025a6F485301", + "interchainSecurityModule": "0x91c650094f876498B544cFbF47bDf4AD5762571f", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", "name": "blast", @@ -384,7 +384,7 @@ "interchainAccountIsm": "0x451dF8AB0936D85526D816f0b4dCaDD934A034A4", "interchainAccountRouter": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "interchainGasPaymaster": "0x62B7592C1B6D1E43f4630B8e37f4377097840C05", - "interchainSecurityModule": "0x28Df661E61e2f4e7a35F3a554094191e64cd6E5A", + "interchainSecurityModule": "0xCE12fcDAA985D84CBb9e17EA81AFa23e5756ECf9", "mailbox": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", "merkleTreeHook": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", "name": "bob", @@ -450,7 +450,7 @@ "interchainAccountIsm": "0x9e22945bE593946618383B108CC5bce09eBA4C26", "interchainAccountRouter": "0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1", "interchainGasPaymaster": "0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451", - "interchainSecurityModule": "0x5BC506C2C04dfDe5b45cbF47f05b4373D65832e4", + "interchainSecurityModule": "0x08b98B5a7ef4AF12c87Efb6848AC56F13072Acc1", "mailbox": "0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4", "merkleTreeHook": "0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26", "name": "bsc", @@ -531,7 +531,7 @@ "interchainAccountIsm": "0xB732c83aeE29596E3163Da2260710eAB67Bc0B29", "interchainAccountRouter": "0x27a6cAe33378bB6A6663b382070427A01fc9cB37", "interchainGasPaymaster": "0x571f1435613381208477ac5d6974310d88AC7cB7", - "interchainSecurityModule": "0xB9aD1ccE862444B5C3bad009ef500AD3680940Da", + "interchainSecurityModule": "0x75EEa329FAD5680f386d586Ac453b62e858C1CA8", "mailbox": "0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb", "merkleTreeHook": "0x04dB778f05854f26E67e0a66b740BBbE9070D366", "name": "celo", @@ -596,7 +596,7 @@ "interchainAccountIsm": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", "interchainAccountRouter": "0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0x77e9F81405DBC1eBeDA93f23aB4a339452d2AD9D", + "interchainSecurityModule": "0x15f859523466132580AB74Fd27c920CE5372a1b0", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "cheesechain", @@ -659,7 +659,7 @@ "from": 4842212 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xcC5534C4665D9BD93B377F56eC4c09Fdee87AD30", + "interchainSecurityModule": "0xf563C8347b0b03542d1027e0450166A9E56Ce4b0", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "cyber", @@ -726,7 +726,7 @@ "from": 23783929 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xF6C78dDeeb0Ef1682bC020787ecA835C5F353701", + "interchainSecurityModule": "0xc6282b9525b43E373BdE5B8C018a486502552B73", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "degenchain", @@ -839,7 +839,7 @@ "interchainAccountIsm": "0xCeafc098e5c3c7768b9229Be2FEC275862A81Abd", "interchainAccountRouter": "0xed9a722c543883FB7e07E78F3879762DE09eA7D5", "interchainGasPaymaster": "0xB30EAB08aa87138D57168D0e236850A530f49921", - "interchainSecurityModule": "0x702A7e81b3625AA02b365Aa95A7123a9EB31012f", + "interchainSecurityModule": "0x48Be1A244EbFEe8E66D220004f93e2aa42CC3463", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xC831271c1fB212012811a91Dd43e5926C1020563", "name": "endurance", @@ -910,7 +910,7 @@ "interchainAccountIsm": "0x292C614ED53DaaDBf971521bc2C652d1ca51cB47", "interchainAccountRouter": "0x5E532F7B610618eE73C2B462978e94CB1F7995Ce", "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611", - "interchainSecurityModule": "0xc7b5BA9EcedcFd7D250Cf7df19558D7dd0d06ECc", + "interchainSecurityModule": "0x0DCb0e2ceDB8828Ab1809d742C3621c7FE169E5B", "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239", "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA", "name": "ethereum", @@ -979,7 +979,7 @@ "interchainAccountIsm": "0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF", "interchainAccountRouter": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", "interchainGasPaymaster": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", - "interchainSecurityModule": "0xC8e75e117E1dBC43880ac6c85e820844Dd5f527a", + "interchainSecurityModule": "0xF80aaED3e93c02ceEE812cCAe6d15BDB68e62F4D", "mailbox": "0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3", "merkleTreeHook": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", "name": "fraxtal", @@ -1047,7 +1047,7 @@ "interchainAccountIsm": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", "interchainAccountRouter": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", "interchainGasPaymaster": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", - "interchainSecurityModule": "0xf0b1EC4228c0F26B7225851f940c625e4Be12226", + "interchainSecurityModule": "0x58f85b68c664017247E6A65290409953a10adbd8", "mailbox": "0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696", "merkleTreeHook": "0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f", "name": "fusemainnet", @@ -1121,7 +1121,7 @@ "interchainAccountIsm": "0x07E2062A1bC66a2C1d05cb5C3870a4AF86e0056E", "interchainAccountRouter": "0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064", "interchainGasPaymaster": "0xDd260B99d302f0A3fF885728c086f729c06f227f", - "interchainSecurityModule": "0xcfA4D90A43AAB0dE6a07c33A0614606b5Fbf71eC", + "interchainSecurityModule": "0x4845d050F06482960435499e88286808c181F913", "mailbox": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "name": "gnosis", @@ -1192,7 +1192,7 @@ "interchainAccountIsm": "0x708E002637792FDC031E6B62f23DD60014AC976a", "interchainAccountRouter": "0xfB8cea1c7F45608Da30655b50bbF355D123A4358", "interchainGasPaymaster": "0x19dc38aeae620380430C200a6E990D5Af5480117", - "interchainSecurityModule": "0x5f39C3f0d9c74a667C177795b769CC22aE0A200d", + "interchainSecurityModule": "0xf7CaC1C661fe307CD4Eadb08EE5E64bb34623c11", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65", "name": "inevm", @@ -1231,7 +1231,7 @@ "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" @@ -1320,7 +1320,7 @@ "from": 14616307 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xa078A84FCB5d53BCe9529DcF96635794951116Ba", + "interchainSecurityModule": "0xf6AB62267aA88f7219CB9d77e361687e090b224F", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "kroma", @@ -1386,14 +1386,14 @@ "domainRoutingIsmFactory": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "fallbackRoutingHook": "0x4E1c88DD261BEe2941e6c1814597e30F53330428", "gasCurrencyCoinGeckoId": "ethereum", - "gnosisSafeTransactionServiceUrl": "https://transaction.safe.linea.build", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-linea.safe.global", "index": { "from": 5154574 }, "interchainAccountIsm": "0xdcA646C56E7768DD11654956adE24bfFf9Ba4893", "interchainAccountRouter": "0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C", "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", - "interchainSecurityModule": "0x3902B990C5DC30D6CeeFf8b8B6Ad0cb6466b7d45", + "interchainSecurityModule": "0x914E4A88Be1e835b17B6f2F259861989fCB27978", "mailbox": "0x02d16BC51af6BfD153d67CA61754cF912E82C4d9", "merkleTreeHook": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", "name": "linea", @@ -1464,7 +1464,7 @@ "from": 4195553 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xcee06f87aC789615B0BF989B54fb36De334af5bC", + "interchainSecurityModule": "0xEED58BC374386596a848856aDCD07f597B70e2d9", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "lisk", @@ -1528,7 +1528,7 @@ "from": 3088760 }, "interchainGasPaymaster": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", - "interchainSecurityModule": "0x351621b2fbfe92193304A8e4DD97E04108883Ac8", + "interchainSecurityModule": "0xf660731c69aF0E1C441bEE544595dbBEE652ebb6", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x062200d92dF6bB7bA89Ce4D6800110450f94784e", "name": "lukso", @@ -1602,7 +1602,7 @@ "interchainAccountIsm": "0x8Ea50255C282F89d1A14ad3F159437EE5EF0507f", "interchainAccountRouter": "0x693A4cE39d99e46B04cb562329e3F0141cA17331", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x4110577c0970e591b3DC6D8FfCbE8FA499b4cD14", + "interchainSecurityModule": "0x4cD0894d9277e62906c788c2F39Ab04610e577B7", "isTestnet": false, "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", @@ -1672,7 +1672,7 @@ "interchainAccountIsm": "0xe039DA3A0071BEd087A12660D7b03cf669c7776E", "interchainAccountRouter": "0x45285463352c53a481e882cD5E2AF2E25BBdAd0D", "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", - "interchainSecurityModule": "0xAb7DdE83cf33e0B305624462A6B9D7D06A32A699", + "interchainSecurityModule": "0xA5c6193F340F05feD2064a9e56Bb7b3c6242E21E", "mailbox": "0x398633D19f4371e1DB5a8EFE90468eB70B1176AA", "merkleTreeHook": "0x5332D1AC0A626D265298c14ff681c0A8D28dB86d", "name": "mantle", @@ -1734,7 +1734,7 @@ "from": 13523607 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xc0dc69896334eD2f3Af2666d5EEF70e062a4636e", + "interchainSecurityModule": "0xF16b870563cbb181A53D5e8152cAAa3bF4c356D6", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "merlin", @@ -1801,7 +1801,7 @@ "from": 17966274 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xA04202E77957f7451c0a2F2CA9eF54FFC334BcF3", + "interchainSecurityModule": "0x015c05e7bCeAB0D16912667cC03282C6276aC7d7", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "metis", @@ -1839,7 +1839,7 @@ "aggregationHook": "0xF6C1769d5390Be0f77080eF7791fBbA7eF4D5659", "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" @@ -1866,7 +1866,7 @@ "from": 3752032 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x120bbFe296f11Dd653Cd6aC4F93106d9e6ADe5Bc", + "interchainSecurityModule": "0xe5E2224EaF5488Cbc992a35C828Ae0006dFbfE27", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "mint", @@ -1933,7 +1933,7 @@ "interchainAccountIsm": "0xa377b8269e0A47cdd2fD5AAeAe860b45623c6d82", "interchainAccountRouter": "0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8", "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0x0ab4853f2104C8f8e0b4Da4028601D999c7dFCF5", + "interchainSecurityModule": "0xBE3E3bAe7b14098111dC0bBD0dFce251217E386A", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "mode", @@ -2001,7 +2001,7 @@ "interchainAccountIsm": "0x79b3730CE3685f65802aF1771319992bA960EB9D", "interchainAccountRouter": "0xc4482f66191754a8629D35289043C4EB0285F10E", "interchainGasPaymaster": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "interchainSecurityModule": "0x11cC5Ac8F65e337Db6E95a542e87Af630cd0b1CD", + "interchainSecurityModule": "0x0F016E98B570D263cb5E37948bF4D92F328fcA4A", "mailbox": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", "merkleTreeHook": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", "name": "moonbeam", @@ -2042,7 +2042,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" @@ -2143,7 +2143,7 @@ "interchainAccountIsm": "0x2c46BF14641d00549ECa4779BF5CBf91602C1DEd", "interchainAccountRouter": "0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD", "interchainGasPaymaster": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "interchainSecurityModule": "0x5E04bA55C08456562f7e1BF9E2b46628b81593c8", + "interchainSecurityModule": "0x3f8b6df0282D9fAF0d12752cD40166298A67f29B", "mailbox": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", "merkleTreeHook": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", "name": "optimism", @@ -2180,7 +2180,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" @@ -2278,7 +2278,7 @@ "interchainAccountIsm": "0xBAC4529cdfE7CCe9E858BF706e41F8Ed096C1BAd", "interchainAccountRouter": "0xF163949AD9F88977ebF649D0461398Ca752E64B9", "interchainGasPaymaster": "0x0071740Bf129b05C4684abfbBeD248D80971cce2", - "interchainSecurityModule": "0x0c3fE398595235A3163b39E5C6443aa1f7e145c4", + "interchainSecurityModule": "0x40249639D8b148EBD66FE5b110DEbcE2fa06D683", "mailbox": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB", "merkleTreeHook": "0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6", "name": "polygon", @@ -2355,7 +2355,7 @@ "interchainAccountIsm": "0xc1198e241DAe48BF5AEDE5DCE49Fe4A6064cF7a7", "interchainAccountRouter": "0x20a0A32a110362920597F72974E1E0d7e25cA20a", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x3351FC009ccb309C367787ff9f3040FDee0Dcf66", + "interchainSecurityModule": "0xAaBb015A97a49eCEa506A3D7b831BFF8458B7421", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "polygonzkevm", @@ -2423,7 +2423,7 @@ "from": 32018468 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x37282B7505DA332Fc57FAb1623C73A4AeDb49165", + "interchainSecurityModule": "0x015c05e7bCeAB0D16912667cC03282C6276aC7d7", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "proofofplay", @@ -2487,7 +2487,7 @@ "from": 363159 }, "interchainGasPaymaster": "0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696", - "interchainSecurityModule": "0x14551EfDB6c29c8fC61D469627255E5f2c8Bf981", + "interchainSecurityModule": "0xbFA199Fae108dF18860D847c881EF5F8a7745e85", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x55E4F0bc6b7Bb493D50839A8592e7ad8d5e93cf7", "name": "real", @@ -2554,7 +2554,7 @@ "interchainAccountIsm": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785", "interchainAccountRouter": "0x7a4d31a686A36285d68e14EDD53631417eB19603", "interchainGasPaymaster": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "interchainSecurityModule": "0x5fe5b8f20437336a74fA53e553472f6fF048e73A", + "interchainSecurityModule": "0xA3A88Cf5b9eB22a9a192d8fC592ac769B1EA150A", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", "name": "redstone", @@ -2616,7 +2616,7 @@ "from": 937117 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xcC5534C4665D9BD93B377F56eC4c09Fdee87AD30", + "interchainSecurityModule": "0xAA379b1f1B425b8174e1bF1614A40845053A86cF", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "sanko", @@ -2684,7 +2684,7 @@ "interchainAccountIsm": "0x32af5Df81fEd5E26119F6640FBB13f3d63a94CDe", "interchainAccountRouter": "0x0B48a744698ba8dFa514742dFEB6728f52fD66f7", "interchainGasPaymaster": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "interchainSecurityModule": "0x41D5dbBe3a6B5d3937f03e82C23d1EDF9D4d0B6C", + "interchainSecurityModule": "0x2C63D8BA06b341E73392E4d6ef069064D6fE4CDc", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", "name": "scroll", @@ -2752,7 +2752,7 @@ "interchainAccountIsm": "0xf35dc7B9eE4Ebf0cd3546Bd6EE3b403dE2b9F5D6", "interchainAccountRouter": "0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5", "interchainGasPaymaster": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", - "interchainSecurityModule": "0x42Aa14207b41A7c2b1692DFC4927a32Caaa52b24", + "interchainSecurityModule": "0x9b8e185A2e166e6E2357d23b4626220C656aD8dF", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49", "name": "sei", @@ -2867,7 +2867,7 @@ "interchainAccountIsm": "0xAE557e108b3336130370aC74836f1356B4b30Cf2", "interchainAccountRouter": "0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B", "interchainGasPaymaster": "0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42", - "interchainSecurityModule": "0x2faB8c35cd093904F3d9a9f022996103d4bb7A85", + "interchainSecurityModule": "0x68Ea629559Df7041adCf61569576023695C4A76b", "mailbox": "0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3", "merkleTreeHook": "0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd", "name": "taiko", @@ -2929,7 +2929,7 @@ "from": 1678063 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xcC5534C4665D9BD93B377F56eC4c09Fdee87AD30", + "interchainSecurityModule": "0xAA379b1f1B425b8174e1bF1614A40845053A86cF", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", @@ -2997,7 +2997,7 @@ "interchainAccountIsm": "0x551BbEc45FD665a8C95ca8731CbC32b7653Bc59B", "interchainAccountRouter": "0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x87Fb0665D25aC674D4d1494a13cA60E378f7536F", + "interchainSecurityModule": "0x00cd5A9d087E1a87779252487c35ba37C399808D", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "viction", @@ -3065,7 +3065,7 @@ "interchainAccountIsm": "0xCB9f90EE5d83Ea52ABd922BD70898f0155D54798", "interchainAccountRouter": "0x473884010F0C1742DA8Ad01E7E295624B931076b", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0xb936B97837C4158DEA65CBaBCcC55bAE24134108", + "interchainSecurityModule": "0x34aD800C9e56D75655680401B8c5140ce4cACDBa", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "worldchain", @@ -3127,7 +3127,7 @@ "from": 24395308 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xf61ee4520B7b316a34cdB31F4B95d8ad1808F919", + "interchainSecurityModule": "0xd69d8FBC4d716d902f40d041596f024B705CE394", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "xai", @@ -3195,7 +3195,7 @@ "interchainAccountIsm": "0x29B37088724B745C0ABcE591449Cf042772160C2", "interchainAccountRouter": "0x03cF708E42C89623bd83B281A56935cB562b9258", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0x59Dcbb486F91561acC3500cdc378104AaE27e94a", + "interchainSecurityModule": "0xe88402C8346b055644E9dBBf6125131F73d89763", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "xlayer", @@ -3263,7 +3263,7 @@ "interchainAccountIsm": "0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29", "interchainAccountRouter": "0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5", "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0x3DFD05cc42F1B5370e688520e65C8fb909418471", + "interchainSecurityModule": "0xA20Df62dEC7B82ea026CDcaD99774cB667F75d88", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "zetachain", @@ -3329,7 +3329,7 @@ "from": 1511458 }, "interchainGasPaymaster": "0x03cF708E42C89623bd83B281A56935cB562b9258", - "interchainSecurityModule": "0x6C5288BBdFBfED98aE3e2C4201a53A9bBcC24fCE", + "interchainSecurityModule": "0x9f5eFA37Aa96676A634eDbBd2E2132a75557a19e", "mailbox": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", "merkleTreeHook": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28", "name": "zircuit", @@ -3402,7 +3402,7 @@ "interchainAccountIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", "interchainAccountRouter": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainGasPaymaster": "0x18B0688990720103dB63559a3563f7E8d0f63EDb", - "interchainSecurityModule": "0x10455742E8D25b3FC2b19D41A006E91594D05Cd5", + "interchainSecurityModule": "0xB4F0a46314954446aeEb27254569510226ecd3c2", "mailbox": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "merkleTreeHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", "name": "zoramainnet", @@ -3473,7 +3473,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xed2b47397954E0a56ca7C2a862dba4027da0f595", + "interchainSecurityModule": "0x4b1EF66EB03743D243dca2024af3B6C4BB2afCAC", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3540,7 +3540,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x73b3A13eA8084C9BeAd07eD867cEe1E8F5cceF9e", + "interchainSecurityModule": "0x55bD770A3220A745B62600e3BEE6e6F944948c5B", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3610,7 +3610,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x0fFD49C8ae6f5DdC20124B92c4b4048EbeF71830", + "interchainSecurityModule": "0x2D78569De74146D7CDB5A8aabD8Bd451Da641c92", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3686,7 +3686,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x6dCfEB77d5801DCC76C0EDd1F44E32D6dEcAD2A2", + "interchainSecurityModule": "0x574A030c4636De291C42537d1dc0B9079318F839", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3750,7 +3750,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x119b3dFBef304b07BBCb08D5182459f35808bfF2", + "interchainSecurityModule": "0x376F482e4dF14f7d497Ee5bF827Cf7BC7688F9DD", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3823,7 +3823,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x7954Da9003180D64B9Eb7dE5E23fC83Fd7673047", + "interchainSecurityModule": "0x53245370532d36e57B2Ef87fAF7Fb389A88aC57e", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3891,7 +3891,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xE96E34b0e66A5FAe90Be8f5FE41B6adB86D84A8b", + "interchainSecurityModule": "0xe8b432a77F1195bD7F27d54f0D354D25E014c1DE", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3954,7 +3954,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x6CECA24Ebc20183B17fbA17f2856d5B3f97659Db", + "interchainSecurityModule": "0x60DE73a356E9bEFBC73Ca55799ab4AE18d9f0574", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -4024,7 +4024,7 @@ "interchainAccountIsm": "0xcd9D3744512F07AE844c40E27912092d7c503565", "interchainAccountRouter": "0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8", "interchainGasPaymaster": "0xb58257cc81E47EC72fD38aE16297048de23163b4", - "interchainSecurityModule": "0x6B38f93e9145BF8b09B127e20F0275E92E29E4F5", + "interchainSecurityModule": "0x099c96B148fC39c449884D7ABEC6837e51BF7fA9", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1", "pausableHook": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", @@ -4084,7 +4084,7 @@ "interchainAccountIsm": "0xc23BaF5Eb5848D19701BbE7f139645e6bd58a319", "interchainAccountRouter": "0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE", "interchainGasPaymaster": "0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86", - "interchainSecurityModule": "0x0d242364057129d99Fca35BA8Ed2d9Ae90956F63", + "interchainSecurityModule": "0x6aF9a16aa08e3ae6B3Cd898407dEfCF1de469783", "mailbox": "0xb129828B9EDa48192D0B2db35D0E40dCF51B3594", "merkleTreeHook": "0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59", "pausableHook": "0x6Fb36672365C7c797028C400A61c58c0ECc53cD2", @@ -4111,7 +4111,7 @@ "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" @@ -4215,7 +4215,7 @@ "interchainAccountIsm": "0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1", "interchainAccountRouter": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "interchainGasPaymaster": "0x18B0688990720103dB63559a3563f7E8d0f63EDb", - "interchainSecurityModule": "0x70196Ec5e193dC07CFDC7AeC583DF9aeC20f4939", + "interchainSecurityModule": "0x03426Cf05E862B4702391Ff7E005E7cDB71cC789", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", "pausableHook": "0x2F619Ac5122689180AeBB930ADccdae215d538a9", @@ -4279,7 +4279,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x8FBFF0cF2920c4deFfd8EAE6a51BB55E1d40eFFc", + "interchainSecurityModule": "0xD70e68A8CBEff2349b3F0455B45d58D555256633", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4340,7 +4340,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xCC95B2978F65B2f358dD4A8B428Dd442AB37f478", + "interchainSecurityModule": "0xD91a9416ffd488eEfFD8F3E1dF884d54eaD87673", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4419,7 +4419,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xeD0fc456143f761614478D170bf12403638DDa1e", + "interchainSecurityModule": "0xC601666Ca22649b20d642c0eb36047d265928D04", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4486,7 +4486,7 @@ "interchainAccountIsm": "0x783EC5e105234a570eB90f314284E5dBe53bdd90", "interchainAccountRouter": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", "interchainGasPaymaster": "0xf3dFf6747E7FC74B431C943961054B7BF6309d8a", - "interchainSecurityModule": "0xFbDfEE404a9DFA413fF8B587aDad4B7979Db28a0", + "interchainSecurityModule": "0x1738cd8652a324DD9781D5Ce0f609827761D48dA", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8", "pausableHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", @@ -4557,7 +4557,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x2D92EeB56FbEB258d918485200aC1C2e010547b8", + "interchainSecurityModule": "0x9e92E451b71378aBf1cd4769f34528af9C0e97Fd", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4622,7 +4622,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xCC95B2978F65B2f358dD4A8B428Dd442AB37f478", + "interchainSecurityModule": "0xD91a9416ffd488eEfFD8F3E1dF884d54eaD87673", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4686,7 +4686,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x8FBFF0cF2920c4deFfd8EAE6a51BB55E1d40eFFc", + "interchainSecurityModule": "0x330063B36D40D1d77DBAd7e9552b97433f281090", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4753,7 +4753,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x8FBFF0cF2920c4deFfd8EAE6a51BB55E1d40eFFc", + "interchainSecurityModule": "0xD70e68A8CBEff2349b3F0455B45d58D555256633", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4817,7 +4817,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xC7a2a8103dF4bdE8c78C2C5C03389ee9337A9942", + "interchainSecurityModule": "0x0197F4a7ED6db49Ad345214C710206aCfFBA241a", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4842,7 +4842,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" @@ -4894,19 +4894,20 @@ "validatorAnnounce": "0xB2F0e411B46AbE3248dAFB5e89aDB5b8404F45DF", "index": { "from": 475 - } + }, + "gnosisSafeTransactionServiceUrl": "https://prod.zeronet-mainnet.transaction.keypersafe.xyz" }, "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" } ], "blocks": { - "confirmations": 2, + "confirmations": 1, "estimateBlockTime": 1, "reorgPeriod": 0 }, @@ -5002,7 +5003,7 @@ "interchainAccountIsm": "0x4d264424905535E97396Db83bd553D0d73A4EF9d", "interchainAccountRouter": "0x26A29486480BD74f9B830a9B8dB33cb43C40f496", "interchainGasPaymaster": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", - "interchainSecurityModule": "0x3c23D983112Ab87662A1227678ba1f3483E03dFe", + "interchainSecurityModule": "0x28Ce6b8aB49e37f2B386056bB7D9779Ecc89f4EE", "mailbox": "0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "pausableHook": "0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8", @@ -5066,7 +5067,7 @@ "interchainAccountIsm": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "interchainAccountRouter": "0x4ef363Da5bb09CC6aeA16973786963d0C8820778", "interchainGasPaymaster": "0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40", - "interchainSecurityModule": "0xfE0c963aDF971956BbeD320995d6b34db087C0A4", + "interchainSecurityModule": "0x5Cd2d33b51b3394A14C11ea79E5E0Ba6bCC81e83", "mailbox": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", "merkleTreeHook": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", "pausableHook": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", @@ -5133,7 +5134,7 @@ "interchainAccountIsm": "0x60bB6D060393D3C206719A7bD61844cC82891cfB", "interchainAccountRouter": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", "interchainGasPaymaster": "0x61374178e45F65fF9D6252d017Cd580FC60B7654", - "interchainSecurityModule": "0x7c6A51101Ba76EC1f358C11d349fbEd9486B62Ee", + "interchainSecurityModule": "0xE97f143373BA2f424a67FC3fc5cf7EfE2095aF0A", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xEe08043cf22c80b27BF24d19999231dF4a3fC256", "pausableHook": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", @@ -5198,7 +5199,7 @@ "interchainAccountIsm": "0xcdc31BA959DE8C035A03167ebAE1961208CDf172", "interchainAccountRouter": "0x349831a180eE4265008C5FFB9465Ff97c1CF0028", "interchainGasPaymaster": "0x6AA10748a036a49Cb290C0e12B77319b76792D5E", - "interchainSecurityModule": "0x806342559EBD943f259cFCf606aad7c50DE81f42", + "interchainSecurityModule": "0xBB7E1A95C63cc745b6e51127d04e9a957966591e", "mailbox": "0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D", "merkleTreeHook": "0x2783D98CC073dbcDa90241C804d16982D3d75821", "pausableHook": "0x3bb2D0a828f7dD91bA786091F421f6d7cF376445", @@ -5268,7 +5269,7 @@ "interchainAccountIsm": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "interchainAccountRouter": "0x4ef363Da5bb09CC6aeA16973786963d0C8820778", "interchainGasPaymaster": "0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9", - "interchainSecurityModule": "0x1941d3fA81a868e401a0C8E0a1443d59D3Ec04Fe", + "interchainSecurityModule": "0xc622B32Da6Bc983B7aE6Ea7253D39396512e5F70", "mailbox": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", "merkleTreeHook": "0xdAa1B65547fB969c9ff5678956AB2FF9771B883D", "pausableHook": "0xA0e0829DA397CcF55d5B779C31728f21Cb8219DF", @@ -5380,7 +5381,7 @@ "interchainAccountIsm": "0x8c794a781327b819416E7b67908f1D22397f1E67", "interchainAccountRouter": "0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6", "interchainGasPaymaster": "0x2b79328DA089E89A9E9c08732b56dd31F01011Db", - "interchainSecurityModule": "0xe05Bac82CeC0Ee8c66a29E37108E319A3B993539", + "interchainSecurityModule": "0xFdd7f8b8CBe3612609Fe5bf0332B280182dcB74F", "mailbox": "0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9", "merkleTreeHook": "0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227", "pausableHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", @@ -5444,7 +5445,7 @@ "interchainAccountIsm": "0xE67Dc24970B482579923551Ede52BD35a2858989", "interchainAccountRouter": "0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409", "interchainGasPaymaster": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", - "interchainSecurityModule": "0x848A33eE97898B1Dbd11DaCd0ff9101c71C4fabA", + "interchainSecurityModule": "0xcCe65dffEc65798B986969EE9A490AC096d0E54e", "mailbox": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", "merkleTreeHook": "0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8", "pausableHook": "0xdAa1B65547fB969c9ff5678956AB2FF9771B883D", @@ -5508,7 +5509,7 @@ "interchainAccountIsm": "0x20a0A32a110362920597F72974E1E0d7e25cA20a", "interchainAccountRouter": "0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54", "interchainGasPaymaster": "0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6", - "interchainSecurityModule": "0x9A1b90A6c7b2835A895bAD9072e0fBdbb225baC0", + "interchainSecurityModule": "0x7B891Aec2e7edA0215Be884f2396615a231A1502", "mailbox": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "merkleTreeHook": "0xf147bBD944C610F86DaE6C7668497D22932C1E4A", "pausableHook": "0x872Bd98057931c8809927c6dE2ef39738a80Eb0C", @@ -5575,7 +5576,7 @@ "interchainAccountIsm": "0xf40eE9FF75Fa34910b7C4C8d68d4850B3bD184D3", "interchainAccountRouter": "0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea", "interchainGasPaymaster": "0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409", - "interchainSecurityModule": "0x72AafB2129B3cCCc9A89A1EEdCdF50D1Ccb4a3C8", + "interchainSecurityModule": "0xc09E4b2C7b3884609dded73571a27B8F6D05aA66", "mailbox": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", "merkleTreeHook": "0x8c794a781327b819416E7b67908f1D22397f1E67", "pausableHook": "0x4d264424905535E97396Db83bd553D0d73A4EF9d", @@ -5642,7 +5643,7 @@ "interchainAccountIsm": "0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D", "interchainAccountRouter": "0x7279B1e11142078b8dC9e69620200f4C84FB8aaa", "interchainGasPaymaster": "0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7", - "interchainSecurityModule": "0xE5bdba0070d0665F5f61847277b201bD29113347", + "interchainSecurityModule": "0xE367092A59d558a9Ee8894D12f4Fa363A168870e", "mailbox": "0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8", "merkleTreeHook": "0x086c3947F71BE98A0bDf4AB7239955e7542b0CbA", "pausableHook": "0x9C6e8d989ea7F212e679191BEb44139d83ac927a", @@ -5712,7 +5713,7 @@ "interchainAccountIsm": "0x8a733038eF4BbC314eE0F7595257D8d3799B6aA9", "interchainAccountRouter": "0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9", "interchainGasPaymaster": "0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C", - "interchainSecurityModule": "0x0CFf4d26bF35E69DcdE55B161952656E40028a18", + "interchainSecurityModule": "0x5D26b61F665FabFF52D6f5260072dc20BC9b0652", "mailbox": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6", "merkleTreeHook": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", "pausableHook": "0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9", @@ -5730,6 +5731,329 @@ "testRecipient": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "timelockController": "0x0000000000000000000000000000000000000000", "validatorAnnounce": "0x26A29486480BD74f9B830a9B8dB33cb43C40f496" + }, + "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", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 10598389 + } + }, + "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", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e" + }, + "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", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 3010957 + } + }, + "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", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 1453239 + } + }, + "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", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 629917 + } } }, "defaultRpcConsensusType": "fallback" diff --git a/rust/main/config/testnet_config.json b/rust/main/config/testnet_config.json index a551f09d0b..e5e01dcaf8 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": "0x863502F430eF41d4B3CC5C5eB3688Bc3310D3Bbd", + "interchainSecurityModule": "0xDf1d3c37FfA6134767911B8876305afc187dA207", "isTestnet": true, "mailbox": "0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59", "merkleTreeHook": "0x221FA9CBaFcd6c1C3d206571Cf4427703e023FFa", @@ -94,7 +94,7 @@ "from": 49690504 }, "interchainGasPaymaster": "0xc756cFc1b7d0d4646589EDf10eD54b201237F5e8", - "interchainSecurityModule": "0x7A1dB57297a154B674D53FD88e95C7823F8291B5", + "interchainSecurityModule": "0x69a84432Ba4FaD95FC5850aCD613C6daD286908C", "isTestnet": true, "mailbox": "0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8", "merkleTreeHook": "0xAD34A66Bf6dB18E858F6B686557075568c6E031C", @@ -162,7 +162,7 @@ "from": 13851043 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0xDf6D05775678B9dF90578C4A84c9dE9E9f2D6601", + "interchainSecurityModule": "0x2945eCB46AE83B1A37b589A9c1219061522A73aD", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -232,7 +232,7 @@ "interchainAccountIsm": "0xa9D8Ec959F34272B1a56D09AF00eeee58970d3AE", "interchainAccountRouter": "0x6d2B3e304E58c2a19f1492E7cf15CaF63Ce6e0d2", "interchainGasPaymaster": "0x0dD20e410bdB95404f71c5a4e7Fa67B892A5f949", - "interchainSecurityModule": "0xe5118b2832be3F0fdBAbFC60D5a7BD7282F6B4f0", + "interchainSecurityModule": "0x0c29F3Ce8995b41eB8c2b3E1eC33c3fa10C8cf91", "isTestnet": true, "mailbox": "0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D", "merkleTreeHook": "0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f", @@ -301,7 +301,7 @@ "from": 4950 }, "interchainGasPaymaster": "0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450", - "interchainSecurityModule": "0x51a989e43452f9E38ec760A44D9D625256Ebc2a2", + "interchainSecurityModule": "0xa25786D36B5a5eDeCAf75142dD056B1Ed1473f44", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x4926a10788306D84202A2aDbd290b7743146Cc17", @@ -402,7 +402,7 @@ "from": 1606754 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0x44de9cE0f2ab382dEb479e5Afaf3D74Ea31EdE89", + "interchainSecurityModule": "0x1AFC8F84cAE294C3E6d3Ddb031946B93f08272b5", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -468,7 +468,7 @@ "interchainAccountIsm": "0xfaB4815BDC5c60c6bD625459C8577aFdD79D9311", "interchainAccountRouter": "0xeEF6933122894fF217a7dd07510b3D64b747e29b", "interchainGasPaymaster": "0x6895d3916B94b386fAA6ec9276756e16dAe7480E", - "interchainSecurityModule": "0x20c00D11720a6530216e2BDECC44D5B5447EcFe2", + "interchainSecurityModule": "0x7b5AD17cdAbdED0C29B161c647DA32dCE51AB13B", "isTestnet": true, "mailbox": "0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0", "merkleTreeHook": "0x9ff6ac3dAf63103620BBf76136eA1AFf43c2F612", @@ -534,7 +534,7 @@ "from": 1543015 }, "interchainGasPaymaster": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9", - "interchainSecurityModule": "0xc9C22400Fa73f9Ee5edd4E330461bC63D33B0203", + "interchainSecurityModule": "0x16738b80D39Fa0652F2D853c3E6235Afb7cA6dDc", "isTestnet": true, "mailbox": "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc", "merkleTreeHook": "0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE", @@ -599,7 +599,7 @@ "from": 15833917 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0xDa949Fe06145546b0cD6865c6346A770A07FC600", + "interchainSecurityModule": "0x81B81B3b296ecf99d5bAC0DE4e5fF7a3ceECf08b", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -727,7 +727,7 @@ "from": 10634605 }, "interchainGasPaymaster": "0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C", - "interchainSecurityModule": "0xD6D5Aed44d2EdF7f0F73dE7860BDb5E02ef478C1", + "interchainSecurityModule": "0x428a2384F6013A9c561737E9A58288e071470192", "isTestnet": true, "mailbox": "0x54148470292C24345fb828B003461a9444414517", "merkleTreeHook": "0xddf4C3e791caCaFd26D7fb275549739B38ae6e75", @@ -802,7 +802,7 @@ "interchainAccountIsm": "0xE023239c8dfc172FF008D8087E7442d3eBEd9350", "interchainAccountRouter": "0xe17c37212d785760E8331D4A4395B17b34Ba8cDF", "interchainGasPaymaster": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", - "interchainSecurityModule": "0xEb786a246FFBd9AA9609872570F789A11268D874", + "interchainSecurityModule": "0xb9A0fa05Fcce52605f0142c1A5Aca32f223eB961", "isTestnet": true, "mailbox": "0x3C5154a193D6e2955650f9305c8d80c18C814A68", "merkleTreeHook": "0x863E8c26621c52ACa1849C53500606e73BA272F0", @@ -880,7 +880,7 @@ "interchainAccountIsm": "0x83a3068B719F764d413625dA77468ED74789ae02", "interchainAccountRouter": "0x8e131c8aE5BF1Ed38D05a00892b6001a7d37739d", "interchainGasPaymaster": "0x6f2756380FD49228ae25Aa7F2817993cB74Ecc56", - "interchainSecurityModule": "0xcB9775E2BBDb651BFf0919f07f82291Edf60b46c", + "interchainSecurityModule": "0x5bC248C8010848067919fA73F4555AeE95Df38a4", "isTestnet": true, "mailbox": "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766", "merkleTreeHook": "0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d", @@ -990,7 +990,7 @@ "from": 3111622 }, "interchainGasPaymaster": "0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450", - "interchainSecurityModule": "0x150120ab53A79F08CdA1BC966D67497B3a4850C7", + "interchainSecurityModule": "0x8a833B1230A75712a767e81556F1Ad612A0F76F3", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x4926a10788306D84202A2aDbd290b7743146Cc17", @@ -1078,7 +1078,7 @@ "interchainAccountIsm": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", "interchainAccountRouter": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", "interchainGasPaymaster": "0x04438ef7622f5412f82915F59caD4f704C61eA48", - "interchainSecurityModule": "0x502aAc4F3EB74859da30b51B027a886FC13c70Ff", + "interchainSecurityModule": "0x5e39968B0435332dE915C2FF62fD373fBbbb7C75", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C", "pausableHook": "0x783c4a0bB6663359281aD4a637D5af68F83ae213", @@ -1138,7 +1138,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0x67cd2504Eb4702AA84B1A74289D18Db8Cf536006", + "interchainSecurityModule": "0x97b1e5FBF33d82fAD9C3Aa0fF901e9B9d63090E3", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1206,7 +1206,7 @@ "interchainAccountIsm": "0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72", "interchainAccountRouter": "0xB5fB1F5410a2c2b7deD462d018541383968cB01c", "interchainGasPaymaster": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", - "interchainSecurityModule": "0xB0719a2fA10CAdE7bD8a5f18Db855235FA29c42a", + "interchainSecurityModule": "0xAfDF88EB9447e412c89304F34813c5564307709b", "mailbox": "0xB08d78F439e55D02C398519eef61606A5926245F", "merkleTreeHook": "0x783c4a0bB6663359281aD4a637D5af68F83ae213", "pausableHook": "0x66b71A4e18FbE09a6977A6520B47fEDdffA82a1c", @@ -1267,7 +1267,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0x9C75f6faE951262f5c4930aea3b8210D987519AD", + "interchainSecurityModule": "0xe5B27D2198EEacf4FeC7d558CdE3b4fDCe4d37f9", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1395,7 +1395,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0xe7cfc362943cd36091Ce1f96a75D271D04A896d2", + "interchainSecurityModule": "0x8714Caec7020c611DA73811E897A879C22d7C396", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1459,7 +1459,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0x95ff7ef38d87DD7C0850268934197dAC5b626d41", + "interchainSecurityModule": "0x0511f73F8D734e0fc9df1E6C0937592a3A371B18", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1710,7 +1710,7 @@ "interchainAccountIsm": "0x39c85C84876479694A2470c0E8075e9d68049aFc", "interchainAccountRouter": "0x80fE4Cb8c70fc60B745d4ffD4403c27a8cBC9e02", "interchainGasPaymaster": "0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb", - "interchainSecurityModule": "0x39454E12262c13E3C5148F5af0dA6Bfae7c6CFEb", + "interchainSecurityModule": "0x3865c419335B36d9CE240b515124Ab1c33927004", "mailbox": "0x33dB966328Ea213b0f76eF96CA368AB37779F065", "merkleTreeHook": "0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD", "pausableHook": "0x4fE19d49F45854Da50b6009258929613EC92C147", @@ -1773,7 +1773,7 @@ "interchainAccountIsm": "0xc08675806BA844467E559E45E4bB59e66778bDcd", "interchainAccountRouter": "0x39c85C84876479694A2470c0E8075e9d68049aFc", "interchainGasPaymaster": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", - "interchainSecurityModule": "0xc87fF93d00B60274233292351E0A42709E90B27e", + "interchainSecurityModule": "0x4B310268158B842cbE65A216714C6A7D1d087155", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE", "pausableHook": "0xe0B988062A0C6492177d64823Ab95a9c256c2a5F", @@ -1836,7 +1836,7 @@ "interchainAccountIsm": "0x3ca332A585FDB9d4FF51f2FA8999eA32184D3606", "interchainAccountRouter": "0x4eC139a771eBdD3b0a0b67bb7E08960210882d44", "interchainGasPaymaster": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", - "interchainSecurityModule": "0xC1E52cBA12c4efC8d14A0370fB96169272d6752A", + "interchainSecurityModule": "0xAd6172DA241CE5DC38a32E0E375FD0A1889b9E48", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE", "pausableHook": "0xe0B988062A0C6492177d64823Ab95a9c256c2a5F", @@ -1899,7 +1899,7 @@ "interchainAccountIsm": "0xBF2C366530C1269d531707154948494D3fF4AcA7", "interchainAccountRouter": "0xBdf49bE2201A1c4B13023F0a407196C6Adb32680", "interchainGasPaymaster": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", - "interchainSecurityModule": "0x6895eF0fd1A2Be31eFDf626E37CEc8C234C9f515", + "interchainSecurityModule": "0xa6570241124A6534801d1eba13F46078Dc7d1974", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72", "pausableHook": "0xc76E477437065093D353b7d56c81ff54D167B0Ab", @@ -1970,7 +1970,7 @@ "interchainAccountIsm": "0x342B5630Ba1C1e4d3048E51Dad208201aF52692c", "interchainAccountRouter": "0xe036768e48Cb0D42811d2bF0748806FCcBfCd670", "interchainGasPaymaster": "0x867f2089D09903f208AeCac84E599B90E5a4A821", - "interchainSecurityModule": "0xeCd57d428E571B407AC491171ffDD6A9875efCCC", + "interchainSecurityModule": "0xbe84F098eE49c32395edA629737AD3f4c0542ADA", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xB5fB1F5410a2c2b7deD462d018541383968cB01c", "pausableHook": "0x7483faD0Bc297667664A43A064bA7c9911659f57", @@ -2029,7 +2029,7 @@ "domainRoutingIsmFactory": "0x44b764045BfDC68517e10e783E69B376cef196B2", "fallbackRoutingHook": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainGasPaymaster": "0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38", - "interchainSecurityModule": "0x16977B194B3d61aA30F70A5521ac6bbfaa4CF460", + "interchainSecurityModule": "0x3490059390DDc4de38822488A1D63B4e131D0Aaf", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x4fE19d49F45854Da50b6009258929613EC92C147", "pausableHook": "0x01812D60958798695391dacF092BAc4a715B1718", @@ -2049,6 +2049,121 @@ "index": { "from": 1915290 } + }, + "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", + "domainRoutingIsm": "0x7ca1b3fa385F3585f8ab58c0bC90A421689141B8", + "domainRoutingIsmFactory": "0x0000000000000000000000000000000000000000", + "fallbackDomainRoutingHook": "0x623f284257f133E8bE7c74f6D4D684B61FE8923a", + "fallbackRoutingHook": "0x623f284257f133E8bE7c74f6D4D684B61FE8923a", + "interchainGasPaymaster": "0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f", + "interchainSecurityModule": "0x7ca1b3fa385F3585f8ab58c0bC90A421689141B8", + "mailbox": "0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC", + "merkleTreeHook": "0x7fa6009b59F139813eA710dB5496976eE8D80E64", + "proxyAdmin": "0xfbA0c57A6BA24B5440D3e2089222099b4663B98B", + "staticAggregationHookFactory": "0x0000000000000000000000000000000000000000", + "staticAggregationIsmFactory": "0x0000000000000000000000000000000000000000", + "staticMerkleRootMultisigIsmFactory": "0x0000000000000000000000000000000000000000", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0000000000000000000000000000000000000000", + "staticMessageIdMultisigIsmFactory": "0x0000000000000000000000000000000000000000", + "staticMessageIdWeightedMultisigIsmFactory": "0x0000000000000000000000000000000000000000", + "storageGasOracle": "0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52", + "testRecipient": "0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD", + "validatorAnnounce": "0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7", + "index": { + "from": 964305 + } + }, + "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": 978658, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Treasure Topaz Testnet", + "displayNameShort": "Treasure Testnet", + "domainId": 978658, + "isTestnet": true, + "name": "treasuretopaz", + "nativeToken": { + "decimals": 18, + "name": "MAGIC", + "symbol": "MAGIC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.topaz.treasure.lol" + } + ], + "technicalStack": "zksync", + "domainRoutingIsm": "0x7ca1b3fa385F3585f8ab58c0bC90A421689141B8", + "domainRoutingIsmFactory": "0x0000000000000000000000000000000000000000", + "fallbackDomainRoutingHook": "0x623f284257f133E8bE7c74f6D4D684B61FE8923a", + "fallbackRoutingHook": "0x623f284257f133E8bE7c74f6D4D684B61FE8923a", + "interchainGasPaymaster": "0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f", + "interchainSecurityModule": "0x7ca1b3fa385F3585f8ab58c0bC90A421689141B8", + "mailbox": "0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC", + "merkleTreeHook": "0x7fa6009b59F139813eA710dB5496976eE8D80E64", + "proxyAdmin": "0xfbA0c57A6BA24B5440D3e2089222099b4663B98B", + "staticAggregationHookFactory": "0x0000000000000000000000000000000000000000", + "staticAggregationIsmFactory": "0x0000000000000000000000000000000000000000", + "staticMerkleRootMultisigIsmFactory": "0x0000000000000000000000000000000000000000", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0000000000000000000000000000000000000000", + "staticMessageIdMultisigIsmFactory": "0x0000000000000000000000000000000000000000", + "staticMessageIdWeightedMultisigIsmFactory": "0x0000000000000000000000000000000000000000", + "storageGasOracle": "0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52", + "testRecipient": "0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD", + "validatorAnnounce": "0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7", + "index": { + "from": 86008 + } } }, "defaultRpcConsensusType": "fallback" diff --git a/rust/main/helm/hyperlane-agent/templates/relayer-configmap.yaml b/rust/main/helm/hyperlane-agent/templates/relayer-configmap.yaml new file mode 100644 index 0000000000..bc16a7404f --- /dev/null +++ b/rust/main/helm/hyperlane-agent/templates/relayer-configmap.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "agent-common.fullname" . }}-relayer-configmap + labels: + {{- include "agent-common.labels" . | nindent 4 }} +data: + relayer-config.json: | +{{- toJson .Values.hyperlane.relayer.configMapConfig | nindent 4 }} diff --git a/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml b/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml index 4160e0c25b..da69543d8e 100644 --- a/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml +++ b/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml @@ -17,6 +17,7 @@ spec: metadata: annotations: checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/relayer-configmap: {{ include (print $.Template.BasePath "/relayer-configmap.yaml") . | sha256sum }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }} @@ -55,15 +56,23 @@ spec: - secretRef: name: {{ include "agent-common.fullname" . }}-relayer-secret env: - {{- include "agent-common.config-env-vars" (dict "config" .Values.hyperlane.relayer.config) | nindent 10 }} + {{- include "agent-common.config-env-vars" (dict "config" .Values.hyperlane.relayer.envConfig) | nindent 10 }} + - name: CONFIG_FILES + value: "/relayer-configmap/relayer-config.json" resources: {{- toYaml .Values.hyperlane.relayer.resources | nindent 10 }} volumeMounts: - name: state mountPath: {{ .Values.hyperlane.dbPath }} + - name: relayer-configmap + mountPath: /relayer-configmap ports: - name: metrics containerPort: {{ .Values.hyperlane.metrics.port }} + volumes: + - name: relayer-configmap + configMap: + name: {{ include "agent-common.fullname" . }}-relayer-configmap {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} diff --git a/rust/main/helm/hyperlane-agent/values.yaml b/rust/main/helm/hyperlane-agent/values.yaml index 691bb81c61..6e498dc513 100644 --- a/rust/main/helm/hyperlane-agent/values.yaml +++ b/rust/main/helm/hyperlane-agent/values.yaml @@ -114,10 +114,9 @@ hyperlane: requests: cpu: 1000m memory: 1024Mi - config: + envConfig: relayChains: '' - multisigCheckpointSyncer: - checkpointSyncers: + configMapConfig: {} # -- Specify whether a default signer key is used for all chains in Values.hyperlane.relayerChains list. # It affects chains whose signer type is hexKey. usingDefaultSignerKey: true diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/rate_limited.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/rate_limited.rs index 242028acb4..9428d6bfd4 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/rate_limited.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/rate_limited.rs @@ -78,7 +78,7 @@ pub enum SyncDirection { /// performed by `next_action`. pub(crate) struct RateLimitedContractSyncCursor { indexer: Arc>, - db: Arc>, + store: Arc>, tip: u32, last_tip_update: Instant, eta_calculator: SyncerEtaCalculator, @@ -89,14 +89,14 @@ impl RateLimitedContractSyncCursor { /// Construct a new contract sync helper. pub async fn new( indexer: Arc>, - db: Arc>, + store: Arc>, chunk_size: u32, initial_height: u32, ) -> Result { let tip = indexer.get_finalized_block_number().await?; Ok(Self { indexer, - db, + store, tip, last_tip_update: Instant::now(), eta_calculator: SyncerEtaCalculator::new(initial_height, tip, ETA_TIME_WINDOW), @@ -189,7 +189,7 @@ where ) -> Result<()> { // Store a relatively conservative view of the high watermark, which should allow a single watermark to be // safely shared across multiple cursors, so long as they are running sufficiently in sync - self.db + self.store .store_high_watermark(u32::max( self.sync_state.start_block, self.sync_state diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/backward.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/backward.rs index e74b99b3e1..33e9b22016 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/backward.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/backward.rs @@ -24,8 +24,8 @@ pub(crate) struct BackwardSequenceAwareSyncCursor { /// If in sequence mode, this is the max number of sequences to query. /// If in block mode, this is the max number of blocks to query. chunk_size: u32, - /// A DB used to check which logs have already been indexed. - db: Arc>, + /// A store used to check which logs have already been indexed. + store: Arc>, /// A snapshot of the last log to be indexed, or if no indexing has occurred yet, /// the initial log to start indexing backward from. last_indexed_snapshot: LastIndexedSnapshot, @@ -51,14 +51,14 @@ impl Debug for BackwardSequenceAwareSyncCursor { impl BackwardSequenceAwareSyncCursor { #[instrument( - skip(db), + skip(store), fields(chunk_size, next_sequence, start_block, index_mode), ret )] pub fn new( chain_name: &str, chunk_size: u32, - db: Arc>, + store: Arc>, current_sequence_count: u32, start_block: u32, index_mode: IndexMode, @@ -74,7 +74,7 @@ impl BackwardSequenceAwareSyncCursor { Self { chain_name: chain_name.to_string(), chunk_size, - db, + store, current_indexing_snapshot: last_indexed_snapshot.previous_target(), last_indexed_snapshot, index_mode, @@ -171,10 +171,10 @@ impl BackwardSequenceAwareSyncCursor { /// log for the sequence number hasn't been indexed. async fn get_sequence_log_block_number(&self, sequence: u32) -> Result> { // Ensure there's a full entry for the sequence. - if self.db.retrieve_by_sequence(sequence).await?.is_some() { + if self.store.retrieve_by_sequence(sequence).await?.is_some() { // And get the block number. if let Some(block_number) = self - .db + .store .retrieve_log_block_number_by_sequence(sequence) .await? { diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs index 583abc3b88..d03b126a53 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/forward.rs @@ -29,8 +29,8 @@ pub(crate) struct ForwardSequenceAwareSyncCursor { /// This is used to check if there are new logs to index and to /// establish targets to index towards. latest_sequence_querier: Arc>, - /// A DB used to check which logs have already been indexed. - db: Arc>, + /// A store used to check which logs have already been indexed. + store: Arc>, /// A snapshot of the last indexed log, or if no indexing has occurred yet, /// the initial log to start indexing forward from. last_indexed_snapshot: LastIndexedSnapshot, @@ -58,7 +58,7 @@ impl Debug for ForwardSequenceAwareSyncCursor { impl ForwardSequenceAwareSyncCursor { #[instrument( - skip(db, latest_sequence_querier), + skip(store, latest_sequence_querier), fields(chunk_size, next_sequence, start_block, index_mode), ret )] @@ -66,7 +66,7 @@ impl ForwardSequenceAwareSyncCursor { chain_name: &str, chunk_size: u32, latest_sequence_querier: Arc>, - db: Arc>, + store: Arc>, next_sequence: u32, start_block: u32, index_mode: IndexMode, @@ -82,7 +82,7 @@ impl ForwardSequenceAwareSyncCursor { chain_name: chain_name.to_string(), chunk_size, latest_sequence_querier, - db, + store, last_indexed_snapshot, current_indexing_snapshot: TargetSnapshot { sequence: next_sequence, @@ -226,10 +226,10 @@ impl ForwardSequenceAwareSyncCursor { /// log for the sequence number hasn't been indexed. async fn get_sequence_log_block_number(&self, sequence: u32) -> Result> { // Ensure there's a full entry for the sequence. - if self.db.retrieve_by_sequence(sequence).await?.is_some() { + if self.store.retrieve_by_sequence(sequence).await?.is_some() { // And get the block number. if let Some(block_number) = self - .db + .store .retrieve_log_block_number_by_sequence(sequence) .await? { diff --git a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/mod.rs b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/mod.rs index 85fb05f5d6..ecef4115c3 100644 --- a/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/mod.rs +++ b/rust/main/hyperlane-base/src/contract_sync/cursors/sequence_aware/mod.rs @@ -74,7 +74,7 @@ impl ForwardBackwardSequenceAwareSyncCursor { pub async fn new( chain_name: &str, latest_sequence_querier: Arc>, - db: Arc>, + store: Arc>, chunk_size: u32, mode: IndexMode, ) -> Result { @@ -88,19 +88,13 @@ impl ForwardBackwardSequenceAwareSyncCursor { chain_name, chunk_size, latest_sequence_querier.clone(), - db.clone(), - sequence_count, - tip, - mode, - ); - let backward_cursor = BackwardSequenceAwareSyncCursor::new( - chain_name, - chunk_size, - db, + store.clone(), sequence_count, tip, mode, ); + let backward_cursor = + BackwardSequenceAwareSyncCursor::new(chunk_size, store, sequence_count, tip, mode); Ok(Self { forward: forward_cursor, backward: backward_cursor, diff --git a/rust/main/hyperlane-base/src/contract_sync/mod.rs b/rust/main/hyperlane-base/src/contract_sync/mod.rs index 0db4bc7efa..74b3df9aa6 100644 --- a/rust/main/hyperlane-base/src/contract_sync/mod.rs +++ b/rust/main/hyperlane-base/src/contract_sync/mod.rs @@ -43,21 +43,26 @@ struct IndexedTxIdAndSequence { /// Extracts chain-specific data (emitted checkpoints, messages, etc) from an /// `indexer` and fills the agent's db with this data. #[derive(Debug)] -pub struct ContractSync, I: Indexer> { +pub struct ContractSync, I: Indexer> { domain: HyperlaneDomain, - db: D, + store: S, indexer: I, metrics: ContractSyncMetrics, broadcast_sender: Option>, _phantom: PhantomData, } -impl, I: Indexer> ContractSync { +impl, I: Indexer> ContractSync { /// Create a new ContractSync - pub fn new(domain: HyperlaneDomain, db: D, indexer: I, metrics: ContractSyncMetrics) -> Self { + pub fn new( + domain: HyperlaneDomain, + store: S, + indexer: I, + metrics: ContractSyncMetrics, + ) -> Self { Self { domain, - db, + store, indexer, metrics, broadcast_sender: T::broadcast_channel_size().map(BroadcastMpscSender::new), @@ -66,10 +71,10 @@ impl, I: Indexer> ContractSync } } -impl ContractSync +impl ContractSync where T: Indexable + Debug + Send + Sync + Clone + Eq + Hash + 'static, - D: HyperlaneLogStore, + S: HyperlaneLogStore, I: Indexer + 'static, { /// The domain that this ContractSync is running on @@ -222,7 +227,7 @@ where let logs = Vec::from_iter(deduped_logs); // Store deliveries - let stored = match self.db.store_logs(&logs).await { + let stored = match self.store.store_logs(&logs).await { Ok(stored) => stored, Err(err) => { warn!(?err, "Error storing logs in db"); @@ -299,7 +304,7 @@ where &self, index_settings: IndexSettings, ) -> Result>> { - let watermark = self.db.retrieve_high_watermark().await.unwrap(); + let watermark = self.store.retrieve_high_watermark().await.unwrap(); let index_settings = IndexSettings { chain_name: index_settings.chain_name, from: watermark.unwrap_or(index_settings.from), @@ -309,7 +314,7 @@ where Ok(Box::new( RateLimitedContractSyncCursor::new( Arc::new(self.indexer.clone()), - self.db.clone(), + self.store.clone(), index_settings.chunk_size, index_settings.from, ) @@ -351,7 +356,7 @@ where ForwardBackwardSequenceAwareSyncCursor::new( index_settings.chain_name.as_str(), self.indexer.clone(), - Arc::new(self.db.clone()), + Arc::new(self.store.clone()), index_settings.chunk_size, index_settings.mode, ) diff --git a/rust/main/hyperlane-base/src/metrics/agent_metrics.rs b/rust/main/hyperlane-base/src/metrics/agent_metrics.rs index 16fd8fb9f9..ad1320488f 100644 --- a/rust/main/hyperlane-base/src/metrics/agent_metrics.rs +++ b/rust/main/hyperlane-base/src/metrics/agent_metrics.rs @@ -214,7 +214,7 @@ impl MetricsUpdater { let chain_metrics = match self.provider.get_chain_metrics().await { Ok(Some(chain_metrics)) => chain_metrics, Err(err) => { - trace!(chain, ?err, "Failed to get chain metrics"); + warn!(chain, ?err, "Failed to get chain metrics"); return; } _ => { diff --git a/rust/main/hyperlane-base/src/settings/base.rs b/rust/main/hyperlane-base/src/settings/base.rs index 9cbbb444e5..4be5baba45 100644 --- a/rust/main/hyperlane-base/src/settings/base.rs +++ b/rust/main/hyperlane-base/src/settings/base.rs @@ -151,49 +151,53 @@ impl Settings { build_contract_fns!(build_validator_announce, build_validator_announces -> dyn ValidatorAnnounce); build_contract_fns!(build_provider, build_providers -> dyn HyperlaneProvider); - /// Build a contract sync for type `T` using log store `D` - pub async fn sequenced_contract_sync( + /// Build a contract sync for type `T` using log store `S` + pub async fn sequenced_contract_sync( &self, domain: &HyperlaneDomain, metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, - db: Arc, + store: Arc, + advanced_log_meta: bool, ) -> eyre::Result>> where T: Indexable + Debug, SequenceIndexer: TryFromWithMetrics, - D: HyperlaneLogStore + HyperlaneSequenceAwareIndexerStoreReader + 'static, + S: HyperlaneLogStore + HyperlaneSequenceAwareIndexerStoreReader + 'static, { let setup = self.chain_setup(domain)?; // Currently, all indexers are of the `SequenceIndexer` type - let indexer = SequenceIndexer::::try_from_with_metrics(setup, metrics).await?; + let indexer = + SequenceIndexer::::try_from_with_metrics(setup, metrics, advanced_log_meta).await?; Ok(Arc::new(ContractSync::new( domain.clone(), - db.clone() as SequenceAwareLogStore<_>, + store.clone() as SequenceAwareLogStore<_>, indexer, sync_metrics.clone(), ))) } - /// Build a contract sync for type `T` using log store `D` - pub async fn watermark_contract_sync( + /// Build a contract sync for type `T` using log store `S` + pub async fn watermark_contract_sync( &self, domain: &HyperlaneDomain, metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, - db: Arc, + store: Arc, + advanced_log_meta: bool, ) -> eyre::Result>> where T: Indexable + Debug, SequenceIndexer: TryFromWithMetrics, - D: HyperlaneLogStore + HyperlaneWatermarkedLogStore + 'static, + S: HyperlaneLogStore + HyperlaneWatermarkedLogStore + 'static, { let setup = self.chain_setup(domain)?; // Currently, all indexers are of the `SequenceIndexer` type - let indexer = SequenceIndexer::::try_from_with_metrics(setup, metrics).await?; + let indexer = + SequenceIndexer::::try_from_with_metrics(setup, metrics, advanced_log_meta).await?; Ok(Arc::new(ContractSync::new( domain.clone(), - db.clone() as WatermarkLogStore<_>, + store.clone() as WatermarkLogStore<_>, indexer, sync_metrics.clone(), ))) @@ -202,17 +206,18 @@ impl Settings { /// Build multiple contract syncs. /// All contracts have to implement both sequenced and /// watermark trait bounds - pub async fn contract_syncs( + pub async fn contract_syncs( &self, domains: impl Iterator, metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, - dbs: HashMap>, + stores: HashMap>, + advanced_log_meta: bool, ) -> Result>>> where T: Indexable + Debug + Send + Sync + Clone + Eq + Hash + 'static, SequenceIndexer: TryFromWithMetrics, - D: HyperlaneLogStore + S: HyperlaneLogStore + HyperlaneSequenceAwareIndexerStoreReader + HyperlaneWatermarkedLogStore + 'static, @@ -226,7 +231,8 @@ impl Settings { domain, metrics, sync_metrics, - dbs.get(domain).unwrap().clone(), + stores.get(domain).unwrap().clone(), + advanced_log_meta, ) .await .map(|r| r as Arc>)?, @@ -235,7 +241,8 @@ impl Settings { domain, metrics, sync_metrics, - dbs.get(domain).unwrap().clone(), + stores.get(domain).unwrap().clone(), + advanced_log_meta, ) .await .map(|r| r as Arc>)?, diff --git a/rust/main/hyperlane-base/src/settings/chains.rs b/rust/main/hyperlane-base/src/settings/chains.rs index 3f9e863636..2a8396bb6f 100644 --- a/rust/main/hyperlane-base/src/settings/chains.rs +++ b/rust/main/hyperlane-base/src/settings/chains.rs @@ -33,7 +33,11 @@ use super::ChainSigner; #[async_trait] pub trait TryFromWithMetrics: Sized { /// Try to convert the chain configuration into the type - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result; + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result; } /// A chain setup is a domain ID, an address on that chain (where the mailbox is @@ -72,22 +76,38 @@ pub type MerkleTreeHookIndexer = Arc for MessageIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_message_indexer(metrics).await.map(Into::into) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_message_indexer(metrics, advanced_log_meta) + .await + .map(Into::into) } } #[async_trait] impl TryFromWithMetrics for DeliveryIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_delivery_indexer(metrics).await.map(Into::into) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_delivery_indexer(metrics, advanced_log_meta) + .await + .map(Into::into) } } #[async_trait] impl TryFromWithMetrics for IgpIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_interchain_gas_payment_indexer(metrics) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_interchain_gas_payment_indexer(metrics, advanced_log_meta) .await .map(Into::into) } @@ -95,8 +115,12 @@ impl TryFromWithMetrics for IgpIndexer { #[async_trait] impl TryFromWithMetrics for MerkleTreeHookIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_merkle_tree_hook_indexer(metrics) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_merkle_tree_hook_indexer(metrics, advanced_log_meta) .await .map(Into::into) } @@ -269,6 +293,7 @@ impl ChainConf { pub async fn build_message_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building delivery indexer"; let locator = self.locator(self.addresses.mailbox); @@ -287,7 +312,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { @@ -309,6 +338,7 @@ impl ChainConf { pub async fn build_delivery_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building delivery indexer"; let locator = self.locator(self.addresses.mailbox); @@ -327,7 +357,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { @@ -388,6 +422,7 @@ impl ChainConf { pub async fn build_interchain_gas_payment_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building IGP indexer"; let locator = self.locator(self.addresses.interchain_gas_paymaster); @@ -410,7 +445,12 @@ impl ChainConf { ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let indexer = Box::new( - h_sealevel::SealevelInterchainGasPaymasterIndexer::new(conf, locator).await?, + h_sealevel::SealevelInterchainGasPaymasterIndexer::new( + conf, + locator, + advanced_log_meta, + ) + .await?, ); Ok(indexer as Box>) } @@ -431,6 +471,7 @@ impl ChainConf { pub async fn build_merkle_tree_hook_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building merkle tree hook indexer"; let locator = self.locator(self.addresses.merkle_tree_hook); @@ -449,8 +490,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let mailbox_indexer = - Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let mailbox_indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); let indexer = Box::new(h_sealevel::SealevelMerkleTreeHookIndexer::new( *mailbox_indexer, )); diff --git a/rust/main/hyperlane-base/src/settings/signers.rs b/rust/main/hyperlane-base/src/settings/signers.rs index 05065dd988..248f69250a 100644 --- a/rust/main/hyperlane-base/src/settings/signers.rs +++ b/rust/main/hyperlane-base/src/settings/signers.rs @@ -126,10 +126,9 @@ impl BuildableWithSignerConf for Keypair { if let SignerConf::HexKey { key } = conf { let secret = SecretKey::from_bytes(key.as_bytes()) .context("Invalid sealevel ed25519 secret key")?; - Ok( - Keypair::from_bytes(&ed25519_dalek::Keypair::from(secret).to_bytes()) - .context("Unable to create Keypair")?, - ) + let public = ed25519_dalek::PublicKey::from(&secret); + let dalek = ed25519_dalek::Keypair { secret, public }; + Ok(Keypair::from_bytes(&dalek.to_bytes()).context("Unable to create Keypair")?) } else { bail!(format!("{conf:?} key is not supported by sealevel")); } diff --git a/rust/main/hyperlane-core/src/traits/db.rs b/rust/main/hyperlane-core/src/traits/db.rs index 92c0c15f7b..6bef9781d9 100644 --- a/rust/main/hyperlane-core/src/traits/db.rs +++ b/rust/main/hyperlane-core/src/traits/db.rs @@ -42,8 +42,8 @@ pub trait HyperlaneSequenceAwareIndexerStore: } /// Auto-impl for HyperlaneSequenceAwareIndexerStore -impl HyperlaneSequenceAwareIndexerStore for U where - U: HyperlaneLogStore + HyperlaneSequenceAwareIndexerStoreReader + Send + Sync + Debug +impl HyperlaneSequenceAwareIndexerStore for S where + S: HyperlaneLogStore + HyperlaneSequenceAwareIndexerStoreReader + Send + Sync + Debug { } diff --git a/rust/main/hyperlane-core/src/types/message.rs b/rust/main/hyperlane-core/src/types/message.rs index 576e1eb48b..359c024c15 100644 --- a/rust/main/hyperlane-core/src/types/message.rs +++ b/rust/main/hyperlane-core/src/types/message.rs @@ -74,12 +74,7 @@ impl Debug for HyperlaneMessage { impl Display for HyperlaneMessage { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!( - f, - "HyperlaneMessage {{ id: {:?}, nonce: {}, .. }}", - self.id(), - self.nonce - ) + Debug::fmt(self, f) } } diff --git a/rust/rust-toolchain b/rust/rust-toolchain deleted file mode 100644 index 83e24cc566..0000000000 --- a/rust/rust-toolchain +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "1.72.1" -profile = "default" diff --git a/rust/sealevel/Cargo.lock b/rust/sealevel/Cargo.lock index 81beeb35b3..7462ad6c98 100644 --- a/rust/sealevel/Cargo.lock +++ b/rust/sealevel/Cargo.lock @@ -743,9 +743,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] @@ -1254,6 +1254,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "dialoguer" version = "0.10.4" @@ -1405,7 +1425,8 @@ dependencies = [ [[package]] name = "ed25519-dalek" version = "1.0.1" -source = "git+https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek?branch=main#7529d65506147b6cb24ca6d8f4fc062cac33b395" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ "curve25519-dalek", "ed25519", @@ -2385,7 +2406,7 @@ dependencies = [ "bytes", "convert_case 0.6.0", "derive-new", - "derive_more", + "derive_more 0.99.17", "eyre", "fixed-hash 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "getrandom 0.2.15", @@ -4538,26 +4559,26 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.3" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +checksum = "1aa7ffc1c0ef49b0452c6e2986abf2b07743320641ffd5fc63d552458e3b779b" dependencies = [ "cfg-if", - "derive_more", + "derive_more 1.0.0", "parity-scale-codec", "scale-info-derive", ] [[package]] name = "scale-info-derive" -version = "2.11.3" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +checksum = "46385cc24172cf615450267463f937c10072516359b3ff1cb24228a4a08bf951" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] @@ -4903,7 +4924,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "Inflector", "base64 0.13.1", @@ -4927,7 +4948,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "bytemuck", @@ -4947,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-banks-client" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "borsh", "futures", @@ -4963,7 +4984,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "serde", "solana-sdk", @@ -4973,7 +4994,7 @@ dependencies = [ [[package]] name = "solana-banks-server" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "crossbeam-channel", @@ -4992,7 +5013,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "byteorder", @@ -5010,7 +5031,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "memmap2", @@ -5024,7 +5045,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "chrono", "clap 2.34.0", @@ -5041,7 +5062,7 @@ dependencies = [ [[package]] name = "solana-cli-config" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "dirs-next", "lazy_static", @@ -5056,7 +5077,7 @@ dependencies = [ [[package]] name = "solana-client" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "async-mutex", "async-trait", @@ -5109,7 +5130,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5118,7 +5139,7 @@ dependencies = [ [[package]] name = "solana-config-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "chrono", @@ -5131,7 +5152,7 @@ dependencies = [ [[package]] name = "solana-faucet" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "byteorder", @@ -5154,7 +5175,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "ahash", "blake3", @@ -5187,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -5198,7 +5219,7 @@ dependencies = [ [[package]] name = "solana-logger" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "env_logger 0.9.3", "lazy_static", @@ -5208,7 +5229,7 @@ dependencies = [ [[package]] name = "solana-measure" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "solana-sdk", @@ -5217,7 +5238,7 @@ dependencies = [ [[package]] name = "solana-metrics" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "gethostname", @@ -5230,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-net-utils" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "clap 3.2.25", @@ -5251,7 +5272,7 @@ dependencies = [ [[package]] name = "solana-perf" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "ahash", "bincode", @@ -5277,7 +5298,7 @@ dependencies = [ [[package]] name = "solana-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "base64 0.13.1", "bincode", @@ -5325,7 +5346,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "base64 0.13.1", "bincode", @@ -5351,7 +5372,7 @@ dependencies = [ [[package]] name = "solana-program-test" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "assert_matches", "async-trait", @@ -5375,7 +5396,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "lazy_static", "num_cpus", @@ -5384,7 +5405,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "console", "dialoguer", @@ -5402,7 +5423,7 @@ dependencies = [ [[package]] name = "solana-runtime" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "arrayref", "bincode", @@ -5462,7 +5483,7 @@ dependencies = [ [[package]] name = "solana-sdk" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "assert_matches", "base64 0.13.1", @@ -5512,7 +5533,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bs58 0.4.0", "proc-macro2 1.0.86", @@ -5524,7 +5545,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "log", @@ -5538,7 +5559,7 @@ dependencies = [ [[package]] name = "solana-stake-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "log", @@ -5560,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-streamer" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "futures-util", @@ -5588,7 +5609,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "Inflector", "base64 0.13.1", @@ -5616,7 +5637,7 @@ dependencies = [ [[package]] name = "solana-version" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "rustc_version", @@ -5631,7 +5652,7 @@ dependencies = [ [[package]] name = "solana-vote-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "log", @@ -5651,7 +5672,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bytemuck", "getrandom 0.1.16", @@ -5665,7 +5686,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "aes-gcm-siv", "arrayref", @@ -6304,9 +6325,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap 2.5.0", "toml_datetime", @@ -6943,9 +6964,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] diff --git a/rust/sealevel/Cargo.toml b/rust/sealevel/Cargo.toml index 5887dc8d17..145b9bfcc2 100644 --- a/rust/sealevel/Cargo.toml +++ b/rust/sealevel/Cargo.toml @@ -256,11 +256,6 @@ branch = "v3.2.2-relax-zeroize" git = "https://github.com/Eclipse-Laboratories-Inc/curve25519-dalek" version = "3.2.2" -[patch.crates-io.ed25519-dalek] -branch = "main" -git = "https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek" -version = "1.0.1" - [patch.crates-io.primitive-types] branch = "hyperlane" git = "https://github.com/hyperlane-xyz/parity-common.git" @@ -273,62 +268,52 @@ version = "=0.5.2" [patch.crates-io.solana-account-decoder] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-banks-client] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" -version = "=1.14.13" - -[patch.crates-io.solana-banks-interface] -git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" -version = "=1.14.13" - -[patch.crates-io.solana-banks-server] -git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-clap-utils] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-cli-config] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-client] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-program] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-program-test] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-sdk] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-transaction-status] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-zk-token-sdk] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.spl-associated-token-account] diff --git a/rust/sealevel/libraries/test-utils/src/igp.rs b/rust/sealevel/libraries/test-utils/src/igp.rs index 70e5100067..3ff20da1b3 100644 --- a/rust/sealevel/libraries/test-utils/src/igp.rs +++ b/rust/sealevel/libraries/test-utils/src/igp.rs @@ -49,7 +49,7 @@ pub async fn initialize_igp_accounts( GasOracle::RemoteGasData(RemoteGasData { token_exchange_rate: TOKEN_EXCHANGE_RATE_SCALE, gas_price: 1u128, - /// The number of decimals for the remote token. + // The number of decimals for the remote token. token_decimals: SOL_DECIMALS, }), None, diff --git a/rust/sealevel/programs/hyperlane-sealevel-igp/src/instruction.rs b/rust/sealevel/programs/hyperlane-sealevel-igp/src/instruction.rs index a4fb519846..3dd26948d8 100644 --- a/rust/sealevel/programs/hyperlane-sealevel-igp/src/instruction.rs +++ b/rust/sealevel/programs/hyperlane-sealevel-igp/src/instruction.rs @@ -41,6 +41,19 @@ pub enum Instruction { Claim, } +impl Instruction { + /// Deserializes an instruction from a slice. + pub fn from_instruction_data(data: &[u8]) -> Result { + Self::try_from_slice(data).map_err(|_| ProgramError::InvalidInstructionData) + } + + /// Serializes an instruction into a vector of bytes. + pub fn into_instruction_data(self) -> Result, ProgramError> { + self.try_to_vec() + .map_err(|err| ProgramError::BorshIoError(err.to_string())) + } +} + /// Initializes an IGP. #[derive(BorshDeserialize, BorshSerialize, Debug, PartialEq)] pub struct InitIgp { diff --git a/rust/sealevel/programs/hyperlane-sealevel-token/src/processor.rs b/rust/sealevel/programs/hyperlane-sealevel-token/src/processor.rs index f203a1e4e6..3e7314bc62 100644 --- a/rust/sealevel/programs/hyperlane-sealevel-token/src/processor.rs +++ b/rust/sealevel/programs/hyperlane-sealevel-token/src/processor.rs @@ -120,10 +120,9 @@ fn initialize(program_id: &Pubkey, accounts: &[AccountInfo], init: Init) -> Prog /// 12. `[]` OPTIONAL - The Overhead IGP program, if the configured IGP is an Overhead IGP. /// 13. `[writeable]` The IGP account. /// ---- End if ---- -/// 14. `[signer]` The token sender. -/// 15. `[executable]` The spl_token_2022 program. -/// 16. `[writeable]` The mint / mint authority PDA account. -/// 17. `[writeable]` The token sender's associated token account, from which tokens will be burned. +/// 14. `[executable]` The spl_token_2022 program. +/// 15. `[writeable]` The mint / mint authority PDA account. +/// 16. `[writeable]` The token sender's associated token account, from which tokens will be burned. fn transfer_remote( program_id: &Pubkey, accounts: &[AccountInfo], diff --git a/rust/sealevel/rust-toolchain b/rust/sealevel/rust-toolchain index 83e24cc566..1c8cfba9f5 100644 --- a/rust/sealevel/rust-toolchain +++ b/rust/sealevel/rust-toolchain @@ -1,3 +1,3 @@ [toolchain] -channel = "1.72.1" +channel = "1.75.0" profile = "default" diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index 2b70890ef1..0ba5c201ec 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,24 @@ # @hyperlane-xyz/core +## 5.8.1 + +### Patch Changes + +- Updated dependencies [0e285a443] + - @hyperlane-xyz/utils@7.1.0 + +## 5.8.0 + +### Minor Changes + +- 836060240: Add storage based multisig ISM types + +### Patch Changes + +- Updated dependencies [f48cf8766] +- Updated dependencies [e6f9d5c4f] + - @hyperlane-xyz/utils@7.0.0 + ## 5.7.1 ### Patch Changes diff --git a/solidity/contracts/PackageVersioned.sol b/solidity/contracts/PackageVersioned.sol index f1b99b42ed..476985336d 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.7.1"; + string public constant PACKAGE_VERSION = "5.8.1"; } diff --git a/solidity/package.json b/solidity/package.json index f149645ea8..3133af1718 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.7.1", + "version": "5.8.1", "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "6.0.0", + "@hyperlane-xyz/utils": "7.1.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^v4.9.3", diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index fc4ea8aebd..5bfabb5d48 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,9 @@ # @hyperlane-xyz/ccip-server +## 7.1.0 + +## 7.0.0 + ## 6.0.0 ## 5.7.0 diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index 8c74b65faf..9089365167 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "6.0.0", + "version": "7.1.0", "description": "CCIP server", "typings": "dist/index.d.ts", "typedocMain": "src/index.ts", diff --git a/typescript/cli/.mocharc-e2e.json b/typescript/cli/.mocharc-e2e.json index ecabac62f3..0f8803e7ad 100644 --- a/typescript/cli/.mocharc-e2e.json +++ b/typescript/cli/.mocharc-e2e.json @@ -1,6 +1,5 @@ { "extensions": ["ts"], - "spec": ["src/**/*.e2e-test.ts"], "node-option": [ "experimental-specifier-resolution=node", "loader=ts-node/esm" diff --git a/typescript/cli/CHANGELOG.md b/typescript/cli/CHANGELOG.md index ff6105b0ae..9e82984e47 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,45 @@ # @hyperlane-xyz/cli +## 7.1.0 + +### Minor Changes + +- 5db46bd31: Implements persistent relayer for use in CLI + +### Patch Changes + +- Updated dependencies [6f2d50fbd] +- Updated dependencies [1159e0f4b] +- Updated dependencies [0e285a443] +- Updated dependencies [ff2b4e2fb] +- Updated dependencies [0e285a443] +- Updated dependencies [5db46bd31] +- Updated dependencies [0cd65c571] + - @hyperlane-xyz/sdk@7.1.0 + - @hyperlane-xyz/utils@7.1.0 + +## 7.0.0 + +### Minor Changes + +- fa424826c: Add support for updating the mailbox proxy admin owner +- 836060240: Add storage based multisig ISM types + +### Patch Changes + +- Updated dependencies [bbb970a44] +- Updated dependencies [fa424826c] +- Updated dependencies [f48cf8766] +- Updated dependencies [40d59a2f4] +- Updated dependencies [0264f709e] +- Updated dependencies [836060240] +- Updated dependencies [ba0122279] +- Updated dependencies [e6f9d5c4f] +- Updated dependencies [f24835438] +- Updated dependencies [5f41b1134] + - @hyperlane-xyz/sdk@7.0.0 + - @hyperlane-xyz/utils@7.0.0 + ## 6.0.0 ### Major Changes diff --git a/typescript/cli/package.json b/typescript/cli/package.json index cfb0397826..aead4269af 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,13 +1,13 @@ { "name": "@hyperlane-xyz/cli", - "version": "6.0.0", + "version": "7.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": "4.7.0", - "@hyperlane-xyz/sdk": "6.0.0", - "@hyperlane-xyz/utils": "6.0.0", + "@hyperlane-xyz/registry": "6.1.0", + "@hyperlane-xyz/sdk": "7.1.0", + "@hyperlane-xyz/utils": "7.1.0", "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", "@inquirer/prompts": "^3.0.0", diff --git a/typescript/cli/scripts/run-e2e-test.sh b/typescript/cli/scripts/run-e2e-test.sh index e398253b2e..c98fc9158f 100755 --- a/typescript/cli/scripts/run-e2e-test.sh +++ b/typescript/cli/scripts/run-e2e-test.sh @@ -3,8 +3,7 @@ function cleanup() { set +e pkill -f anvil - rm -rf /tmp/anvil2 - rm -rf /tmp/anvil3 + rm -rf ./tmp rm -f ./test-configs/anvil/chains/anvil2/addresses.yaml rm -f ./test-configs/anvil/chains/anvil3/addresses.yaml set -e @@ -17,7 +16,12 @@ anvil --chain-id 31338 -p 8555 --state /tmp/anvil2/state --gas-price 1 > /dev/nu anvil --chain-id 31347 -p 8600 --state /tmp/anvil3/state --gas-price 1 > /dev/null & echo "Running E2E tests" -yarn mocha --config .mocharc-e2e.json +if [ -n "${CLI_E2E_TEST}" ]; then + echo "Running only ${CLI_E2E_TEST} test" + yarn mocha --config .mocharc-e2e.json "src/**/${CLI_E2E_TEST}.e2e-test.ts" +else + yarn mocha --config .mocharc-e2e.json "src/**/*.e2e-test.ts" +fi cleanup diff --git a/typescript/cli/src/commands/relayer.ts b/typescript/cli/src/commands/relayer.ts index de7ae18e1e..0d7672e734 100644 --- a/typescript/cli/src/commands/relayer.ts +++ b/typescript/cli/src/commands/relayer.ts @@ -1,35 +1,94 @@ -import { HyperlaneCore, HyperlaneRelayer } from '@hyperlane-xyz/sdk'; +import { + ChainMap, + HyperlaneCore, + HyperlaneRelayer, + RelayerCacheSchema, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; import { CommandModuleWithContext } from '../context/types.js'; import { log } from '../logger.js'; +import { tryReadJson, writeJson } from '../utils/files.js'; +import { getWarpCoreConfigOrExit } from '../utils/input.js'; -import { agentTargetsCommandOption } from './options.js'; +import { + agentTargetsCommandOption, + overrideRegistryUriCommandOption, + symbolCommandOption, + warpCoreConfigCommandOption, +} from './options.js'; import { MessageOptionsArgTypes } from './send.js'; +const DEFAULT_RELAYER_CACHE = `${overrideRegistryUriCommandOption.default}/relayer-cache.json`; + export const relayerCommand: CommandModuleWithContext< - MessageOptionsArgTypes & { chains?: string } + MessageOptionsArgTypes & { + chains?: string; + cache: string; + symbol?: string; + warp?: string; + } > = { command: 'relayer', - describe: 'Run a Hyperlane message self-relayer', + describe: 'Run a Hyperlane message relayer', builder: { chains: agentTargetsCommandOption, + cache: { + describe: 'Path to relayer cache file', + type: 'string', + default: DEFAULT_RELAYER_CACHE, + }, + symbol: symbolCommandOption, + warp: warpCoreConfigCommandOption, }, - handler: async ({ context, chains }) => { - const chainsArray = chains - ? chains.split(',').map((_) => _.trim()) - : undefined; + handler: async ({ context, cache, chains, symbol, warp }) => { const chainAddresses = await context.registry.getAddresses(); const core = HyperlaneCore.fromAddressesMap( chainAddresses, context.multiProvider, ); - const relayer = new HyperlaneRelayer({ core }); + const chainsArray = + chains?.split(',').map((_) => _.trim()) ?? Object.keys(chainAddresses); + + const whitelist: ChainMap = Object.fromEntries( + chainsArray.map((chain) => [chain, []]), + ); + + // add warp route addresses to whitelist + if (symbol || warp) { + const warpRoute = await getWarpCoreConfigOrExit({ + context, + symbol, + warp, + }); + warpRoute.tokens.forEach( + ({ chainName, addressOrDenom }) => + (whitelist[chainName] = [addressOrDenom!]), + ); + } + + const relayer = new HyperlaneRelayer({ core, whitelist }); + // TODO: fix merkle hook stubbing + + const jsonCache = tryReadJson(cache); + if (jsonCache) { + try { + const parsedCache = RelayerCacheSchema.parse(jsonCache); + relayer.hydrate(parsedCache); + } catch (error) { + log(`Error hydrating cache: ${error}`); + } + } + log('Starting relayer ...'); - relayer.start(chainsArray); + relayer.start(); + process.once('SIGINT', () => { - relayer.stop(chainsArray); log('Stopping relayer ...'); + relayer.stop(); + + writeJson(cache, relayer.cache); process.exit(0); }); }, diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 79c243ca6f..37d83096a0 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -1,7 +1,7 @@ // Commands that send tx and require a key to sign. // It's useful to have this listed here so the context // middleware can request keys up front when required. -export const SIGN_COMMANDS = ['deploy', 'send', 'status', 'submit']; +export const SIGN_COMMANDS = ['deploy', 'send', 'status', 'submit', 'relayer']; export function isSignCommand(argv: any): boolean { return ( diff --git a/typescript/cli/src/config/core.ts b/typescript/cli/src/config/core.ts index 8be42113d7..92e6fc6882 100644 --- a/typescript/cli/src/config/core.ts +++ b/typescript/cli/src/config/core.ts @@ -1,6 +1,11 @@ import { stringify as yamlStringify } from 'yaml'; -import { CoreConfigSchema, HookConfig, IsmConfig } from '@hyperlane-xyz/sdk'; +import { + CoreConfigSchema, + HookConfig, + IsmConfig, + OwnableConfig, +} from '@hyperlane-xyz/sdk'; import { CommandContext } from '../context/types.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; @@ -18,6 +23,9 @@ import { } from './hooks.js'; import { createAdvancedIsmConfig, createTrustedRelayerConfig } from './ism.js'; +const ENTER_DESIRED_VALUE_MSG = 'Enter the desired'; +const SIGNER_PROMPT_LABEL = 'signer'; + export async function createCoreDeployConfig({ context, configFilePath, @@ -31,9 +39,9 @@ export async function createCoreDeployConfig({ const owner = await detectAndConfirmOrPrompt( async () => context.signer?.getAddress(), - 'Enter the desired', + ENTER_DESIRED_VALUE_MSG, 'owner address', - 'signer', + SIGNER_PROMPT_LABEL, ); const defaultIsm: IsmConfig = advanced @@ -41,6 +49,7 @@ export async function createCoreDeployConfig({ : await createTrustedRelayerConfig(context, advanced); let defaultHook: HookConfig, requiredHook: HookConfig; + let proxyAdmin: OwnableConfig; if (advanced) { defaultHook = await createHookConfig({ context, @@ -52,9 +61,20 @@ export async function createCoreDeployConfig({ selectMessage: 'Select required hook type', advanced, }); + proxyAdmin = { + owner: await detectAndConfirmOrPrompt( + async () => context.signer?.getAddress(), + ENTER_DESIRED_VALUE_MSG, + 'ProxyAdmin owner address', + SIGNER_PROMPT_LABEL, + ), + }; } else { defaultHook = await createMerkleTreeConfig(); requiredHook = await createProtocolFeeConfig(context, advanced); + proxyAdmin = { + owner, + }; } try { @@ -63,6 +83,7 @@ export async function createCoreDeployConfig({ defaultIsm, defaultHook, requiredHook, + proxyAdmin, }); logBlue(`Core config is valid, writing to file ${configFilePath}:\n`); log(indentYamlOrJson(yamlStringify(coreConfig, null, 2), 4)); diff --git a/typescript/cli/src/config/hooks.ts b/typescript/cli/src/config/hooks.ts index 0bfd8cb1f6..e8df64dc00 100644 --- a/typescript/cli/src/config/hooks.ts +++ b/typescript/cli/src/config/hooks.ts @@ -8,12 +8,12 @@ import { ChainMap, ChainMetadata, ChainName, + CoinGeckoTokenPriceGetter, HookConfig, HookConfigSchema, HookType, IgpHookConfig, MultiProtocolProvider, - getCoingeckoTokenPrices, getGasPrice, getLocalStorageGasOracleConfig, } from '@hyperlane-xyz/sdk'; @@ -305,9 +305,17 @@ async function getIgpTokenPrices( ) { const isTestnet = context.chainMetadata[Object.keys(filteredMetadata)[0]].isTestnet; - const fetchedPrices = isTestnet - ? objMap(filteredMetadata, () => '10') - : await getCoingeckoTokenPrices(filteredMetadata); + + let fetchedPrices: ChainMap; + if (isTestnet) { + fetchedPrices = objMap(filteredMetadata, () => '10'); + } else { + const tokenPriceGetter = new CoinGeckoTokenPriceGetter({ + chainMetadata: filteredMetadata, + }); + const results = await tokenPriceGetter.getAllTokenPrices(); + fetchedPrices = objMap(results, (v) => v.toString()); + } logBlue( isTestnet diff --git a/typescript/cli/src/consts.ts b/typescript/cli/src/consts.ts index 674f7dd15d..9fb27df9f2 100644 --- a/typescript/cli/src/consts.ts +++ b/typescript/cli/src/consts.ts @@ -1,5 +1,5 @@ export const MINIMUM_CORE_DEPLOY_GAS = (1e8).toString(); -export const MINIMUM_WARP_DEPLOY_GAS = (6e8).toString(); // Rough calculation through deployments to testnets with 2x buffer +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'; diff --git a/typescript/cli/src/deploy/core.ts b/typescript/cli/src/deploy/core.ts index ec1d6b2718..28ff4d50e5 100644 --- a/typescript/cli/src/deploy/core.ts +++ b/typescript/cli/src/deploy/core.ts @@ -34,6 +34,7 @@ interface DeployParams { interface ApplyParams extends DeployParams { deployedCoreAddresses: DeployedCoreAddresses; } + /** * Executes the core deploy command. */ diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index 508e18f69e..026cd594bb 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -534,7 +534,8 @@ async function updateExistingWarpRoute( ) { logBlue('Updating deployed Warp Routes'); const { multiProvider, registry } = params.context; - const addresses = await registry.getAddresses(); + const registryAddresses = + (await registry.getAddresses()) as ChainMap; const contractVerifier = new ContractVerifier( multiProvider, apiKeys, @@ -553,15 +554,13 @@ async function updateExistingWarpRoute( `Missing artifacts for ${chain}. Probably new deployment. Skipping update...`, ); - config.ismFactoryAddresses = addresses[ - chain - ] as ProxyFactoryFactoriesAddresses; const evmERC20WarpModule = new EvmERC20WarpModule( multiProvider, { config, chain, addresses: { + ...registryAddresses[chain], deployedTokenRoute: deployedConfig.addressOrDenom!, }, }, @@ -646,7 +645,9 @@ async function enrollRemoteRouters( deployedContractsMap: HyperlaneContractsMap, ): Promise { logBlue(`Enrolling deployed routers with each other...`); - const { multiProvider } = params.context; + const { multiProvider, registry } = params.context; + const registryAddresses = + (await registry.getAddresses()) as ChainMap; const deployedRoutersAddresses: ChainMap
= objMap( deployedContractsMap, (_, contracts) => getRouter(contracts).address, @@ -674,7 +675,10 @@ async function enrollRemoteRouters( const evmERC20WarpModule = new EvmERC20WarpModule(multiProvider, { config: mutatedWarpRouteConfig, chain, - addresses: { deployedTokenRoute: router.address }, + addresses: { + ...registryAddresses[chain], + deployedTokenRoute: router.address, + }, }); const otherChains = multiProvider diff --git a/typescript/cli/src/tests/commands/core.ts b/typescript/cli/src/tests/commands/core.ts index b28dbafd2c..24c9109744 100644 --- a/typescript/cli/src/tests/commands/core.ts +++ b/typescript/cli/src/tests/commands/core.ts @@ -1,5 +1,9 @@ import { $ } from 'zx'; +import { CoreConfig } from '@hyperlane-xyz/sdk'; + +import { readYamlOrJson } from '../../utils/files.js'; + import { ANVIL_KEY, REGISTRY_PATH } from './helpers.js'; /** @@ -17,3 +21,42 @@ export async function hyperlaneCoreDeploy( --verbosity debug \ --yes`; } + +/** + * Reads a Hyperlane core deployment on the specified chain using the provided config. + */ +export async function hyperlaneCoreRead(chain: string, coreOutputPath: string) { + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core read \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --chain ${chain} \ + --verbosity debug \ + --yes`; +} + +/** + * Updates a Hyperlane core deployment on the specified chain using the provided config. + */ +export async function hyperlaneCoreApply( + chain: string, + coreOutputPath: string, +) { + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core apply \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --chain ${chain} \ + --key ${ANVIL_KEY} \ + --verbosity debug \ + --yes`; +} + +/** + * Reads the Core deployment config and outputs it to specified output path. + */ +export async function readCoreConfig( + chain: string, + coreConfigPath: string, +): Promise { + await hyperlaneCoreRead(chain, coreConfigPath); + return readYamlOrJson(coreConfigPath); +} diff --git a/typescript/cli/src/tests/commands/helpers.ts b/typescript/cli/src/tests/commands/helpers.ts index 6dd76969f2..8cb6be0278 100644 --- a/typescript/cli/src/tests/commands/helpers.ts +++ b/typescript/cli/src/tests/commands/helpers.ts @@ -1,3 +1,5 @@ +import { $ } from 'zx'; + import { ERC20Test__factory, ERC4626Test__factory } from '@hyperlane-xyz/core'; import { ChainAddresses } from '@hyperlane-xyz/registry'; import { @@ -183,3 +185,26 @@ export async function sendWarpRouteMessageRoundTrip( await hyperlaneWarpSendRelay(chain1, chain2, warpCoreConfigPath); return hyperlaneWarpSendRelay(chain2, chain1, warpCoreConfigPath); } + +export async function hyperlaneSendMessage( + origin: string, + destination: string, +) { + return $`yarn workspace @hyperlane-xyz/cli run hyperlane send message \ + --registry ${REGISTRY_PATH} \ + --origin ${origin} \ + --destination ${destination} \ + --key ${ANVIL_KEY} \ + --verbosity debug \ + --yes`; +} + +export function hyperlaneRelayer(chains: string[], warp?: string) { + return $`yarn workspace @hyperlane-xyz/cli run hyperlane relayer \ + --registry ${REGISTRY_PATH} \ + --chains ${chains.join(',')} \ + --warp ${warp ?? ''} \ + --key ${ANVIL_KEY} \ + --verbosity debug \ + --yes`; +} diff --git a/typescript/cli/src/tests/commands/warp.ts b/typescript/cli/src/tests/commands/warp.ts index 3f3eec3386..dc80b6ad24 100644 --- a/typescript/cli/src/tests/commands/warp.ts +++ b/typescript/cli/src/tests/commands/warp.ts @@ -60,9 +60,10 @@ export async function hyperlaneWarpSendRelay( origin: string, destination: string, warpCorePath: string, + relay = true, ) { return $`yarn workspace @hyperlane-xyz/cli run hyperlane warp send \ - --relay \ + ${relay ? '--relay' : ''} \ --registry ${REGISTRY_PATH} \ --overrides " " \ --origin ${origin} \ diff --git a/typescript/cli/src/tests/core.e2e-test.ts b/typescript/cli/src/tests/core.e2e-test.ts new file mode 100644 index 0000000000..9d43244792 --- /dev/null +++ b/typescript/cli/src/tests/core.e2e-test.ts @@ -0,0 +1,199 @@ +import { expect } from 'chai'; +import { Signer, Wallet, ethers } from 'ethers'; + +import { ProxyAdmin__factory } from '@hyperlane-xyz/core'; +import { + CoreConfig, + ProtocolFeeHookConfig, + randomAddress, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { readYamlOrJson, writeYamlOrJson } from '../utils/files.js'; + +import { + hyperlaneCoreApply, + hyperlaneCoreDeploy, + readCoreConfig, +} from './commands/core.js'; +import { ANVIL_KEY, REGISTRY_PATH } from './commands/helpers.js'; + +const CHAIN_NAME = 'anvil2'; + +const EXAMPLES_PATH = './examples'; +const CORE_CONFIG_PATH = `${EXAMPLES_PATH}/core-config.yaml`; + +const TEMP_PATH = '/tmp'; // /temp gets removed at the end of all-test.sh +const CORE_READ_CONFIG_PATH = `${TEMP_PATH}/anvil2/core-config-read.yaml`; + +const TEST_TIMEOUT = 100_000; // Long timeout since these tests can take a while +describe('hyperlane core e2e tests', async function () { + this.timeout(TEST_TIMEOUT); + + let signer: Signer; + let initialOwnerAddress: Address; + + before(async () => { + const chainMetadata: any = readYamlOrJson( + `${REGISTRY_PATH}/chains/${CHAIN_NAME}/metadata.yaml`, + ); + + 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('core.deploy', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + await hyperlaneCoreDeploy(CHAIN_NAME, CORE_CONFIG_PATH); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + + 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, coreConfig); + + // Deploy the core contracts with the updated mailbox owner + await hyperlaneCoreDeploy(CHAIN_NAME, CORE_READ_CONFIG_PATH); + + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + + 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, coreConfig); + + // Deploy the core contracts with the updated mailbox owner + await hyperlaneCoreDeploy(CHAIN_NAME, CORE_READ_CONFIG_PATH); + + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + + 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); + }); + }); + + describe('core.apply', () => { + it('should update the mailbox owner', async () => { + await hyperlaneCoreDeploy(CHAIN_NAME, CORE_CONFIG_PATH); + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + const newOwner = randomAddress().toLowerCase(); + coreConfig.owner = newOwner; + writeYamlOrJson(CORE_READ_CONFIG_PATH, coreConfig); + await hyperlaneCoreApply(CHAIN_NAME, CORE_READ_CONFIG_PATH); + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + 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 update the ProxyAdmin to a new one for the mailbox', async () => { + await hyperlaneCoreDeploy(CHAIN_NAME, CORE_CONFIG_PATH); + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + + const proxyFactory = new ProxyAdmin__factory().connect(signer); + const deployTx = await proxyFactory.deploy(); + const newProxyAdmin = await deployTx.deployed(); + coreConfig.proxyAdmin!.address = newProxyAdmin.address; + + writeYamlOrJson(CORE_READ_CONFIG_PATH, coreConfig); + await hyperlaneCoreApply(CHAIN_NAME, CORE_READ_CONFIG_PATH); + + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + expect(updatedConfig.owner).to.equal(initialOwnerAddress); + expect(updatedConfig.proxyAdmin?.address).to.equal(newProxyAdmin.address); + // Assuming that the ProtocolFeeHook is used for deployment + expect( + (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, + ).to.equal(initialOwnerAddress); + }); + + it('should update the ProxyAdmin owner for the mailbox', async () => { + await hyperlaneCoreDeploy(CHAIN_NAME, CORE_CONFIG_PATH); + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + + const newOwner = randomAddress().toLowerCase(); + coreConfig.proxyAdmin!.owner = newOwner; + writeYamlOrJson(CORE_READ_CONFIG_PATH, coreConfig); + await hyperlaneCoreApply(CHAIN_NAME, CORE_READ_CONFIG_PATH); + + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME, + CORE_READ_CONFIG_PATH, + ); + 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/relay.e2e-test.ts b/typescript/cli/src/tests/relay.e2e-test.ts new file mode 100644 index 0000000000..3f970eed79 --- /dev/null +++ b/typescript/cli/src/tests/relay.e2e-test.ts @@ -0,0 +1,82 @@ +import { TokenType } from '@hyperlane-xyz/sdk'; + +import { writeYamlOrJson } from '../utils/files.js'; + +import { hyperlaneCoreDeploy } from './commands/core.js'; +import { + REGISTRY_PATH, + hyperlaneRelayer, + hyperlaneSendMessage, +} from './commands/helpers.js'; +import { + hyperlaneWarpDeploy, + hyperlaneWarpSendRelay, +} from './commands/warp.js'; + +const CHAIN_NAME_1 = 'anvil2'; +const CHAIN_NAME_2 = 'anvil3'; + +const SYMBOL = 'ETH'; + +const WARP_DEPLOY_OUTPUT = `${REGISTRY_PATH}/deployments/warp_routes/${SYMBOL}/${CHAIN_NAME_1}-${CHAIN_NAME_2}-config.yaml`; + +const EXAMPLES_PATH = './examples'; +const CORE_CONFIG_PATH = `${EXAMPLES_PATH}/core-config.yaml`; + +const TEST_TIMEOUT = 100_000; // Long timeout since these tests can take a while +describe('hyperlane relayer e2e tests', async function () { + this.timeout(TEST_TIMEOUT); + + before(async () => { + await hyperlaneCoreDeploy(CHAIN_NAME_1, CORE_CONFIG_PATH); + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_CONFIG_PATH); + + const warpConfig = { + anvil2: { + type: TokenType.native, + symbol: SYMBOL, + }, + anvil3: { + type: TokenType.synthetic, + symbol: SYMBOL, + }, + }; + + const warpConfigPath = './tmp/warp-route-config.yaml'; + writeYamlOrJson(warpConfigPath, warpConfig); + await hyperlaneWarpDeploy(warpConfigPath); + }); + + describe('relayer', () => { + it('should relay core messages', async () => { + const process = hyperlaneRelayer([CHAIN_NAME_1, CHAIN_NAME_2]); + + await hyperlaneSendMessage(CHAIN_NAME_1, CHAIN_NAME_2); + await hyperlaneSendMessage(CHAIN_NAME_2, CHAIN_NAME_1); + + await process.kill('SIGINT'); + }); + + it('should relay warp messages', async () => { + const process = hyperlaneRelayer( + [CHAIN_NAME_1, CHAIN_NAME_2], + WARP_DEPLOY_OUTPUT, + ); + + await hyperlaneWarpSendRelay( + CHAIN_NAME_1, + CHAIN_NAME_2, + WARP_DEPLOY_OUTPUT, + false, + ); + await hyperlaneWarpSendRelay( + CHAIN_NAME_2, + CHAIN_NAME_1, + WARP_DEPLOY_OUTPUT, + false, + ); + + await process.kill('SIGINT'); + }); + }); +}); diff --git a/typescript/cli/src/tests/warp-deploy.e2e-test.ts b/typescript/cli/src/tests/warp-deploy.e2e-test.ts index 6263f70cb7..9971878eb0 100644 --- a/typescript/cli/src/tests/warp-deploy.e2e-test.ts +++ b/typescript/cli/src/tests/warp-deploy.e2e-test.ts @@ -34,6 +34,7 @@ const WARP_CORE_CONFIG_PATH_2_3 = `${REGISTRY_PATH}/deployments/warp_routes/VAUL const TEST_TIMEOUT = 60_000; // Long timeout since these tests can take a while describe('WarpDeploy e2e tests', async function () { let chain2Addresses: ChainAddresses = {}; + let chain3Addresses: ChainAddresses = {}; let token: any; let vault: any; @@ -46,7 +47,11 @@ describe('WarpDeploy e2e tests', async function () { ANVIL_KEY, ); - await deployOrUseExistingCore(CHAIN_NAME_3, CORE_CONFIG_PATH, ANVIL_KEY); + chain3Addresses = await deployOrUseExistingCore( + CHAIN_NAME_3, + CORE_CONFIG_PATH, + ANVIL_KEY, + ); token = await deployToken(ANVIL_KEY, CHAIN_NAME_2); vault = await deploy4626Vault(ANVIL_KEY, CHAIN_NAME_2, token.address); @@ -81,8 +86,8 @@ describe('WarpDeploy e2e tests', async function () { }, [CHAIN_NAME_3]: { type: TokenType.syntheticRebase, - mailbox: chain2Addresses.mailbox, - owner: chain2Addresses.mailbox, + mailbox: chain3Addresses.mailbox, + owner: chain3Addresses.mailbox, collateralChainName: CHAIN_NAME_2, }, }; diff --git a/typescript/cli/src/utils/input.ts b/typescript/cli/src/utils/input.ts index 19b6954f57..2ccef32db8 100644 --- a/typescript/cli/src/utils/input.ts +++ b/typescript/cli/src/utils/input.ts @@ -19,14 +19,16 @@ import ansiEscapes from 'ansi-escapes'; import chalk from 'chalk'; import { ProxyAdmin__factory } from '@hyperlane-xyz/core'; -import { ChainName, DeployedOwnableConfig } from '@hyperlane-xyz/sdk'; -import { WarpCoreConfig } from '@hyperlane-xyz/sdk'; +import { + ChainName, + DeployedOwnableConfig, + WarpCoreConfig, +} from '@hyperlane-xyz/sdk'; import { Address, isAddress, rootLogger } from '@hyperlane-xyz/utils'; import { readWarpCoreConfig } from '../config/warp.js'; import { CommandContext } from '../context/types.js'; -import { logGray } from '../logger.js'; -import { logRed } from '../logger.js'; +import { logGray, logRed } from '../logger.js'; import { indentYamlOrJson } from './files.js'; import { selectRegistryWarpRoute } from './tokens.js'; diff --git a/typescript/cli/src/utils/relay.ts b/typescript/cli/src/utils/relay.ts index 51ea7bc15b..24bdc96fca 100644 --- a/typescript/cli/src/utils/relay.ts +++ b/typescript/cli/src/utils/relay.ts @@ -19,5 +19,6 @@ export function stubMerkleTreeConfig( }, }, ism: {}, + backlog: [], }); } diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index 03d6e56b4c..e882c3c6fe 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '6.0.0'; +export const VERSION = '7.1.0'; diff --git a/typescript/github-proxy/CHANGELOG.md b/typescript/github-proxy/CHANGELOG.md index c19c678dec..a522bb6d5c 100644 --- a/typescript/github-proxy/CHANGELOG.md +++ b/typescript/github-proxy/CHANGELOG.md @@ -1,5 +1,9 @@ # @hyperlane-xyz/github-proxy +## 7.1.0 + +## 7.0.0 + ## 6.0.0 ## 5.7.0 diff --git a/typescript/github-proxy/package.json b/typescript/github-proxy/package.json index 522ba3fc60..1536432c7d 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": "6.0.0", + "version": "7.1.0", "private": true, "scripts": { "deploy": "wrangler deploy", diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index d0c1e162cf..fe9c0b3da1 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,34 @@ # @hyperlane-xyz/helloworld +## 7.1.0 + +### Patch Changes + +- Updated dependencies [6f2d50fbd] +- Updated dependencies [1159e0f4b] +- Updated dependencies [ff2b4e2fb] +- Updated dependencies [0e285a443] +- Updated dependencies [5db46bd31] +- Updated dependencies [0cd65c571] + - @hyperlane-xyz/sdk@7.1.0 + - @hyperlane-xyz/core@5.8.1 + +## 7.0.0 + +### Patch Changes + +- Updated dependencies [bbb970a44] +- Updated dependencies [fa424826c] +- Updated dependencies [f48cf8766] +- Updated dependencies [40d59a2f4] +- Updated dependencies [0264f709e] +- Updated dependencies [836060240] +- Updated dependencies [ba0122279] +- Updated dependencies [f24835438] +- Updated dependencies [5f41b1134] + - @hyperlane-xyz/sdk@7.0.0 + - @hyperlane-xyz/core@5.8.0 + ## 6.0.0 ### Patch Changes diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 3e945e4948..3191ce2134 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": "6.0.0", + "version": "7.1.0", "dependencies": { - "@hyperlane-xyz/core": "5.7.1", - "@hyperlane-xyz/registry": "4.7.0", - "@hyperlane-xyz/sdk": "6.0.0", + "@hyperlane-xyz/core": "5.8.1", + "@hyperlane-xyz/registry": "6.1.0", + "@hyperlane-xyz/sdk": "7.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 5b3d0d177d..d533e66b32 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,46 @@ # @hyperlane-xyz/infra +## 7.1.0 + +### Minor Changes + +- 5db46bd31: Implements persistent relayer for use in CLI + +### Patch Changes + +- Updated dependencies [6f2d50fbd] +- Updated dependencies [1159e0f4b] +- Updated dependencies [0e285a443] +- Updated dependencies [ff2b4e2fb] +- Updated dependencies [0e285a443] +- Updated dependencies [5db46bd31] +- Updated dependencies [0cd65c571] + - @hyperlane-xyz/sdk@7.1.0 + - @hyperlane-xyz/utils@7.1.0 + - @hyperlane-xyz/helloworld@7.1.0 + +## 7.0.0 + +### Minor Changes + +- fa424826c: Add support for updating the mailbox proxy admin owner + +### Patch Changes + +- Updated dependencies [bbb970a44] +- Updated dependencies [fa424826c] +- Updated dependencies [f48cf8766] +- Updated dependencies [40d59a2f4] +- Updated dependencies [0264f709e] +- Updated dependencies [836060240] +- Updated dependencies [ba0122279] +- Updated dependencies [e6f9d5c4f] +- Updated dependencies [f24835438] +- Updated dependencies [5f41b1134] + - @hyperlane-xyz/sdk@7.0.0 + - @hyperlane-xyz/utils@7.0.0 + - @hyperlane-xyz/helloworld@7.0.0 + ## 6.0.0 ### Patch Changes diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 77d1cdb5f5..e7978e2966 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -10,34 +10,28 @@ import { getAgentChainNamesFromConfig, } from '../../../src/config/agent/agent.js'; import { - matchingList, + MetricAppContext, routerMatchingList, + senderMatchingList, + warpRouteMatchingList, } from '../../../src/config/agent/relayer.js'; import { ALL_KEY_ROLES, Role } from '../../../src/roles.js'; import { Contexts } from '../../contexts.js'; -import { getDomainId, getWarpAddresses } from '../../registry.js'; +import { getDomainId } from '../../registry.js'; import { environment } from './chains.js'; import { helloWorld } from './helloworld.js'; +import aaveSenderAddresses from './misc-artifacts/aave-sender-addresses.json'; +import merklyEthAddresses from './misc-artifacts/merkly-eth-addresses.json'; +import merklyNftAddresses from './misc-artifacts/merkly-eth-addresses.json'; +import merklyErc20Addresses from './misc-artifacts/merkly-eth-addresses.json'; +import veloMessageModuleAddresses from './misc-artifacts/velo-message-module-addresses.json'; +import veloTokenBridgeAddresses from './misc-artifacts/velo-token-bridge-addresses.json'; import { mainnet3SupportedChainNames, supportedChainNames, } from './supportedChainNames.js'; import { validatorChainConfig } from './validators.js'; -import ancient8EthereumUsdcAddresses from './warp/ancient8-USDC-addresses.json'; -import arbitrumTIAAddresses from './warp/arbitrum-TIA-addresses.json'; -import arbitrumNeutronEclipAddresses from './warp/arbitrum-neutron-eclip-addresses.json'; -import eclipseStrideTiaAddresses from './warp/eclipse-stride-TIA-addresses.json'; -import eclipseStrideStTiaAddresses from './warp/eclipse-stride-stTIA-addresses.json'; -import inevmEthereumUsdcAddresses from './warp/inevm-USDC-addresses.json'; -import inevmEthereumUsdtAddresses from './warp/inevm-USDT-addresses.json'; -import injectiveInevmInjAddresses from './warp/injective-inevm-addresses.json'; -import mantaTIAAddresses from './warp/manta-TIA-addresses.json'; -import merklyEthAddresses from './warp/merkly-eth-addresses.json'; -import renzoEzEthAddressesV3 from './warp/renzo-ezETH-addresses-v3.json'; -import victionEthereumEthAddresses from './warp/viction-ETH-addresses.json'; -import victionEthereumUsdcAddresses from './warp/viction-USDC-addresses.json'; -import victionEthereumUsdtAddresses from './warp/viction-USDT-addresses.json'; import { WarpRouteIds } from './warp/warpIds.js'; // const releaseCandidateHelloworldMatchingList = routerMatchingList( @@ -70,6 +64,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, celo: true, cheesechain: true, @@ -78,6 +73,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, eclipsemainnet: true, endurance: true, ethereum: true, @@ -130,9 +126,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< snaxchain: true, solanamainnet: true, stride: false, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, viction: true, worldchain: true, xai: true, @@ -158,6 +157,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, celo: true, cheesechain: true, @@ -166,6 +166,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, eclipsemainnet: true, endurance: true, ethereum: true, @@ -219,9 +220,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< snaxchain: true, solanamainnet: true, stride: true, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, viction: true, worldchain: true, xai: true, @@ -247,6 +251,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, celo: true, cheesechain: true, @@ -255,6 +260,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, // Cannot scrape Sealevel chains eclipsemainnet: false, endurance: true, @@ -309,9 +315,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< // Cannot scrape Sealevel chains solanamainnet: false, stride: true, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, // Has RPC non-compliance that breaks scraping. viction: false, worldchain: true, @@ -344,101 +353,65 @@ const gasPaymentEnforcement: GasPaymentEnforcement[] = [ type: GasPaymentEnforcementPolicyType.Minimum, payment: '1', matchingList: [ - // Temporarily allow Merkly ETH messages to just require some payment - // as a workaround to https://github.com/hyperlane-xyz/issues/issues/1294 - ...routerMatchingList(merklyEthAddresses), + // Temporary workaround due to funky Mantle gas amounts. { destinationDomain: getDomainId('mantle') }, ], }, - // To cover ourselves against IGP indexing issues and to ensure Nexus - // users have the best possible experience, we whitelist messages between - // warp routes that we know are certainly paying for gas. - { - type: GasPaymentEnforcementPolicyType.None, - matchingList: [ - ...routerMatchingList(injectiveInevmInjAddresses), - // As we are still indexing the IGP on Stride, temporarily whitelist - // Stride to Eclipse messages. - ...routerMatchingList(eclipseStrideTiaAddresses), - ...routerMatchingList(eclipseStrideStTiaAddresses), - ], - }, { type: GasPaymentEnforcementPolicyType.OnChainFeeQuoting, }, ]; -const metricAppContexts = [ - { - name: 'helloworld', - matchingList: routerMatchingList(helloWorld[Contexts.Hyperlane].addresses), - }, - { - name: 'injective_inevm_inj', - matchingList: routerMatchingList(injectiveInevmInjAddresses), - }, - { - name: 'inevm_ethereum_usdc', - matchingList: matchingList(inevmEthereumUsdcAddresses), - }, - { - name: 'inevm_ethereum_usdt', - matchingList: matchingList(inevmEthereumUsdtAddresses), - }, - { - name: 'viction_ethereum_eth', - matchingList: routerMatchingList(victionEthereumEthAddresses), - }, - { - name: 'viction_ethereum_usdc', - matchingList: routerMatchingList(victionEthereumUsdcAddresses), - }, - { - name: 'viction_ethereum_usdt', - matchingList: routerMatchingList(victionEthereumUsdtAddresses), - }, - { - name: 'ancient8_ethereum_usdc', - matchingList: routerMatchingList(ancient8EthereumUsdcAddresses), - }, - { - name: 'renzo_ezeth', - matchingList: matchingList(renzoEzEthAddressesV3), - }, - { - name: 'eclipse_usdc', - matchingList: matchingList( - getWarpAddresses(WarpRouteIds.EclipseEthereumSolanaUSDC), - ), - }, - { - name: 'eclipse_teth', - matchingList: matchingList( - getWarpAddresses(WarpRouteIds.EclipseEthereumTETH), - ), - }, - { - name: 'eclipse_wif', - matchingList: matchingList(getWarpAddresses(WarpRouteIds.EclipseSolanaWIF)), - }, - { - name: 'eclipse_sol', - matchingList: matchingList(getWarpAddresses(WarpRouteIds.EclipseSolanaSOL)), - }, - // Hitting max env var size limits, see https://stackoverflow.com/questions/28865473/setting-environment-variable-to-a-large-value-argument-list-too-long#answer-28865503 - // { - // name: 'merkly_erc20', - // matchingList: routerMatchingList(merklyErc20Addresses), - // }, - // { - // name: 'merkly_eth', - // matchingList: routerMatchingList(merklyErc20Addresses), - // }, - // { - // name: 'merkly_nft', - // matchingList: routerMatchingList(merklyErc20Addresses), - // }, -]; +// Gets metric app contexts, including: +// - helloworld +// - all warp routes defined in WarpRouteIds, using addresses from the registry +// - misc important applications not defined in the registry, e.g. merkly +const metricAppContextsGetter = (): MetricAppContext[] => { + const warpContexts = Object.values(WarpRouteIds).map((warpRouteId) => { + return { + name: warpRouteId, + matchingList: warpRouteMatchingList(warpRouteId), + }; + }); + + return [ + ...warpContexts, + { + name: 'helloworld', + matchingList: routerMatchingList( + helloWorld[Contexts.Hyperlane].addresses, + ), + }, + { + name: 'merkly_erc20', + matchingList: routerMatchingList(merklyErc20Addresses), + }, + { + name: 'merkly_eth', + matchingList: routerMatchingList(merklyEthAddresses), + }, + { + name: 'merkly_nft', + matchingList: routerMatchingList(merklyNftAddresses), + }, + { + name: 'velo_message_module', + matchingList: routerMatchingList(veloMessageModuleAddresses), + }, + { + name: 'velo_token_bridge', + matchingList: routerMatchingList(veloTokenBridgeAddresses), + }, + { + // https://github.com/bgd-labs/aave-delivery-infrastructure?tab=readme-ov-file#deployed-addresses + // We match on senders because the sender is always the same and + // well documented, while the recipient may be switched out and is + // more poorly documented. + name: 'aave', + matchingList: senderMatchingList(aaveSenderAddresses), + }, + ]; +}; // Resource requests are based on observed usage found in https://abacusworks.grafana.net/d/FSR9YWr7k const relayerResources = { @@ -471,16 +444,16 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '75d62ae-20241107-060707', + tag: 'e70431a-20241121-160243', }, gasPaymentEnforcement: gasPaymentEnforcement, - metricAppContexts, + metricAppContextsGetter, resources: relayerResources, }, validators: { docker: { repo, - tag: '75d62ae-20241107-060707', + tag: 'e70431a-20241121-160243', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -490,7 +463,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '75d62ae-20241107-060707', + tag: 'e70431a-20241121-160243', }, resources: scraperResources, }, @@ -505,13 +478,13 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'a64af8b-20241024-120818', + tag: '25a927d-20241114-171323', }, // We're temporarily (ab)using the RC relayer as a way to increase // message throughput. // whitelist: releaseCandidateHelloworldMatchingList, gasPaymentEnforcement, - metricAppContexts, + metricAppContextsGetter, resources: relayerResources, }, validators: { @@ -538,33 +511,10 @@ const neutron: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'b1ff48b-20241016-183301', + tag: '25a927d-20241114-171323', }, - gasPaymentEnforcement: [ - { - type: GasPaymentEnforcementPolicyType.None, - matchingList: [ - ...routerMatchingList(mantaTIAAddresses), - ...routerMatchingList(arbitrumTIAAddresses), - ...routerMatchingList(arbitrumNeutronEclipAddresses), - ], - }, - ...gasPaymentEnforcement, - ], - metricAppContexts: [ - { - name: 'manta_tia', - matchingList: routerMatchingList(mantaTIAAddresses), - }, - { - name: 'arbitrum_tia', - matchingList: routerMatchingList(arbitrumTIAAddresses), - }, - { - name: 'arbitrum_neutron_eclip', - matchingList: routerMatchingList(arbitrumNeutronEclipAddresses), - }, - ], + gasPaymentEnforcement, + metricAppContextsGetter, resources: relayerResources, }, }; diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index fddbdc762e..5f9a7348cc 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -53,6 +53,9 @@ "bob": { "validators": ["0x20f283be1eb0e81e22f51705dcb79883cfdd34aa"] }, + "boba": { + "validators": ["0xebeb92c94ca8408e73aa16fd554cb3a7df075c59"] + }, "bsc": { "validators": [ "0x570af9b7b36568c8877eebba6c6727aa9dab7268", @@ -85,6 +88,9 @@ "dogechain": { "validators": ["0xe43f742c37858746e6d7e458bc591180d0cba440"] }, + "duckchain": { + "validators": ["0x91d55fe6dac596a6735d96365e21ce4bca21d83c"] + }, "eclipsemainnet": { "validators": ["0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0"] }, @@ -278,6 +284,9 @@ "solanamainnet": { "validators": ["0x28464752829b3ea59a497fca0bdff575c534c3ff"] }, + "superseed": { + "validators": ["0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88"] + }, "superpositionmainnet": { "validators": ["0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84"] }, @@ -287,6 +296,12 @@ "tangle": { "validators": ["0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b"] }, + "unichain": { + "validators": ["0x9773a382342ebf604a2e5de0a1f462fb499e28b1"] + }, + "vana": { + "validators": ["0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534"] + }, "viction": { "validators": ["0x1f87c368f8e05a85ef9126d984a980a20930cb9c"] }, diff --git a/typescript/infra/config/environments/mainnet3/core/verification.json b/typescript/infra/config/environments/mainnet3/core/verification.json index 0a9ab38bb5..f736c706b2 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -5376,5 +5376,355 @@ "constructorArguments": "00000000000000000000000096d51cc3f7500d501baeb1a2a62bb96fa03532f8", "isProxy": false } + ], + "boba": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000120", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "superseed": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000014d2", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "unichain": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000082", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "duckchain": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000015a9", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "vana": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000005c8", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } ] } diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index 03803fefa2..262efacaab 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: '1ed620c-20241107-052148', + tag: 'e70431a-20241121-160255', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron @@ -40,6 +40,7 @@ export const keyFunderConfig: KeyFunderConfig< bitlayer: '0.002', blast: '0.2', bob: '0.2', + boba: '0.05', bsc: '5', celo: '3', cheesechain: '50', @@ -48,6 +49,7 @@ export const keyFunderConfig: KeyFunderConfig< cyber: '0.05', degenchain: '100', dogechain: '100', + duckchain: '5', endurance: '20', ethereum: '0.5', everclear: '0.05', @@ -96,9 +98,13 @@ export const keyFunderConfig: KeyFunderConfig< snaxchain: '0.05', // ignore non-evm chains stride: '0', + superseed: '0.05', superpositionmainnet: '0.05', taiko: '0.2', tangle: '2', + unichain: '0.05', + // temporarily low until we're able to fund more + vana: '0.001', viction: '3', worldchain: '0.2', xai: '20', diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index 0973b4625e..a6899a005c 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -12,7 +12,7 @@ "decimals": 9 }, "arbitrum": { - "amount": "0.01", + "amount": "0.123544", "decimals": 9 }, "arbitrumnova": { @@ -24,7 +24,7 @@ "decimals": 9 }, "astarzkevm": { - "amount": "0.105", + "amount": "0.24", "decimals": 9 }, "flame": { @@ -40,7 +40,7 @@ "decimals": 9 }, "base": { - "amount": "0.010198987", + "amount": "0.024525952", "decimals": 9 }, "bitlayer": { @@ -48,13 +48,17 @@ "decimals": 9 }, "blast": { - "amount": "0.005065432", + "amount": "0.005892268", "decimals": 9 }, "bob": { "amount": "0.001000252", "decimals": 9 }, + "boba": { + "amount": "0.001000047", + "decimals": 9 + }, "bsc": { "amount": "1.0", "decimals": 9 @@ -87,6 +91,10 @@ "amount": "250.0", "decimals": 9 }, + "duckchain": { + "amount": "10.0", + "decimals": 9 + }, "eclipsemainnet": { "amount": "0.0000001", "decimals": 1 @@ -96,7 +104,7 @@ "decimals": 9 }, "ethereum": { - "amount": "13.154482028", + "amount": "30.088451558", "decimals": 9 }, "everclear": { @@ -104,7 +112,7 @@ "decimals": 9 }, "fantom": { - "amount": "6.313597562", + "amount": "6.971582929", "decimals": 9 }, "flare": { @@ -112,7 +120,7 @@ "decimals": 9 }, "flowmainnet": { - "amount": "0.0000001", + "amount": "0.1", "decimals": 9 }, "fraxtal": { @@ -136,7 +144,7 @@ "decimals": 9 }, "immutablezkevmmainnet": { - "amount": "10.000000051", + "amount": "10.00000005", "decimals": 9 }, "inevm": { @@ -156,7 +164,7 @@ "decimals": 9 }, "linea": { - "amount": "0.327116635", + "amount": "0.548523195", "decimals": 9 }, "lisk": { @@ -164,7 +172,7 @@ "decimals": 9 }, "lukso": { - "amount": "0.323509518", + "amount": "0.475094399", "decimals": 9 }, "lumia": { @@ -172,7 +180,7 @@ "decimals": 9 }, "mantapacific": { - "amount": "0.003000426", + "amount": "0.0030005", "decimals": 9 }, "mantle": { @@ -208,7 +216,7 @@ "decimals": 9 }, "morph": { - "amount": "0.201", + "amount": "0.014614332", "decimals": 9 }, "neutron": { @@ -220,7 +228,7 @@ "decimals": 9 }, "optimism": { - "amount": "0.001000638", + "amount": "0.001065045", "decimals": 9 }, "orderly": { @@ -232,11 +240,11 @@ "decimals": 1 }, "polygon": { - "amount": "36.937366533", + "amount": "260.197309239", "decimals": 9 }, "polygonzkevm": { - "amount": "0.217", + "amount": "0.451", "decimals": 9 }, "polynomialfi": { @@ -244,7 +252,7 @@ "decimals": 9 }, "prom": { - "amount": "13.1", + "amount": "75.2", "decimals": 9 }, "proofofplay": { @@ -280,7 +288,7 @@ "decimals": 9 }, "shibarium": { - "amount": "0.542811448", + "amount": "3.89327567", "decimals": 9 }, "snaxchain": { @@ -295,24 +303,36 @@ "amount": "0.005", "decimals": 1 }, + "superseed": { + "amount": "0.001000252", + "decimals": 9 + }, "superpositionmainnet": { "amount": "0.01", "decimals": 9 }, "taiko": { - "amount": "0.1323", + "amount": "0.1243284", "decimals": 9 }, "tangle": { "amount": "1.0", "decimals": 9 }, + "unichain": { + "amount": "0.001000252", + "decimals": 9 + }, + "vana": { + "amount": "0.001000007", + "decimals": 9 + }, "viction": { "amount": "0.25", "decimals": 9 }, "worldchain": { - "amount": "0.001000279", + "amount": "0.00100026", "decimals": 9 }, "xai": { @@ -320,7 +340,7 @@ "decimals": 9 }, "xlayer": { - "amount": "10.982428125", + "amount": "23.05", "decimals": 9 }, "zeronetwork": { diff --git a/typescript/infra/config/environments/mainnet3/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index 928bceb8b5..156a5f990a 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -6916,5 +6916,435 @@ "constructorArguments": "", "isProxy": true } + ], + "superseed": [ + { + "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 + } + ], + "unichain": [ + { + "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 + } + ], + "duckchain": [ + { + "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 + } + ], + "vana": [ + { + "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 + } + ], + "boba": [ + { + "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 b940665f2c..402f7d520b 100644 --- a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json +++ b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json @@ -1680,5 +1680,110 @@ "isProxy": true, "expectedimplementation": "0x28846fCb579747E8ddad9E93b55BE51b0A1Bf1f3" } + ], + "superseed": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "boba": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "unichain": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "duckchain": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "vana": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } ] } diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/aave-sender-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/aave-sender-addresses.json new file mode 100644 index 0000000000..21cfa5eccf --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/aave-sender-addresses.json @@ -0,0 +1,38 @@ +{ + "ethereum": { + "sender": "0xEd42a7D8559a463722Ca4beD50E0Cc05a386b0e1" + }, + "polygon": { + "sender": "0xF6B99959F0b5e79E1CC7062E12aF632CEb18eF0d" + }, + "avalanche": { + "sender": "0x27FC7D54C893dA63C0AE6d57e1B2B13A70690928" + }, + "arbitrum": { + "sender": "0xCbFB78a3Eeaa611b826E37c80E4126c8787D29f0" + }, + "optimism": { + "sender": "0x48A9FE90bce5EEd790f3F4Ce192d1C0B351fd4Ca" + }, + "bsc": { + "sender": "0x9d33ee6543C9b2C8c183b8fb58fB089266cffA19" + }, + "base": { + "sender": "0x529467C76f234F2bD359d7ecF7c660A2846b04e2" + }, + "metis": { + "sender": "0x6fDaFb26915ABD6065a1E1501a37Ac438D877f70" + }, + "gnosis": { + "sender": "0x8Dc5310fc9D3D7D1Bb3D1F686899c8F082316c9F" + }, + "scroll": { + "sender": "0x03073D3F4769f6b6604d616238fD6c636C99AD0A" + }, + "polygonzkevm": { + "sender": "0xed7e0874526B9BB9E36C7e9472ed7ed324CEeE3B" + }, + "celo": { + "sender": "0x4A5f4b29C0407E5Feb323305e121f563c7bC4d79" + } +} diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-erc20-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-erc20-addresses.json new file mode 100644 index 0000000000..e54113967d --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-erc20-addresses.json @@ -0,0 +1,185 @@ +{ + "optimism": { + "router": "0x32F05f390217990404392a4DdAF39D31Db4aFf77" + }, + "celo": { + "router": "0xad8676147360dBc010504aB69C7f1b1877109527" + }, + "avalanche": { + "router": "0x904550e0D182cd4aEe0D305891c666a212EC8F01" + }, + "fuse": { + "router": "0xCd8EAE908E27b9046ca7845DA22f6d3cdf367588" + }, + "kaia": { + "router": "0xCd8EAE908E27b9046ca7845DA22f6d3cdf367588" + }, + "arbitrumnova": { + "router": "0x1753Dd0743FC555898EF486b662aa77c9CD6CCa2" + }, + "polygonzkevm": { + "router": "0x46B4eDaA761eF8d2934e9F7AAf32B5Bf2C9C9F67" + }, + "harmony": { + "router": "0xbA32747EF144B5eA6a01A18f7756034e23C998ae" + }, + "bsc": { + "router": "0x7b4f475d32f9c65de1834A578859F9823bE3c5Cf" + }, + "moonbeam": { + "router": "0xf3D41b377c93fA5C3b0071966f1811c5063fAD40" + }, + "metis": { + "router": "0xeB5108C41932b6Db7C933EEf783c651a68cB5178" + }, + "gnosis": { + "router": "0xFD34afDFbaC1E47aFC539235420e4bE4A206f26D" + }, + "coredao": { + "router": "0xE94985A7C29db999109330dfB22803A82cAb7022" + }, + "fantom": { + "router": "0xF6fF3D86D43B7967E8b03Fc169578af1C5100C61" + }, + "arbitrum": { + "router": "0xFD34afDFbaC1E47aFC539235420e4bE4A206f26D" + }, + "polygon": { + "router": "0x574E69C50e7D13B3d1B364BF0D48285A5aE2dF56" + }, + "base": { + "router": "0x5454cF5584939f7f884e95DBA33FECd6D40B8fE2" + }, + "linea": { + "router": "0xc92A74918Ebb35CA91d7029b7528e0b49fA60B47" + }, + "mantle": { + "router": "0x261e36AF8C6Cb974a468025E58f3bd39b0419275" + }, + "zoramainnet": { + "router": "0x63F0973Fe299E9635Df70C22C39B9Da0700ef0aB" + }, + "viction": { + "router": "0xb00300fCe618E049d284eb92E57582A5d15295F4" + }, + "astar": { + "router": "0x25e6cA1A7cB794835Cb83536874643ccE5c3538b" + }, + "scroll": { + "router": "0x904550e0D182cd4aEe0D305891c666a212EC8F01" + }, + "ethereum": { + "router": "0xf3D41b377c93fA5C3b0071966f1811c5063fAD40" + }, + "orderly": { + "router": "0x814490128eB60e6FCB56a38B46FC9FC37726414a" + }, + "mantapacific": { + "router": "0xb1d2B9446A9d1550e8d409C0F9745c5A2f10D332" + }, + "rarichain": { + "router": "0x9cDb9f7Ede01291556560541a1A802814cB693f9" + }, + "xai": { + "router": "0x122149a5bcB71AE690b66A71bbaf6fE5C86C6e16" + }, + "fraxtal": { + "router": "0xDE5E2bf75005422dc408ea96F22467E02cBA8c93" + }, + "mode": { + "router": "0xfD7c029D1F1198826302F5F6c9CD482c06F0D72f" + }, + "blast": { + "router": "0xd9371FFFd58D57bfC65e897e18DAF88C88ec273E" + }, + "astarzkevm": { + "router": "0x61eE60cf66F7f500fD7ed5077646ec6543837A63" + }, + "degenchain": { + "router": "0x354Fb3fC5b5102569491aA54Ded4fe8F3f803616" + }, + "merlin": { + "router": "0xCcB5eCb98F05d6A13eaA03b3a1135D155c8cb95a" + }, + "xlayer": { + "router": "0xbfD3425475dd8aF64B29424BDbC5f7957035d711" + }, + "ancient8": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "zetachain": { + "router": "0x4fc0D96f3d70b4D9b75671Ab92e7Be01CaBE3863" + }, + "redstone": { + "router": "0xc072c3EbAf165955C5aAd2DbB4293f771de6dbd3" + }, + "sei": { + "router": "0x47470579B0f2fD91a6Ed1b13bBAd0d723Eec7512" + }, + "taiko": { + "router": "0x5C5c31edD52Bc662d9A396Ffc1CA96938DA1764C" + }, + "bob": { + "router": "0x6f6aE8851a460406bBB3c929a415d2Df9305AcD5" + }, + "endurance": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "worldchain": { + "router": "0xc072c3EbAf165955C5aAd2DbB4293f771de6dbd3" + }, + "cheesechain": { + "router": "0xCd06b1563a8B4663ff8f1ccedE99F8eF4Dd99f88" + }, + "zircuit": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "kroma": { + "router": "0x6f6aE8851a460406bBB3c929a415d2Df9305AcD5" + }, + "cyber": { + "router": "0x6Ca118bdF9BD900Da5D3d85094D92C5B3b9c0DA5" + }, + "lisk": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "lukso": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "mint": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "proofofplay": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "real": { + "router": "0x6f6aE8851a460406bBB3c929a415d2Df9305AcD5" + }, + "sanko": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "tangle": { + "router": "0x6f6aE8851a460406bBB3c929a415d2Df9305AcD5" + }, + "bitlayer": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "dogechain": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "flare": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "molten": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "shibarium": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "everclear": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "morph": { + "router": "0x7dFb5E7808B5eb4fB8b9e7169537575f6fF1a218" + } +} diff --git a/typescript/infra/config/environments/mainnet3/warp/merkly-eth-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-eth-addresses.json similarity index 67% rename from typescript/infra/config/environments/mainnet3/warp/merkly-eth-addresses.json rename to typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-eth-addresses.json index c4dd7482ae..0eb22a6aba 100644 --- a/typescript/infra/config/environments/mainnet3/warp/merkly-eth-addresses.json +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-eth-addresses.json @@ -20,6 +20,12 @@ "linea": { "router": "0x8F2161c83F46B46628cb591358dE4a89A63eEABf" }, + "mantle": { + "router": "0xf4368751f99127F052AFa993aEc3C6393AcA5466" + }, + "zoramainnet": { + "router": "0x8028d4f11d10730B12Ae011474F9db8140F112F4" + }, "scroll": { "router": "0xc0faBF14f8ad908b2dCE4C8aA2e7c1a6bD069957" }, @@ -32,6 +38,9 @@ "mode": { "router": "0x9970cB23f10dBd95B8A3E643f3A6A6ABB6f3cB9b" }, + "xlayer": { + "router": "0x444791b5cA0E0BdC2De93467f430fbe925b35487" + }, "ancient8": { "router": "0x7dFb5E7808B5eb4fB8b9e7169537575f6fF1a218" }, @@ -49,5 +58,20 @@ }, "bob": { "router": "0xEF62b433Ca3AC8b151c4a255de3eD3dA4e60AdD2" + }, + "worldchain": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "zircuit": { + "router": "0xA5f471A19fdB367Ea80c4c82ecd30eA94090d549" + }, + "kroma": { + "router": "0x9f6f71f3D58aCeba796ADD5f00A893C636163BB2" + }, + "everclear": { + "router": "0xe35030B407C96C037190B63646AC1Eb34F43Cc2b" + }, + "morph": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" } } diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-nft-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-nft-addresses.json new file mode 100644 index 0000000000..6129febbc0 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-nft-addresses.json @@ -0,0 +1,185 @@ +{ + "optimism": { + "router": "0x2a5c54c625220cb2166C94DD9329be1F8785977D" + }, + "celo": { + "router": "0x7f4CFDf669d7a5d4Adb05917081634875E21Df47" + }, + "avalanche": { + "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" + }, + "fusemainnet": { + "router": "0xDED4D91f77F69DE32c6da32CE8c1905C7de03C46" + }, + "kaia": { + "router": "0x80Abe17c3Ca312f63a96D31DdE1F829e90Ee05b7" + }, + "arbitrumnova": { + "router": "0xb3ae37826ca27CeF44694d4F8975916eF193454F" + }, + "polygonzkevm": { + "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" + }, + "harmony": { + "router": "0xDED4D91f77F69DE32c6da32CE8c1905C7de03C46" + }, + "bsc": { + "router": "0xf3D41b377c93fA5C3b0071966f1811c5063fAD40" + }, + "moonbeam": { + "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" + }, + "metis": { + "router": "0xB598ECFb72207B11d7F3f8B0e4031d86a1d76381" + }, + "gnosis": { + "router": "0x7dac480d20f322d2ef108a59a465ccb5749371c4" + }, + "coredao": { + "router": "0x72FA03C5868EBFeBcA21EB963bEFc4Ae2586a422" + }, + "fantom": { + "router": "0xE9994efe91B3fCbCF343BB9bcA7e6b7251173ea0" + }, + "arbitrum": { + "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" + }, + "polygon": { + "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" + }, + "base": { + "router": "0x7dac480d20f322d2ef108a59a465ccb5749371c4" + }, + "linea": { + "router": "0xC6EDe374Df7763ad70166C4d85d8066A8fb8D272" + }, + "mantle": { + "router": "0x2F1562Cc3044B95cb969D1684a1f4E43A207476E" + }, + "zoramainnet": { + "router": "0xE95E517f9EE4b43AE198606407b6859f767De95b" + }, + "viction": { + "router": "0x80Abe17c3Ca312f63a96D31DdE1F829e90Ee05b7" + }, + "astar": { + "router": "0xcAB586182E6a3CFF18f97F2b0cb316b6879B83a5" + }, + "scroll": { + "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" + }, + "ethereum": { + "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" + }, + "orderly": { + "router": "0xfD7c029D1F1198826302F5F6c9CD482c06F0D72f" + }, + "mantapacific": { + "router": "0xc7a66e3A9d1a84dC60f8a630C3eC3D84aCFBE5EC" + }, + "rarichain": { + "router": "0xC7F09Ca5E3F5D47BedA89c0FA6E7f07De7385902" + }, + "xai": { + "router": "0x9e3dcb75d2388B1330b3Ff7e9c5b9f51EE5952F3" + }, + "fraxtal": { + "router": "0x49e6d51a220acab3b44d325edcab0f164cf48111" + }, + "mode": { + "router": "0x814490128eB60e6FCB56a38B46FC9FC37726414a" + }, + "blast": { + "router": "0xDc09f06D11dFC7703BF8f3049E2CcF4507bEA1ab" + }, + "astarzkevm": { + "router": "0x4924bFdfCfd3DB8D170c5882936396f1EB5542bB" + }, + "degenchain": { + "router": "0x85Fd2DA31262d26471c738Ce357a3767635A0956" + }, + "merlin": { + "router": "0x8796f4A273225ac8468585b1E9CFB97A0cEB6174" + }, + "xlayer": { + "router": "0x1812d05671EefA040ac605a0198476dEd081d520" + }, + "ancient8": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "zetachain": { + "router": "0x6Ca118bdF9BD900Da5D3d85094D92C5B3b9c0DA5" + }, + "redstone": { + "router": "0x6f6aE8851a460406bBB3c929a415d2Df9305AcD5" + }, + "sei": { + "router": "0x4b56f191b7F396dec4268b836845C3F63F5e2121" + }, + "taiko": { + "router": "0x6293432E8731d8267F76B90Fa82650552e7811F2" + }, + "bob": { + "router": "0xc072c3EbAf165955C5aAd2DbB4293f771de6dbd3" + }, + "endurance": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "worldchain": { + "router": "0x6f6aE8851a460406bBB3c929a415d2Df9305AcD5" + }, + "cheesechain": { + "router": "0x829761FC0d35F1d05C77EEA2B629255e94Af8F60" + }, + "zircuit": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "kroma": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "cyber": { + "router": "0xc072c3EbAf165955C5aAd2DbB4293f771de6dbd3" + }, + "lisk": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "lukso": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "mint": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "proofofplay": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "real": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "sanko": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "tangle": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "bitlayer": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "dogechain": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "flare": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "molten": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "shibarium": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + }, + "everclear": { + "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" + }, + "morph": { + "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" + } +} diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-message-module-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-message-module-addresses.json new file mode 100644 index 0000000000..9e2cc555b6 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-message-module-addresses.json @@ -0,0 +1,14 @@ +{ + "optimism": { + "router": "0xF385603a12Be8b7B885222329c581FDD1C30071D" + }, + "mode": { + "router": "0xF385603a12Be8b7B885222329c581FDD1C30071D" + }, + "lisk": { + "router": "0xF385603a12Be8b7B885222329c581FDD1C30071D" + }, + "fraxtal": { + "router": "0xF385603a12Be8b7B885222329c581FDD1C30071D" + } +} diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-token-bridge-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-token-bridge-addresses.json new file mode 100644 index 0000000000..cd9fe51149 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-token-bridge-addresses.json @@ -0,0 +1,14 @@ +{ + "optimism": { + "router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6" + }, + "mode": { + "router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6" + }, + "lisk": { + "router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6" + }, + "fraxtal": { + "router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6" + } +} diff --git a/typescript/infra/config/environments/mainnet3/owners.ts b/typescript/infra/config/environments/mainnet3/owners.ts index 4cd7567630..5fa21d9b65 100644 --- a/typescript/infra/config/environments/mainnet3/owners.ts +++ b/typescript/infra/config/environments/mainnet3/owners.ts @@ -55,6 +55,7 @@ export const safes: ChainMap
= { fusemainnet: '0x29a526227CB864C90Cf078d03872da913B473139', endurance: '0xaCD1865B262C89Fb0b50dcc8fB095330ae8F35b5', zircuit: '0x9e2fe7723b018d02cDE4f5cC1A9bC9C65b922Fc8', + zeronetwork: '0xCB21F61A3c8139F18e635d45aD1e62A4A61d2c3D', }; export const icaOwnerChain = 'ethereum'; @@ -130,18 +131,32 @@ export const icas: Partial< // ---------------------------------------------------------- // lumia: '0x418E10Ac9e0b84022d0636228d05bc74172e0e41', - // // Oct 30, 2024 batch - // // ---------------------------------------------------------- - // apechain: '0xe68b0aB6BB8c11D855556A5d3539524f6DB3bdc6', - // arbitrumnova: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', - // b3: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', - // fantom: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', - // gravity: '0x3104ADE26e21AEbdB325321433541DfE8B5dCF23', - // harmony: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', - // kaia: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', - // morph: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', - // orderly: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', - // snaxchain: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + // Oct 30, 2024 batch + // ---------------------------------------------------------- + apechain: '0xe68b0aB6BB8c11D855556A5d3539524f6DB3bdc6', + arbitrumnova: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + b3: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + fantom: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + gravity: '0x3104ADE26e21AEbdB325321433541DfE8B5dCF23', + harmony: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + kaia: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + morph: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + orderly: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + snaxchain: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837', + + // Nov 8, 2024 batch + // ---------------------------------------------------------- + alephzeroevmmainnet: '0xDE91AC081E12107a033728A287b06B1Fc640A637', + chilizmainnet: '0x54AF0FCDCD58428f8dF3f825267DfB58f2C710eb', + flowmainnet: '0x65528D447C93CC1A1A7186CB4449d9fE0d5C1928', + immutablezkevmmainnet: '0x54AF0FCDCD58428f8dF3f825267DfB58f2C710eb', + metal: '0xf1d25462e1f82BbF25b3ef7A4C94F738a30a968B', + polynomialfi: '0x6ACa36E710dC0C80400090EA0bC55dA913a3D20D', + rarichain: '0xD0A4Ad2Ca0251BBc6541f8c2a594F1A82b67F114', + rootstockmainnet: '0x0C15f7479E0B46868693568a3f1C747Fdec9f17d', + superpositionmainnet: '0x5F17Dc2e1fd1371dc6e694c51f22aBAF8E27667B', + flame: '0x4F3d85360840497Cd1bc34Ca55f27629eee2AA2e', + prom: '0x1cDd3C143387cD1FaE23e2B66bc3F409D073aC3D', } as const; export const DEPLOYER = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; @@ -178,7 +193,8 @@ export const chainOwners: ChainMap = { owner: 'BNGDJ1h9brgt6FFVd8No1TVAH48Fp44d7jkuydr1URwJ', }, eclipsemainnet: { - owner: 'B32qTbw8iDcVdagMAMBfDFCef88N1KtfRG5QoPVzbj5K', + // Squads multisig + owner: 'E4TncCw3WMqQZbkACVcomX3HqcSzLfNyhTnqKN1DimGr', }, injective: { // Native multisig diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index dddc793123..49b4228c67 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -15,6 +15,7 @@ export const mainnet3SupportedChainNames = [ 'bitlayer', 'blast', 'bob', + 'boba', 'bsc', 'celo', 'cheesechain', @@ -23,6 +24,7 @@ export const mainnet3SupportedChainNames = [ 'cyber', 'degenchain', 'dogechain', + 'duckchain', 'eclipsemainnet', 'endurance', 'ethereum', @@ -75,9 +77,12 @@ export const mainnet3SupportedChainNames = [ 'snaxchain', 'solanamainnet', 'stride', + 'superseed', 'superpositionmainnet', 'taiko', 'tangle', + 'unichain', + 'vana', 'viction', 'worldchain', 'xai', diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 1051ca61ca..905bbf0073 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,88 +1,93 @@ { - "ancient8": "2709.5", - "alephzeroevmmainnet": "0.338269", - "apechain": "1.072", - "arbitrum": "2709.5", - "arbitrumnova": "2709.5", - "astar": "0.056141", - "astarzkevm": "2709.5", - "flame": "5.14", - "avalanche": "27.18", - "b3": "2709.5", - "base": "2709.5", - "bitlayer": "75285", - "blast": "2709.5", - "bob": "2709.5", - "bsc": "595.27", - "celo": "0.639237", - "cheesechain": "0.00284839", - "chilizmainnet": "0.061694", - "coredao": "0.910171", - "cyber": "2709.5", - "degenchain": "0.00905774", - "dogechain": "0.195154", - "eclipsemainnet": "2709.5", - "endurance": "2.12", - "ethereum": "2709.5", - "everclear": "2709.5", - "fantom": "0.694411", - "flare": "0.01312677", - "flowmainnet": "0.541194", - "fraxtal": "2700.36", - "fusemainnet": "0.02836395", - "gnosis": "0.999944", - "gravity": "0.0295987", - "harmony": "0.01263325", - "immutablezkevmmainnet": "1.23", - "inevm": "21.24", - "injective": "21.24", - "kaia": "0.123184", - "kroma": "2709.5", - "linea": "2709.5", - "lisk": "2709.5", - "lukso": "1.47", - "lumia": "1.09", - "mantapacific": "2709.5", - "mantle": "0.598548", - "merlin": "75305", - "metal": "2709.5", - "metis": "44.4", - "mint": "2709.5", - "mode": "2709.5", - "molten": "0.23804", - "moonbeam": "0.166004", - "morph": "2709.5", - "neutron": "0.380957", - "oortmainnet": "0.097843", - "optimism": "2709.5", - "orderly": "2709.5", - "osmosis": "0.438116", - "polygon": "0.332225", - "polygonzkevm": "2709.5", - "polynomialfi": "2709.5", - "prom": "5.37", - "proofofplay": "2709.5", - "rarichain": "2709.5", + "ancient8": "3339.7", + "alephzeroevmmainnet": "0.323087", + "apechain": "1.15", + "arbitrum": "3339.7", + "arbitrumnova": "3339.7", + "astar": "0.065841", + "astarzkevm": "3339.7", + "flame": "5.32", + "avalanche": "35.04", + "b3": "3339.7", + "base": "3339.7", + "bitlayer": "97008", + "blast": "3339.7", + "bob": "3339.7", + "boba": "3339.7", + "bsc": "622.77", + "celo": "0.69886", + "cheesechain": "0.00180143", + "chilizmainnet": "0.074224", + "coredao": "0.954893", + "cyber": "3339.7", + "degenchain": "0.02076785", + "dogechain": "0.386856", + "duckchain": "5.5", + "eclipsemainnet": "3339.7", + "endurance": "2.34", + "ethereum": "3339.7", + "everclear": "3339.7", + "fantom": "0.718323", + "flare": "0.01997817", + "flowmainnet": "0.699342", + "fraxtal": "3330.82", + "fusemainnet": "0.03172781", + "gnosis": "0.995976", + "gravity": "0.03027443", + "harmony": "0.01537487", + "immutablezkevmmainnet": "1.35", + "inevm": "24.39", + "injective": "24.39", + "kaia": "0.148169", + "kroma": "3339.7", + "linea": "3339.7", + "lisk": "3339.7", + "lukso": "1.28", + "lumia": "1.27", + "mantapacific": "3339.7", + "mantle": "0.797424", + "merlin": "97247", + "metal": "3339.7", + "metis": "49.54", + "mint": "3339.7", + "mode": "3339.7", + "molten": "0.255266", + "moonbeam": "0.216341", + "morph": "3339.7", + "neutron": "0.440864", + "oortmainnet": "0.084942", + "optimism": "3339.7", + "orderly": "3339.7", + "osmosis": "0.543778", + "polygon": "0.449905", + "polygonzkevm": "3339.7", + "polynomialfi": "3339.7", + "prom": "5.54", + "proofofplay": "3339.7", + "rarichain": "3339.7", "real": "1", - "redstone": "2709.5", - "rootstockmainnet": "75239", - "sanko": "47.08", - "scroll": "2709.5", - "sei": "0.40953", - "shibarium": "0.393606", - "snaxchain": "2709.5", - "solanamainnet": "186.76", - "stride": "0.625491", - "superpositionmainnet": "2709.5", - "taiko": "2709.5", + "redstone": "3339.7", + "rootstockmainnet": "97164", + "sanko": "48.68", + "scroll": "3339.7", + "sei": "0.488479", + "shibarium": "0.512057", + "snaxchain": "3339.7", + "solanamainnet": "244.09", + "stride": "0.613675", + "superseed": "3339.7", + "superpositionmainnet": "3339.7", + "taiko": "3339.7", "tangle": "1", - "viction": "0.349089", - "worldchain": "2709.5", - "xai": "0.213165", - "xlayer": "39.31", - "zeronetwork": "2709.5", - "zetachain": "0.691041", - "zircuit": "2709.5", - "zksync": "2709.5", - "zoramainnet": "2709.5" + "unichain": "3339.7", + "vana": "1", + "viction": "0.399341", + "worldchain": "3339.7", + "xai": "0.241575", + "xlayer": "45.13", + "zeronetwork": "3339.7", + "zetachain": "0.66842", + "zircuit": "3339.7", + "zksync": "3339.7", + "zoramainnet": "3339.7" } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 05673abf09..e52e97ee7d 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -1140,5 +1140,56 @@ export const validatorChainConfig = ( 'prom', ), }, + + boba: { + interval: 5, + reorgPeriod: getReorgPeriod('boba'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xebeb92c94ca8408e73aa16fd554cb3a7df075c59'], + }, + 'boba', + ), + }, + duckchain: { + interval: 5, + reorgPeriod: getReorgPeriod('duckchain'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x91d55fe6dac596a6735d96365e21ce4bca21d83c'], + }, + 'duckchain', + ), + }, + superseed: { + interval: 5, + reorgPeriod: getReorgPeriod('superseed'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88'], + }, + 'superseed', + ), + }, + unichain: { + interval: 5, + reorgPeriod: getReorgPeriod('unichain'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x9773a382342ebf604a2e5de0a1f462fb499e28b1'], + }, + 'unichain', + ), + }, + vana: { + interval: 5, + reorgPeriod: getReorgPeriod('vana'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534'], + }, + 'vana', + ), + }, }; }; diff --git a/typescript/infra/config/environments/mainnet3/warp/AMPHRETH-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/AMPHRETH-deployments.yaml deleted file mode 100644 index 222a321c25..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/AMPHRETH-deployments.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -description: Hyperlane Warp Route artifacts -timestamp: '2024-10-18T14:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - arbitrum: - protocolType: ethereum - type: synthetic - hypAddress: '0x6D251aADfc6Ff69031e01eA39bE3cb5BABf8438f' - name: Amphor Restaked ETH - symbol: AMPHRETH - decimals: 18 - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0xdc89990a6fdC1C922b841f1d977835628A24Ed57' - tokenAddress: '0x5fD13359Ba15A84B76f7F87568309040176167cd' - name: Amphor Restaked ETH - symbol: AMPHRETH - decimals: 18 - zircuit: - protocolType: ethereum - type: synthetic - hypAddress: '0x7D5a79539d7B1c9aE5e54d18EEE188840f1Fe4CC' - name: Amphor Restaked ETH - symbol: AMPHRETH - decimals: 18 diff --git a/typescript/infra/config/environments/mainnet3/warp/EZETH-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/EZETH-deployments.yaml deleted file mode 100644 index 26a0a5807d..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/EZETH-deployments.yaml +++ /dev/null @@ -1,86 +0,0 @@ -description: Hyperlane Warp Route artifacts -timestamp: '2024-06-04T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: xERC20Lockbox - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0xC59336D8edDa9722B4f1Ec104007191Ec16f7087' - tokenAddress: '0xbf5495Efe5DB9ce00f80364C8B423567e58d2110' - tokenCoinGeckoId: renzo-restaked-eth - decimals: 18 - bsc: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0xE00C6185a5c19219F1FFeD213b4406a254968c26' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 - arbitrum: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0xB26bBfC6d1F469C821Ea25099017862e7368F4E8' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 - optimism: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0xacEB607CdF59EB8022Cc0699eEF3eCF246d149e2' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 - base: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0x2552516453368e42705D791F674b312b8b87CD9e' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 - blast: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0x486b39378f99f073A3043C6Aabe8666876A8F3C5' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 - mode: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0xC59336D8edDa9722B4f1Ec104007191Ec16f7087' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 - linea: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0xC59336D8edDa9722B4f1Ec104007191Ec16f7087' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 - fraxtal: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0x3aE8635A4D581d40a6Edfb3f2ED480f9532994F5' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 - zircuit: - protocolType: ethereum - type: xERC20 - name: Renzo Restaked ETH - symbol: ezETH - hypAddress: '0x2552516453368e42705D791F674b312b8b87CD9e' - tokenAddress: '0x2416092f143378750bb29b79eD961ab195CcEea5' - decimals: 18 diff --git a/typescript/infra/config/environments/mainnet3/warp/TIA-eclipse-stride-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/TIA-eclipse-stride-deployments.yaml deleted file mode 100644 index 45c9e0efc1..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/TIA-eclipse-stride-deployments.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -description: Hyperlane Warp Route artifacts -timestamp: '2024-10-18T14:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - stride: - protocolType: cosmos - type: collateral - hypAddress: stride1pvtesu3ve7qn7ctll2x495mrqf2ysp6fws68grvcu6f7n2ajghgsh2jdj6 - tokenAddress: ibc/BF3B4F53F3694B66E13C23107C84B6485BD2B96296BB7EC680EA77BBA75B4801 - tokenCoinGeckoId: celestia - name: Celestia - symbol: TIA - decimals: 6 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: 'BpXHAiktwjx7fN6M9ST9wr6qKAsH27wZFhdHEhReJsR6' - tokenAddress: '9RryNMhAVJpAwAGjCAMKbbTFwgjapqPkzpGMfTQhEjf8' - isSpl2022: true - name: Turbo Eth - symbol: tETH - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/addresses.json b/typescript/infra/config/environments/mainnet3/warp/addresses.json deleted file mode 100644 index 6325ed7c8a..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ethereum": { - "HypERC20Collateral": "0x1D622da2ce4C4D9D4B0611718cb3BcDcAd008DD4", - "collateral": "0x1D622da2ce4C4D9D4B0611718cb3BcDcAd008DD4", - "proxyAdmin": "0xe41a3270875f28A03312877cD95A01e9a53664b1", - "timelockController": "0x0000000000000000000000000000000000000000" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/ancient8-USDC-addresses.json b/typescript/infra/config/environments/mainnet3/warp/ancient8-USDC-addresses.json deleted file mode 100644 index 7c7e807bc9..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/ancient8-USDC-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ancient8": { - "router": "0x97423A68BAe94b5De52d767a17aBCc54c157c0E5" - }, - "ethereum": { - "router": "0x8b4192B9Ad1fCa440A5808641261e5289e6de95D" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/ancient8-USDC-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/ancient8-USDC-deployments.yaml deleted file mode 100644 index d87b3fa0a7..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/ancient8-USDC-deployments.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between ancient8 and Ethereum -description: Hyperlane Warp Route artifacts -timestamp: '2024-04-15T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0x8b4192B9Ad1fCa440A5808641261e5289e6de95D' - tokenAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' # USDC - tokenCoinGeckoId: usd-coin - name: USDC - symbol: USDC - decimals: 6 - ancient8: - protocolType: ethereum - type: synthetic - hypAddress: '0x97423A68BAe94b5De52d767a17aBCc54c157c0E5' - name: USDC - symbol: USDC - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/arbitrum-TIA-addresses.json b/typescript/infra/config/environments/mainnet3/warp/arbitrum-TIA-addresses.json deleted file mode 100644 index b578857016..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/arbitrum-TIA-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "neutron": { - "router": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq" - }, - "arbitrum": { - "router": "0xd56734d7f9979dd94fae3d67c7e928234e71cd4c" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/arbitrum-neutron-eclip-addresses.json b/typescript/infra/config/environments/mainnet3/warp/arbitrum-neutron-eclip-addresses.json deleted file mode 100644 index 7b1ac51c00..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/arbitrum-neutron-eclip-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "neutron": { - "router": "neutron1dvzvf870mx9uf65uqhx40yzx9gu4xlqqq2pnx362a0ndmustww3smumrf5" - }, - "arbitrum": { - "router": "0x93ca0d85837FF83158Cd14D65B169CdB223b1921" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/bsc-lumia-LUMIA-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/bsc-lumia-LUMIA-deployments.yaml deleted file mode 100644 index d106ac884e..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/bsc-lumia-LUMIA-deployments.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between Ethereum and Binance Smart Chain and Lumia -description: Hyperlane Warp Route artifacts -timestamp: '2024-10-18T14:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0xdD313D475f8A9d81CBE2eA953a357f52e10BA357' - tokenAddress: '0xd9343a049d5dbd89cd19dc6bca8c48fb3a0a42a7' - tokenCoinGeckoId: lumia - name: Lumia Token - symbol: LUMIA - decimals: 18 - bsc: - protocolType: ethereum - type: synthetic - hypAddress: '0x7F39BcdCa8E0E581c1d43aaa1cB862AA1c8C2047' - name: Lumia Token - symbol: LUMIA - decimals: 18 - lumia: - protocolType: ethereum - type: native - hypAddress: '0x6a77331cE28E47c3Cb9Fea48AB6cD1e9594ce0A9' - name: Lumia Token - symbol: LUMIA - decimals: 18 diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts index 939bcc1ab2..58f60211dc 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts @@ -2,17 +2,21 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, defaultMultisigConfigs, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getAncient8EthereumUSDCWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ismConfig = buildAggregationIsmConfigs( 'ethereum', @@ -22,6 +26,7 @@ export const getAncient8EthereumUSDCWarpConfig = async ( const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDC, interchainSecurityModule: ismConfig, @@ -31,12 +36,9 @@ export const getAncient8EthereumUSDCWarpConfig = async ( hook: '0x19b2cF952b70b217c90FC408714Fbc1acD29A6A8', }; - // @ts-ignore - The types as they stand require a synthetic to specify - // TokenMetadata, but in practice these are actually inferred from a - // collateral config. To avoid needing to specify the TokenMetadata, just - // ts-ignore for synthetic tokens. const ancient8: TokenRouterConfig = { ...routerConfig.ancient8, + ...abacusWorksEnvOwnerConfig.ancient8, type: TokenType.synthetic, // Uses the default ISM interchainSecurityModule: ethers.constants.AddressZero, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts index 1b81e81103..9633354b56 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts @@ -2,49 +2,46 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +// MEV Capital const arbitrumOwner = '0x008615770B588633265cB01Abd19740fAe67d0B9'; const ethereumOwner = '0x008615770B588633265cB01Abd19740fAe67d0B9'; const zircuitOwner = '0xD0673e7F3FB4037CA79F53d2d311D0e017d39963'; export const getArbitrumEthereumZircuitAmphrETHWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const arbitrum: TokenRouterConfig = { ...routerConfig.arbitrum, + ...getOwnerConfigForAddress(arbitrumOwner), type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, - owner: arbitrumOwner, - ownerOverrides: { - proxyAdmin: arbitrumOwner, - }, }; const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), type: TokenType.collateral, token: tokens.ethereum.amphrETH, - owner: ethereumOwner, interchainSecurityModule: ethers.constants.AddressZero, - ownerOverrides: { - proxyAdmin: ethereumOwner, - }, }; const zircuit: TokenRouterConfig = { ...routerConfig.zircuit, + ...getOwnerConfigForAddress(zircuitOwner), type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, - owner: zircuitOwner, - ownerOverrides: { - proxyAdmin: zircuitOwner, - }, }; return { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts index daebd6c026..2dae8e447b 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts @@ -1,23 +1,36 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + +// Eclipse Fi team +const arbitrumOwner = '0xfF07222cb0AC905304d6586Aabf13f497C07F0C8'; +const neutronOwner = + 'neutron1aud8lty0wwmyc86ugkzqrusnrku0ckm0ym62v4ve0jjjyepjjg6spssrwj'; + export const getArbitrumNeutronEclipWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const neutronRouter = '6b04c49fcfd98bc4ea9c05cd5790462a39537c00028333474aebe6ddf20b73a3'; - // @ts-ignore - foreignDeployment configs dont conform to the TokenRouterConfig const neutron: TokenRouterConfig = { + ...routerConfig.neutron, + ...getOwnerConfigForAddress(neutronOwner), + type: TokenType.collateral, + token: 'factory/neutron10sr06r3qkhn7xzpw3339wuj77hu06mzna6uht0/eclip', foreignDeployment: neutronRouter, }; const arbitrum: TokenRouterConfig = { ...routerConfig.arbitrum, + ...getOwnerConfigForAddress(arbitrumOwner), type: TokenType.synthetic, name: 'Eclipse Fi', symbol: 'ECLIP', @@ -25,7 +38,6 @@ export const getArbitrumNeutronEclipWarpConfig = async ( totalSupply: 0, gas: 600_000, interchainSecurityModule: '0x676151bFB8D29690a359F99AE764860595504689', // This has diverged from the default ism on neutron, we cannot change as it is owned by the Eclip team - owner: '0xfF07222cb0AC905304d6586Aabf13f497C07F0C8', // Eclip team }; return { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts index ce601ffc16..66a6d9e116 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts @@ -1,23 +1,31 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + export const getArbitrumNeutronTiaWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const neutronRouter = '910926c4cf95d107237a9cf0b3305fe9c81351ebcba3d218ceb0e4935d92ceac'; - // @ts-ignore - foreignDeployment configs dont conform to the TokenRouterConfig const neutron: TokenRouterConfig = { + ...routerConfig.neutron, + ...abacusWorksEnvOwnerConfig.neutron, + type: TokenType.collateral, + token: + 'ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7', foreignDeployment: neutronRouter, }; const arbitrum: TokenRouterConfig = { ...routerConfig.arbitrum, + ...abacusWorksEnvOwnerConfig.arbitrum, type: TokenType.synthetic, name: 'TIA', symbol: 'TIA.n', diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts index 781b3caa98..fbece7506f 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts @@ -2,18 +2,23 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEclipseEthereumSolanaUSDTWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: '5g5ujyYUNvdydwyDVCpZwPpgYRqH5RYJRi156cxyE3me', gas: 300_000, @@ -21,6 +26,7 @@ export const getEclipseEthereumSolanaUSDTWarpConfig = async ( }; let ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDT, interchainSecurityModule: ethers.constants.AddressZero, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts index 03bdd55b7d..4b2a4a7bb0 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts @@ -2,18 +2,23 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEclipseEthereumWBTCWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'A7EGCDYFw5R7Jfm6cYtKvY8dmkrYMgwRCJFkyQwpHTYu', gas: 300_000, @@ -22,6 +27,7 @@ export const getEclipseEthereumWBTCWarpConfig = async ( let ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.WBTC, interchainSecurityModule: ethers.constants.AddressZero, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts index 34da322ad7..b4d7885f22 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts @@ -2,19 +2,30 @@ import { ethers } from 'ethers'; import { ChainMap, + OwnableConfig, RouterConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; -import { DEPLOYER } from '../../owners.js'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +// Safe owned by Veda +const ethereumOwner = '0xCEA8039076E35a825854c5C2f85659430b06ec96'; +// Vault owned by Veda +const eclipseOwner = '4Cj1s2ipALjJk9foQV4oDaZYCZwSsVkAShQL1KFVJG9b'; -export const getEclipseEthereumWeEthsWarpConfig = async ( - routerConfig: ChainMap, -): Promise> => { +export async function getEclipseEthereumWeEthsWarpConfig( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...getOwnerConfigForAddress(eclipseOwner), type: TokenType.synthetic, foreignDeployment: '7Zx4wU1QAw98MfvnPFqRh1oyumek7G5VAX6TKB3U1tcn', gas: 300_000, @@ -23,14 +34,14 @@ export const getEclipseEthereumWeEthsWarpConfig = async ( let ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), type: TokenType.collateral, token: tokens.ethereum.weETHs, interchainSecurityModule: ethers.constants.AddressZero, - owner: DEPLOYER, }; return { eclipsemainnet, ethereum, }; -}; +} diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts index 4d8db22a7b..4d8c79a7ce 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts @@ -1,15 +1,23 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + +// Stride team +const strideOwner = 'stride1k8c2m5cn322akk5wy8lpt87dd2f4yh9azg7jlh'; + export const getEclipseStrideTiaWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'BpXHAiktwjx7fN6M9ST9wr6qKAsH27wZFhdHEhReJsR6', gas: 300_000, @@ -17,6 +25,7 @@ export const getEclipseStrideTiaWarpConfig = async ( const stride: TokenRouterConfig = { ...routerConfig.stride, + ...getOwnerConfigForAddress(strideOwner), type: TokenType.collateral, foreignDeployment: 'stride1pvtesu3ve7qn7ctll2x495mrqf2ysp6fws68grvcu6f7n2ajghgsh2jdj6', diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts index 9d5bdf5786..d687138b35 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts @@ -1,15 +1,23 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + +// Stride team +const strideOwner = 'stride1k8c2m5cn322akk5wy8lpt87dd2f4yh9azg7jlh'; + export const getEclipseStrideStTiaWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'tKUHyJ5NxhnwU94JUmzh1ekukDcHHX8mZF6fqxbMwX6', gas: 300_000, @@ -17,6 +25,7 @@ export const getEclipseStrideStTiaWarpConfig = async ( const stride: TokenRouterConfig = { ...routerConfig.stride, + ...getOwnerConfigForAddress(strideOwner), type: TokenType.collateral, foreignDeployment: 'stride134axwdlam929m3mar3wv95nvkyep7mr87ravkqcpf8dfe3v0pjlqwrw6ee', diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts index 3ce50742a9..1afa97f4f9 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts @@ -1,59 +1,50 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { objMap } from '@hyperlane-xyz/utils'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; // Lumia Team const owner = '0x8bBA07Ddc72455b55530C17e6f6223EF6E156863'; - -const ownerConfig = { - owner, - // The proxyAdmins are warp-route specific - ownerOverrides: { - proxyAdmin: owner, - }, -}; +const ownerConfig = getOwnerConfigForAddress(owner); export const getEthereumBscLUMIAWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { - const ethereum = { + const ethereum: TokenRouterConfig = { + ...routerConfig.ethereum, + ...ownerConfig, type: TokenType.collateral, token: '0xD9343a049D5DBd89CD19DC6BcA8c48fB3a0a42a7', - ownerOverrides: { - proxyAdmin: owner, - }, }; - const bsc = { + const bsc: TokenRouterConfig = { + ...routerConfig.bsc, + ...ownerConfig, type: TokenType.synthetic, - ownerOverrides: { - proxyAdmin: owner, - }, }; - const lumia = { + const lumia: TokenRouterConfig = { + ...routerConfig.lumia, + ...ownerConfig, type: TokenType.native, // As this has been removed from the registry in https://github.com/hyperlane-xyz/hyperlane-registry/pull/348, // we must specify this explicitly. mailbox: '0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7', - proxyAdmin: '0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D', + proxyAdmin: { + owner: owner, + address: '0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D', + }, }; - const configMap = { + return { ethereum, bsc, lumia, }; - - const merged = objMap(configMap, (chain, config) => ({ - ...routerConfig[chain], - ...config, - ...ownerConfig, - })); - - return merged as ChainMap; }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts new file mode 100644 index 0000000000..3a1cd937ee --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts @@ -0,0 +1,44 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + OwnableConfig, + TokenRouterConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +import { DEPLOYER } from '../../owners.js'; + +// Keep on our deployer for now until we get an address from Flow +const owner = DEPLOYER; +const ownerConfig = getOwnerConfigForAddress(owner); + +export const getEthereumFlowCbBTCWarpConfig = async ( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> => { + const ethereum: TokenRouterConfig = { + ...routerConfig.ethereum, + ...ownerConfig, + type: TokenType.collateral, + token: tokens.ethereum.cbBTC, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const flowmainnet: TokenRouterConfig = { + ...routerConfig.flowmainnet, + ...ownerConfig, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + flowmainnet, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts index aa4b19054f..cb5ba7ada2 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts @@ -2,18 +2,23 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEthereumInevmUSDCWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDC, hook: '0xb87AC8EA4533AE017604E44470F7c1E550AC6F10', // aggregation of IGP and Merkle, arbitrary config not supported for now, TODO: may want to move to zero address in future @@ -21,6 +26,7 @@ export const getEthereumInevmUSDCWarpConfig = async ( const inevm: TokenRouterConfig = { ...routerConfig.inevm, + ...abacusWorksEnvOwnerConfig.inevm, type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts index abe8fd14c5..b861444f1f 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts @@ -2,18 +2,23 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEthereumInevmUSDTWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDT, hook: '0xb87AC8EA4533AE017604E44470F7c1E550AC6F10', // aggregation of IGP and Merkle, arbitrary config not supported for now, TODO: may want to move to zero address in future @@ -21,6 +26,7 @@ export const getEthereumInevmUSDTWarpConfig = async ( const inevm: TokenRouterConfig = { ...routerConfig.inevm, + ...abacusWorksEnvOwnerConfig.inevm, type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts index 5bd4938d20..1eb7f4a58c 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts @@ -2,42 +2,42 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; // Elixir const owner = '0x00000000F51340906F767C6999Fe512b1275955C'; +const ownerConfig = getOwnerConfigForAddress(owner); export const getEthereumSeiFastUSDWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const sei: TokenRouterConfig = { ...routerConfig.viction, + ...ownerConfig, type: TokenType.XERC20, name: 'fastUSD', symbol: 'fastUSD', decimals: 18, token: tokens.sei.fastUSD, interchainSecurityModule: ethers.constants.AddressZero, - owner, - ownerOverrides: { - proxyAdmin: owner, - }, }; const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...ownerConfig, type: TokenType.collateral, token: tokens.ethereum.deUSD, - owner, interchainSecurityModule: ethers.constants.AddressZero, - ownerOverrides: { - proxyAdmin: owner, - }, }; return { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts index 975483bc5a..a932b181b2 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts @@ -1,14 +1,17 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, defaultMultisigConfigs, } from '@hyperlane-xyz/sdk'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + export const getEthereumVictionETHWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ismConfig = buildAggregationIsmConfigs( 'ethereum', @@ -18,6 +21,7 @@ export const getEthereumVictionETHWarpConfig = async ( const viction: TokenRouterConfig = { ...routerConfig.viction, + ...abacusWorksEnvOwnerConfig.viction, type: TokenType.synthetic, name: 'ETH', symbol: 'ETH', @@ -28,6 +32,7 @@ export const getEthereumVictionETHWarpConfig = async ( const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.native, gas: 65_000, interchainSecurityModule: ismConfig, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts index ae8ed54946..c046753c91 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts @@ -1,16 +1,20 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, defaultMultisigConfigs, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEthereumVictionUSDCWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { // commit that the config was copied from https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3067/commits/7ed5b460034ea5e140c6ff86bcd6baf6ebb824c4#diff-fab5dd1a27c76e4310699c57ccf92ab6274ef0acf17e079b17270cedf4057775R109 const ismConfig = buildAggregationIsmConfigs( @@ -21,6 +25,7 @@ export const getEthereumVictionUSDCWarpConfig = async ( const viction: TokenRouterConfig = { ...routerConfig.viction, + ...abacusWorksEnvOwnerConfig.viction, type: TokenType.synthetic, name: 'USDC', symbol: 'USDC', @@ -31,6 +36,7 @@ export const getEthereumVictionUSDCWarpConfig = async ( const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDC, gas: 65_000, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts index 85abe405d5..5835f96322 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts @@ -1,16 +1,20 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, defaultMultisigConfigs, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEthereumVictionUSDTWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ismConfig = buildAggregationIsmConfigs( 'ethereum', @@ -20,6 +24,7 @@ export const getEthereumVictionUSDTWarpConfig = async ( const viction: TokenRouterConfig = { ...routerConfig.viction, + ...abacusWorksEnvOwnerConfig.viction, type: TokenType.synthetic, name: 'USDT', symbol: 'USDT', @@ -30,6 +35,7 @@ export const getEthereumVictionUSDTWarpConfig = async ( const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDT, gas: 65_000, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts index 438fe23e94..fd1b5c2b1a 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts @@ -1,23 +1,28 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + export const getInevmInjectiveINJWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const injectiveRouter = 'inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k'; - // @ts-ignore - foreignDeployment configs don't conform to the TokenRouterConfig const injective: TokenRouterConfig = { + ...routerConfig.injective, + ...abacusWorksEnvOwnerConfig.injective, type: TokenType.native, foreignDeployment: injectiveRouter, }; const inevm: TokenRouterConfig = { ...routerConfig.inevm, + ...abacusWorksEnvOwnerConfig.inevm, type: TokenType.native, }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts index e157552e62..a603ec139c 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts @@ -1,12 +1,15 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + export const getMantapacificNeutronTiaWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const neutronRouter = '0xc5fc6899019cb4a7649981d89eb7b1a0929d0a85b2d41802f3315129ad4b581a'; @@ -18,6 +21,7 @@ export const getMantapacificNeutronTiaWarpConfig = async ( const mantapacific: TokenRouterConfig = { ...routerConfig.mantapacific, + ...abacusWorksEnvOwnerConfig.mantapacific, type: TokenType.synthetic, name: 'TIA', symbol: 'TIA', diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-ORCA-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/eclipse-ORCA-deployments.yaml deleted file mode 100644 index 8205cc93e9..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-ORCA-deployments.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -description: Hyperlane Warp Route artifacts -timestamp: '2024-09-19T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - solanamainnet: - protocolType: sealevel - type: collateral - hypAddress: '8acihSm2QTGswniKgdgr4JBvJihZ1cakfvbqWCPBLoSp' - tokenAddress: 'orcaEKTdK7LKz57vaAYr9QeNsVEPfiu6QeMU1kektZE' - tokenCoinGeckoId: orca - name: Orca - symbol: ORCA - decimals: 6 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: '8CvWJS7SPtauAXinJUURkBDLsGUXWiiTdENkEFUPjQ9j' - tokenAddress: '2tGbYEm4nuPFyS6zjDTELzEhvVKizgKewi6xT7AaSKzn' - isSpl2022: true - name: Orca - symbol: ORCA - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-SOL-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/eclipse-SOL-deployments.yaml deleted file mode 100644 index 711e6d4282..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-SOL-deployments.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between injective and inevm -description: Hyperlane Warp Route artifacts -timestamp: '2024-09-19T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - solanamainnet: - protocolType: sealevel - type: native - hypAddress: '8DtAGQpcMuD5sG3KdxDy49ydqXUggR1LQtebh2TECbAc' - tokenCoinGeckoId: solana - name: Solana - symbol: SOL - decimals: 9 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: 'FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y' - tokenAddress: 'BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL' - isSpl2022: true - name: Solana - symbol: SOL - decimals: 9 diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-USDC-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/eclipse-USDC-deployments.yaml deleted file mode 100644 index 7405cb94d2..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-USDC-deployments.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between injective and inevm -description: Hyperlane Warp Route artifacts -timestamp: '2024-09-19T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0xe1De9910fe71cC216490AC7FCF019e13a34481D7' - tokenAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' # USDC - tokenCoinGeckoId: usd-coin - name: USDC - symbol: USDC - decimals: 6 - solanamainnet: - protocolType: sealevel - type: collateral - hypAddress: '3EpVCPUgyjq2MfGeCttyey6bs5zya5wjYZ2BE6yDg6bm' - tokenAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' - tokenCoinGeckoId: usd-coin - isSpl2022: false - name: USDC - symbol: USDC - decimals: 6 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: 'EqRSt9aUDMKYKhzd1DGMderr3KNp29VZH3x5P7LFTC8m' - tokenAddress: 'AKEWE7Bgh87GPp171b4cJPSSZfmZwQ3KaqYqXoKLNAEE' - isSpl2022: true - name: USDC - symbol: USDC - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-USDT-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/eclipse-USDT-deployments.yaml deleted file mode 100644 index 0a126ed76a..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-USDT-deployments.yaml +++ /dev/null @@ -1,34 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -description: Hyperlane Warp Route artifacts -timestamp: '2024-09-19T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0x647C621CEb36853Ef6A907E397Adf18568E70543' - tokenAddress: '0xdac17f958d2ee523a2206206994597c13d831ec7' # USDT - tokenCoinGeckoId: tether - name: USDT - symbol: USDT - decimals: 6 - solanamainnet: - protocolType: sealevel - type: collateral - hypAddress: 'Bk79wMjvpPCh5iQcCEjPWFcG1V2TfgdwaBsWBEYFYSNU' - tokenAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB' - tokenCoinGeckoId: tether - isSpl2022: false - name: USDT - symbol: USDT - decimals: 6 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: '5g5ujyYUNvdydwyDVCpZwPpgYRqH5RYJRi156cxyE3me' - tokenAddress: 'CEBP3CqAbW4zdZA57H2wfaSG1QNdzQ72GiQEbQXyW9Tm' - isSpl2022: true - name: USDT - symbol: USDT - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-WBTC-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/eclipse-WBTC-deployments.yaml deleted file mode 100644 index bd993b8c94..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-WBTC-deployments.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -description: Hyperlane Warp Route artifacts -timestamp: '2024-09-19T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0x5B4e223DE74ef8c3218e66EEcC541003CAB3121A' - tokenAddress: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599' - name: WBTC - symbol: WBTC - decimals: 8 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: 'A7EGCDYFw5R7Jfm6cYtKvY8dmkrYMgwRCJFkyQwpHTYu' - tokenAddress: '7UTjr1VC6Z9DPsWD6mh5wPzNtufN17VnzpKS3ASpfAji' - isSpl2022: true - name: WBTC - symbol: WBTC - decimals: 8 diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-WIF-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/eclipse-WIF-deployments.yaml deleted file mode 100644 index 1b7245c91c..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-WIF-deployments.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between injective and inevm -description: Hyperlane Warp Route artifacts -timestamp: '2024-09-19T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - solanamainnet: - protocolType: sealevel - type: collateral - hypAddress: 'CuQmsT4eSF4dYiiGUGYYQxJ7c58pUAD5ADE3BbFGzQKx' - tokenAddress: 'EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm' - tokenCoinGeckoId: dogwifcoin - name: dogwifhat - symbol: WIF - decimals: 9 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: '6tBGmKNxirxBYnm9khkaTtcr2fhJ9YviCgRm1RWM8NJv' - tokenAddress: '841P4tebEgNux2jaWSjCoi9LhrVr9eHGjLc758Va3RPH' - isSpl2022: false - name: dogwifhat - symbol: WIF - decimals: 9 diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-stride-TIA-addresses.json b/typescript/infra/config/environments/mainnet3/warp/eclipse-stride-TIA-addresses.json deleted file mode 100644 index 67cf44d89a..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-stride-TIA-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "eclipsemainnet": { - "router": "0xa0c167513f4d025217a48891973c3dbe41e10e76230033ef5d676299a18ca7f5" - }, - "stride": { - "router": "stride1pvtesu3ve7qn7ctll2x495mrqf2ysp6fws68grvcu6f7n2ajghgsh2jdj6" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-stride-stTIA-addresses.json b/typescript/infra/config/environments/mainnet3/warp/eclipse-stride-stTIA-addresses.json deleted file mode 100644 index 538b9fe9a5..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-stride-stTIA-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "eclipsemainnet": { - "router": "0x0d258188d0761163da174da890d0c1becdee51a01dbc9e2a6bfcb342140eb509" - }, - "stride": { - "router": "stride134axwdlam929m3mar3wv95nvkyep7mr87ravkqcpf8dfe3v0pjlqwrw6ee" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/eclipse-tETH-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/eclipse-tETH-deployments.yaml deleted file mode 100644 index 1f77a34e54..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/eclipse-tETH-deployments.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between injective and inevm -description: Hyperlane Warp Route artifacts -timestamp: '2024-09-19T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0xc2495f3183F043627CAECD56dAaa726e3B2D9c09' - tokenAddress: '0x19e099B7aEd41FA52718D780dDA74678113C0b32' - name: Turbo Eth - symbol: tETH - decimals: 18 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: '6GM7hy6M6LjhadG1xuKXPQ3jPC1eieEszR8DforoRzUp' - tokenAddress: 'GU7NS9xCwgNPiAdJ69iusFrRfawjDDPjeMBovhV1d4kn' - isSpl2022: false - name: Turbo Eth - symbol: tETH - decimals: 9 diff --git a/typescript/infra/config/environments/mainnet3/warp/ethereumUSDC-inevm-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/ethereumUSDC-inevm-deployments.yaml deleted file mode 100644 index 90f22e0dff..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/ethereumUSDC-inevm-deployments.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between injective and inevm -description: Hyperlane Warp Route artifacts -timestamp: '2024-02-06T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0xED56728fb977b0bBdacf65bCdD5e17Bb7e84504f' - tokenAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' # USDC - tokenCoinGeckoId: usd-coin - name: USDC - symbol: USDC - decimals: 6 - inevm: - protocolType: ethereum - type: synthetic - hypAddress: '0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147' - name: USDC - symbol: USDC - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/ethereumUSDT-inevm-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/ethereumUSDT-inevm-deployments.yaml deleted file mode 100644 index 91976ddd98..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/ethereumUSDT-inevm-deployments.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between injective and inevm -description: Hyperlane Warp Route artifacts -timestamp: '2024-02-06T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0xab852e67bf03E74C89aF67C4BA97dd1088D3dA19' - tokenAddress: '0xdac17f958d2ee523a2206206994597c13d831ec7' # USDT - tokenCoinGeckoId: tether - name: Tether USD - symbol: USDT - decimals: 6 - inevm: - protocolType: ethereum - type: synthetic - hypAddress: '0x97423A68BAe94b5De52d767a17aBCc54c157c0E5' - name: Tether USD - symbol: USDT - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/inevm-USDC-addresses.json b/typescript/infra/config/environments/mainnet3/warp/inevm-USDC-addresses.json deleted file mode 100644 index 08aeb44c5f..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/inevm-USDC-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "inevm": { - "synthetic": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147" - }, - "ethereum": { - "collateral": "0xED56728fb977b0bBdacf65bCdD5e17Bb7e84504f" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/inevm-USDT-addresses.json b/typescript/infra/config/environments/mainnet3/warp/inevm-USDT-addresses.json deleted file mode 100644 index a6880864e8..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/inevm-USDT-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "inevm": { - "synthetic": "0x97423A68BAe94b5De52d767a17aBCc54c157c0E5" - }, - "ethereum": { - "collateral": "0xab852e67bf03E74C89aF67C4BA97dd1088D3dA19" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/injective-inevm-addresses.json b/typescript/infra/config/environments/mainnet3/warp/injective-inevm-addresses.json deleted file mode 100644 index d92b53abf8..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/injective-inevm-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "injective": { - "router": "inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k" - }, - "inevm": { - "router": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/injective-inevm-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/injective-inevm-deployments.yaml deleted file mode 100644 index cd39382ea3..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/injective-inevm-deployments.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between injective and inevm -description: Hyperlane Warp Route artifacts -timestamp: '2024-01-31T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - injective: - protocolType: cosmos - type: native - hypAddress: inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k - tokenCoinGeckoId: injective-protocol - name: Injective Coin - symbol: INJ - decimals: 18 - ibcDenom: inj - inevm: - protocolType: ethereum - type: native - hypAddress: '0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4' - name: Injective coin - symbol: INJ - decimals: 18 diff --git a/typescript/infra/config/environments/mainnet3/warp/manta-TIA-addresses.json b/typescript/infra/config/environments/mainnet3/warp/manta-TIA-addresses.json deleted file mode 100644 index cfe967bb17..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/manta-TIA-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "neutron": { - "router": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa" - }, - "mantapacific": { - "router": "0x6fae4d9935e2fcb11fc79a64e917fb2bf14dafaa" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/merkly-erc20-addresses.json b/typescript/infra/config/environments/mainnet3/warp/merkly-erc20-addresses.json deleted file mode 100644 index 60566469de..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/merkly-erc20-addresses.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "optimism": { - "router": "0x32F05f390217990404392a4DdAF39D31Db4aFf77" - }, - "celo": { - "router": "0xad8676147360dBc010504aB69C7f1b1877109527" - }, - "avalanche": { - "router": "0x904550e0D182cd4aEe0D305891c666a212EC8F01" - }, - "polygonzkevm": { - "router": "0x46B4eDaA761eF8d2934e9F7AAf32B5Bf2C9C9F67" - }, - "bsc": { - "router": "0x7b4f475d32f9c65de1834A578859F9823bE3c5Cf" - }, - "moonbeam": { - "router": "0xf3D41b377c93fA5C3b0071966f1811c5063fAD40" - }, - "gnosis": { - "router": "0xFD34afDFbaC1E47aFC539235420e4bE4A206f26D" - }, - "arbitrum": { - "router": "0xFD34afDFbaC1E47aFC539235420e4bE4A206f26D" - }, - "polygon": { - "router": "0x574E69C50e7D13B3d1B364BF0D48285A5aE2dF56" - }, - "base": { - "router": "0x5454cF5584939f7f884e95DBA33FECd6D40B8fE2" - }, - "linea": { - "router": "0xc92A74918Ebb35CA91d7029b7528e0b49fA60B47" - }, - "mantle": { - "router": "0x261e36AF8C6Cb974a468025E58f3bd39b0419275" - }, - "viction": { - "router": "0xb00300fCe618E049d284eb92E57582A5d15295F4" - }, - "scroll": { - "router": "0x904550e0D182cd4aEe0D305891c666a212EC8F01" - }, - "ethereum": { - "router": "0xf3D41b377c93fA5C3b0071966f1811c5063fAD40" - }, - "mantapacific": { - "router": "0xb1d2B9446A9d1550e8d409C0F9745c5A2f10D332" - }, - "fraxtal": { - "router": "0xDE5E2bf75005422dc408ea96F22467E02cBA8c93" - }, - "mode": { - "router": "0xfD7c029D1F1198826302F5F6c9CD482c06F0D72f" - }, - "blast": { - "router": "0xd9371FFFd58D57bfC65e897e18DAF88C88ec273E" - }, - "ancient8": { - "router": "0xAFa5f9313F1F2b599173f24807a882F498Be118c" - }, - "zetachain": { - "router": "0x4fc0D96f3d70b4D9b75671Ab92e7Be01CaBE3863" - }, - "redstone": { - "router": "0xc072c3EbAf165955C5aAd2DbB4293f771de6dbd3" - }, - "sei": { - "router": "0x47470579B0f2fD91a6Ed1b13bBAd0d723Eec7512" - }, - "taiko": { - "router": "0x5C5c31edD52Bc662d9A396Ffc1CA96938DA1764C" - }, - "bob": { - "router": "0x6f6aE8851a460406bBB3c929a415d2Df9305AcD5" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/merkly-nft-addresses.json b/typescript/infra/config/environments/mainnet3/warp/merkly-nft-addresses.json deleted file mode 100644 index 5aab300f68..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/merkly-nft-addresses.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "optimism": { - "router": "0x2a5c54c625220cb2166C94DD9329be1F8785977D" - }, - "celo": { - "router": "0x7f4CFDf669d7a5d4Adb05917081634875E21Df47" - }, - "avalanche": { - "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" - }, - "polygonzkevm": { - "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" - }, - "bsc": { - "router": "0xf3D41b377c93fA5C3b0071966f1811c5063fAD40" - }, - "moonbeam": { - "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" - }, - "gnosis": { - "router": "0x7dac480d20f322d2ef108a59a465ccb5749371c4" - }, - "arbitrum": { - "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" - }, - "polygon": { - "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" - }, - "base": { - "router": "0x7dac480d20f322d2ef108a59a465ccb5749371c4" - }, - "linea": { - "router": "0xC6EDe374Df7763ad70166C4d85d8066A8fb8D272" - }, - "mantle": { - "router": "0x2F1562Cc3044B95cb969D1684a1f4E43A207476E" - }, - "viction": { - "router": "0x80Abe17c3Ca312f63a96D31DdE1F829e90Ee05b7" - }, - "scroll": { - "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" - }, - "ethereum": { - "router": "0x7daC480d20f322D2ef108A59A465CCb5749371c4" - }, - "mantapacific": { - "router": "0xc7a66e3A9d1a84dC60f8a630C3eC3D84aCFBE5EC" - }, - "fraxtal": { - "router": "0x49e6d51a220acab3b44d325edcab0f164cf48111" - }, - "mode": { - "router": "0x814490128eB60e6FCB56a38B46FC9FC37726414a" - }, - "blast": { - "router": "0xDc09f06D11dFC7703BF8f3049E2CcF4507bEA1ab" - }, - "ancient8": { - "router": "0x6E55472109E6aBE4054a8E8b8d9EdFfCb31032C5" - }, - "zetachain": { - "router": "0x6Ca118bdF9BD900Da5D3d85094D92C5B3b9c0DA5" - }, - "redstone": { - "router": "0x6f6aE8851a460406bBB3c929a415d2Df9305AcD5" - }, - "sei": { - "router": "0x4b56f191b7F396dec4268b836845C3F63F5e2121" - }, - "taiko": { - "router": "0x6293432E8731d8267F76B90Fa82650552e7811F2" - }, - "bob": { - "router": "0xc072c3EbAf165955C5aAd2DbB4293f771de6dbd3" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/nautilus-solana-bsc-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/nautilus-solana-bsc-deployments.yaml deleted file mode 100644 index e3e8770078..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/nautilus-solana-bsc-deployments.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between nautilus and bsc, solana -description: Hyperlane Warp Route artifacts -timestamp: '2023-09-23T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - bsc: - protocolType: ethereum - type: collateral - hypAddress: '0xC27980812E2E66491FD457D488509b7E04144b98' - tokenAddress: '0x37a56cdcD83Dce2868f721De58cB3830C44C6303' - name: Zebec - symbol: ZBC - decimals: 9 - nautilus: - protocolType: ethereum - type: native - hypAddress: '0x4501bBE6e731A4bC5c60C03A77435b2f6d5e9Fe7' - name: Zebec - symbol: ZBC - decimals: 18 - solana: - protocolType: sealevel - type: collateral - tokenAddress: 'wzbcJyhGhQDLTV1S99apZiiBdE4jmYfbw99saMMdP59' - hypAddress: 'EJqwFjvVJSAxH8Ur2PYuMfdvoJeutjmH6GkoEFQ4MdSa' - name: Zebec - symbol: ZBC - decimals: 9 - isSpl2022: true diff --git a/typescript/infra/config/environments/mainnet3/warp/neutron-mantapacific-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/neutron-mantapacific-deployments.yaml deleted file mode 100644 index bf4e1770ae..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/neutron-mantapacific-deployments.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between neutron and mantapacific -description: Hyperlane Warp Route artifacts -timestamp: '2023-09-23T16:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - neutron: - protocolType: cosmos - type: collateral - hypAddress: neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa - tokenAddress: ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7 - tokenCoinGeckoId: celestia - name: Celestia - symbol: TIA - decimals: 6 - mantapacific: - protocolType: ethereum - type: synthetic - hypAddress: '0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa' - name: Celestia - symbol: TIA - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses-v1.json b/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses-v1.json deleted file mode 100644 index e4c2a871fd..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses-v1.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "bsc": { - "router": "0x9Ff085A556A498395B9edA690666E3BD34751024" - }, - "arbitrum": { - "router": "0x1217441e6E8E960D065698317FE13594a5704f69" - }, - "optimism": { - "router": "0xEF90AF9FCC831c5E2266285C4A1787201f96736a" - }, - "base": { - "router": "0x4b36617B3D2cAb714a056090306A88Dd6DD4cCcf" - }, - "blast": { - "router": "0xB951c9b16603825C285bf59b14e983047d421Af5" - }, - "mode": { - "router": "0x477614191C3ccF8e10a6D1291dBAf098D17497BE" - }, - "linea": { - "router": "0x477614191C3ccF8e10a6D1291dBAf098D17497BE" - }, - "ethereum": { - "router": "0x0B386cAe2851E954b52D10Aee4ba8CCDC11463E1" - }, - "fraxtal": { - "router": "0xdFf621F952c23972dFD3A9E5d7B9f6339e9c078B" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses-v3.json b/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses-v3.json deleted file mode 100644 index e5c7023b23..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/renzo-ezETH-addresses-v3.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "arbitrum": { - "xERC20": "0xB26bBfC6d1F469C821Ea25099017862e7368F4E8" - }, - "base": { - "xERC20": "0x2552516453368e42705D791F674b312b8b87CD9e" - }, - "blast": { - "xERC20": "0x486b39378f99f073A3043C6Aabe8666876A8F3C5" - }, - "bsc": { - "xERC20": "0xE00C6185a5c19219F1FFeD213b4406a254968c26" - }, - "ethereum": { - "xERC20Lockbox": "0xC59336D8edDa9722B4f1Ec104007191Ec16f7087" - }, - "fraxtal": { - "xERC20": "0x3aE8635A4D581d40a6Edfb3f2ED480f9532994F5" - }, - "linea": { - "xERC20": "0xC59336D8edDa9722B4f1Ec104007191Ec16f7087" - }, - "mode": { - "xERC20": "0xC59336D8edDa9722B4f1Ec104007191Ec16f7087" - }, - "optimism": { - "xERC20": "0xacEB607CdF59EB8022Cc0699eEF3eCF246d149e2" - }, - "sei": { - "xERC20": "0xE5163F148C82a0818545d5D34e30BC1EDA870cB9" - }, - "taiko": { - "xERC20": "0x5eAFB1D4b5BDFaFE81715EeBcC7713e418C80E78" - }, - "zircuit": { - "xERC20": "0x2552516453368e42705D791F674b312b8b87CD9e" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/sei-FASTUSD-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/sei-FASTUSD-deployments.yaml deleted file mode 100644 index ed9672e416..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/sei-FASTUSD-deployments.yaml +++ /dev/null @@ -1,22 +0,0 @@ -description: Hyperlane Warp Route artifacts -timestamp: '2024-10-17T14:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0x9AD81058c6C3Bf552C9014CB30E824717A0ee21b' - tokenAddress: '0x15700B564Ca08D9439C58cA5053166E8317aa138' - tokenCoinGeckoId: elixir-deusd # unique setup where we want deUSD to be deposited as collateral and we want fastUSD to be minted as a synthetic on sei - name: fastUSD - symbol: fastUSD - decimals: 18 - sei: - protocolType: ethereum - type: xERC20 - hypAddress: '0xeA895A7Ff45d8d3857A04c1E38A362f3bd9a076f' - tokenAddress: '0x37a4dD9CED2b19Cfe8FAC251cd727b5787E45269' - name: fastUSD - symbol: fastUSD - decimals: 18 diff --git a/typescript/infra/config/environments/mainnet3/warp/stTIA-eclipse-stride-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/stTIA-eclipse-stride-deployments.yaml deleted file mode 100644 index 7f18e471c8..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/stTIA-eclipse-stride-deployments.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -description: Hyperlane Warp Route artifacts -timestamp: '2024-10-18T14:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - stride: - protocolType: cosmos - type: collateral - hypAddress: stride134axwdlam929m3mar3wv95nvkyep7mr87ravkqcpf8dfe3v0pjlqwrw6ee - tokenAddress: 'stutia' - tokenCoinGeckoId: stride-staked-tia - name: Stride Staked TIA - symbol: stTIA - decimals: 6 - eclipsemainnet: - protocolType: sealevel - type: synthetic - hypAddress: 'tKUHyJ5NxhnwU94JUmzh1ekukDcHHX8mZF6fqxbMwX6' - tokenAddress: 'V5m1Cc9VK61mKL8xVYrjR7bjD2BC5VpADLa6ws3G8KM' - isSpl2022: true - name: Turbo Eth - symbol: tETH - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/verification.json b/typescript/infra/config/environments/mainnet3/warp/verification.json deleted file mode 100644 index 35d738ecee..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/verification.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "ancient8": [ - { - "address": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000060000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "Synthetic" - }, - { - "address": "0xdB670e1a1e312BF17425b08cE55Bdf2cD8F8eD54", - "constructorArguments": "", - "isProxy": false, - "name": "ProxyAdmin" - }, - { - "address": "0x9fA986ACB22953c504Fcf5985DFA476d481C3b1B", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000060000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "HypERC20" - }, - { - "address": "0x97423A68BAe94b5De52d767a17aBCc54c157c0E5", - "constructorArguments": "0000000000000000000000009fa986acb22953c504fcf5985dfa476d481c3b1b000000000000000000000000db670e1a1e312bf17425b08ce55bdf2cd8f8ed5400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000144e80a7c79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000000000000000000000000000000000000000000855534420436f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004555344430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" - }, - { - "address": "0x086eF95a2F74582Ee30E7D698518a872fb18301f", - "constructorArguments": "", - "isProxy": false, - "name": "ProxyAdmin" - }, - { - "address": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", - "constructorArguments": "", - "isProxy": false, - "name": "ProxyAdmin" - } - ], - "arbitrum": [ - { - "address": "0x93ca0d85837FF83158Cd14D65B169CdB223b1921", - "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000979ca5202784112f4738403dbec5d0f3b9daabb9", - "isProxy": false, - "name": "HypERC20" - } - ], - "ethereum": [ - { - "address": "0x15b5D6B614242B118AA404528A7f3E2Ad241e4A4", - "constructorArguments": "000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239", - "isProxy": false, - "name": "HypNative" - }, - { - "address": "0x31Dca7762930f56D81292f85E65c9D67575804fE", - "constructorArguments": "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239", - "isProxy": false, - "name": "HypERC20Collateral" - }, - { - "address": "0x4221a16A01F61c2b38A03C52d828a7041f6AAA49", - "constructorArguments": "000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239", - "isProxy": false, - "name": "HypERC20Collateral" - }, - { - "address": "0xab852e67bf03E74C89aF67C4BA97dd1088D3dA19", - "constructorArguments": "000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239", - "isProxy": false, - "name": "HypERC20Collateral" - }, - { - "address": "0xED56728fb977b0bBdacf65bCdD5e17Bb7e84504f", - "constructorArguments": "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239", - "isProxy": false, - "name": "HypERC20Collateral" - }, - { - "address": "0x9f5cF636b4F2DC6D83c9d21c8911876C235DbC9f", - "constructorArguments": "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239", - "isProxy": false, - "name": "Collateral" - }, - { - "address": "0x870464fE2EA3a6b3c242f30BDa1f1EFdDf580890", - "constructorArguments": "", - "isProxy": false, - "name": "ProxyAdmin" - }, - { - "address": "0xEd96482beA3C51a33b4c1aDa8b438e33A2367413", - "constructorArguments": "", - "isProxy": false, - "name": "ProxyAdmin" - }, - { - "address": "0x7D0C8B23C5b35091972023cCc689cfeDcD881c7d", - "constructorArguments": "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239", - "isProxy": false, - "name": "HypERC20Collateral" - }, - { - "address": "0x8b4192B9Ad1fCa440A5808641261e5289e6de95D", - "constructorArguments": "0000000000000000000000007d0c8b23c5b35091972023ccc689cfedcd881c7d000000000000000000000000ed96482bea3c51a33b4c1ada8b438e33a236741300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000019b2cf952b70b217c90fc408714fbc1acd29a6a8000000000000000000000000d17b4100cc66a2f1b9a452007ff26365aaeb7ec3000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "isProxy": true, - "name": "TransparentUpgradeableProxy" - }, - { - "address": "0xe41a3270875f28A03312877cD95A01e9a53664b1", - "constructorArguments": "", - "isProxy": false, - "name": "ProxyAdmin" - }, - { - "address": "0xbE6501A4E68a3463A217eC0dEc862b1593C0A47D", - "constructorArguments": "0000000000000000000000008c9532a60e0e7c6bbd2b2c1303f63ace1c3e9811000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239", - "isProxy": false, - "name": "HypERC20Collateral" - }, - { - "address": "0x1D622da2ce4C4D9D4B0611718cb3BcDcAd008DD4", - "constructorArguments": "000000000000000000000000be6501a4e68a3463a217ec0dec862b1593c0a47d000000000000000000000000e41a3270875f28a03312877cd95a01e9a53664b100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", - "expectedimplementation": "0xbE6501A4E68a3463A217eC0dEc862b1593C0A47D", - "isProxy": true, - "name": "TransparentUpgradeableProxy" - } - ], - "inevm": [ - { - "address": "0x97423A68BAe94b5De52d767a17aBCc54c157c0E5", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000060000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "HypERC20" - }, - { - "address": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000060000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "HypERC20" - } - ], - "viction": [ - { - "address": "0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000120000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "HypERC20" - }, - { - "address": "0x811808Dd29ba8B0FC6C0ec0b5537035E59745162", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000120000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "HypERC20" - }, - { - "address": "0x61DDB465eEA5bc3708Cf8B53156aC91a77A2f029", - "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000120000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a7", - "isProxy": false, - "name": "HypERC20" - } - ] -} diff --git a/typescript/infra/config/environments/mainnet3/warp/viction-ETH-addresses.json b/typescript/infra/config/environments/mainnet3/warp/viction-ETH-addresses.json deleted file mode 100644 index c5842c1768..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/viction-ETH-addresses.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "viction": { - "router": "0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B" - }, - "ethereum": { - "router": "0x15b5D6B614242B118AA404528A7f3E2Ad241e4A4" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/viction-USDC-addresses.json b/typescript/infra/config/environments/mainnet3/warp/viction-USDC-addresses.json deleted file mode 100644 index c567193098..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/viction-USDC-addresses.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ethereum": { - "HypERC20Collateral": "0x31Dca7762930f56D81292f85E65c9D67575804fE", - "router": "0x31Dca7762930f56D81292f85E65c9D67575804fE" - }, - "viction": { - "HypERC20": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0", - "router": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/viction-USDT-addresses.json b/typescript/infra/config/environments/mainnet3/warp/viction-USDT-addresses.json deleted file mode 100644 index e455bb7e27..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/viction-USDT-addresses.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ethereum": { - "router": "0x4221a16A01F61c2b38A03C52d828a7041f6AAA49", - "HypERC20Collateral": "0x4221a16A01F61c2b38A03C52d828a7041f6AAA49" - }, - "viction": { - "router": "0x48083c69f5a42c6b69abbad48ae195bd36770ee2", - "HypERC20": "0x48083c69f5a42c6b69abbad48ae195bd36770ee2" - } -} diff --git a/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-ETH-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-ETH-deployments.yaml deleted file mode 100644 index c3e03b54d5..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-ETH-deployments.yaml +++ /dev/null @@ -1,22 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between viction and ethereum, ETH -description: Hyperlane Warp Route artifacts -timestamp: '2023-02-14T20:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: native - hypAddress: '0x15b5D6B614242B118AA404528A7f3E2Ad241e4A4' - tokenCoinGeckoId: ethereum - name: Ether - symbol: ETH - decimals: 18 - viction: - protocolType: ethereum - type: synthetic - hypAddress: '0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B' - name: ETH - symbol: ETH - decimals: 18 diff --git a/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-USDC-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-USDC-deployments.yaml deleted file mode 100644 index 8a84e6a7c5..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-USDC-deployments.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between viction and ethereum, USDC -description: Hyperlane Warp Route artifacts -timestamp: '2023-02-14T20:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0x31Dca7762930f56D81292f85E65c9D67575804fE' - tokenAddress: '0x31Dca7762930f56D81292f85E65c9D67575804fE' # USDC - tokenCoinGeckoId: usd-coin - name: USD Coin - symbol: USDC - decimals: 6 - viction: - protocolType: ethereum - type: synthetic - hypAddress: '0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0' - name: USDC - symbol: USDC - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-USDT-deployments.yaml b/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-USDT-deployments.yaml deleted file mode 100644 index a225980420..0000000000 --- a/typescript/infra/config/environments/mainnet3/warp/viction-ethereum-USDT-deployments.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Configs and artifacts for the deployment of Hyperlane Warp Routes -# Between viction and ethereum, USDT -description: Hyperlane Warp Route artifacts -timestamp: '2023-02-14T20:00:00.000Z' -deployer: Abacus Works (Hyperlane) -data: - config: - ethereum: - protocolType: ethereum - type: collateral - hypAddress: '0x4221a16A01F61c2b38A03C52d828a7041f6AAA49' - tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7' # USDT - tokenCoinGeckoId: tether - name: Tether USD - symbol: USDT - decimals: 6 - viction: - protocolType: ethereum - type: synthetic - hypAddress: '0x48083c69f5a42c6b69abbad48ae195bd36770ee2' - name: USDT - symbol: USDT - decimals: 6 diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index d70348b56c..70246891c8 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -1,6 +1,7 @@ export enum WarpRouteIds { Ancient8EthereumUSDC = 'USDC/ancient8-ethereum', ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiTaikoZircuitEZETH = 'EZETH/arbitrum-base-blast-bsc-ethereum-fraxtal-linea-mode-optimism-sei-taiko-zircuit', + ArbitrumBaseEnduranceUSDC = 'USDC/arbitrum-base-endurance', ArbitrumEthereumZircuitAMPHRETH = 'AMPHRETH/arbitrum-ethereum-zircuit', ArbitrumNeutronEclip = 'ECLIP/arbitrum-neutron', ArbitrumNeutronTIA = 'TIA/arbitrum-neutron', @@ -9,10 +10,12 @@ export enum WarpRouteIds { EclipseEthereumTETH = 'tETH/eclipsemainnet-ethereum', EclipseEthereumWBTC = 'WBTC/eclipsemainnet-ethereum', EclipseEthereumWeETHs = 'weETHs/eclipsemainnet-ethereum', + EclipseSolanaORCA = 'ORCA/eclipsemainnet-solanamainnet', EclipseSolanaSOL = 'SOL/eclipsemainnet-solanamainnet', EclipseSolanaWIF = 'WIF/eclipsemainnet-solanamainnet', - EclipseStrideSTTIA = 'stTIA/eclipse-stride', - EclipseStrideTIA = 'TIA/eclipse-stride', + EclipseStrideSTTIA = 'stTIA/eclipsemainnet-stride', + EclipseStrideTIA = 'TIA/eclipsemainnet-stride', + EthereumFlowCbBTC = 'CBBTC/ethereum-flowmainnet', EthereumInevmUSDC = 'USDC/ethereum-inevm', EthereumInevmUSDT = 'USDT/ethereum-inevm', EthereumSeiFastUSD = 'FASTUSD/ethereum-sei', diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index b6c5d9e9eb..fbf6b4b885 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -41,6 +41,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< typeof testnet4SupportedChainNames > = { [Role.Validator]: { + abstracttestnet: true, alephzeroevmtestnet: true, alfajores: true, arbitrumsepolia: true, @@ -70,9 +71,11 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< sonictestnet: true, suavetoliman: true, superpositiontestnet: true, + treasuretopaz: true, unichaintestnet: true, }, [Role.Relayer]: { + abstracttestnet: true, alephzeroevmtestnet: true, alfajores: true, arbitrumsepolia: true, @@ -102,9 +105,11 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< sonictestnet: true, suavetoliman: true, superpositiontestnet: true, + treasuretopaz: true, unichaintestnet: true, }, [Role.Scraper]: { + abstracttestnet: true, alephzeroevmtestnet: true, alfajores: true, arbitrumsepolia: true, @@ -136,6 +141,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< sonictestnet: true, suavetoliman: true, superpositiontestnet: false, + treasuretopaz: true, unichaintestnet: true, }, }; @@ -215,11 +221,11 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'b8add3c-20241106-190246', + tag: 'bb4e82b-20241107-190434', }, blacklist: [...releaseCandidateHelloworldMatchingList, ...relayBlacklist], gasPaymentEnforcement, - metricAppContexts: [ + metricAppContextsGetter: () => [ { name: 'helloworld', matchingList: routerMatchingList( @@ -237,7 +243,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'b8add3c-20241106-190246', + tag: 'bb4e82b-20241107-190434', }, chains: validatorChainConfig(Contexts.Hyperlane), resources: validatorResources, @@ -246,7 +252,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'b8add3c-20241106-190246', + tag: 'bb4e82b-20241107-190434', }, resources: scraperResources, }, diff --git a/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json b/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json index 8f210c9b70..f18b6a10b8 100644 --- a/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json @@ -1,4 +1,7 @@ { + "abstracttestnet": { + "validators": ["0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e"] + }, "alephzeroevmtestnet": { "validators": ["0x556cd94bcb6e5773e8df75e7eb3f91909d266a26"] }, @@ -91,6 +94,9 @@ "superpositiontestnet": { "validators": ["0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a"] }, + "treasuretopaz": { + "validators": ["0x9750849beda0a7870462d4685f953fe39033a5ae"] + }, "unichaintestnet": { "validators": ["0x5e99961cf71918308c3b17ef21b5f515a4f86fe5"] } diff --git a/typescript/infra/config/environments/testnet4/core/verification.json b/typescript/infra/config/environments/testnet4/core/verification.json index 0a7332e89d..c212a7f30d 100644 --- a/typescript/infra/config/environments/testnet4/core/verification.json +++ b/typescript/infra/config/environments/testnet4/core/verification.json @@ -2130,5 +2130,121 @@ "constructorArguments": "000000000000000000000000ddcfecf17586d08a5740b7d91735fcce3dfe3eed", "isProxy": false } + ], + "treasuretopaz": [ + { + "name": "ProxyAdmin", + "address": "0xfbA0c57A6BA24B5440D3e2089222099b4663B98B", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0x5f33Bf018C55CD3034ac06e6DA41162F5acc2fF7", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000eeee2", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC", + "constructorArguments": "0000000000000000000000005f33bf018c55cd3034ac06e6da41162f5acc2ff7000000000000000000000000fba0c57a6ba24b5440d3e2089222099b4663b98b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x5f33Bf018C55CD3034ac06e6DA41162F5acc2fF7" + }, + { + "name": "MerkleTreeHook", + "address": "0x7fa6009b59F139813eA710dB5496976eE8D80E64", + "constructorArguments": "00000000000000000000000028f448885beaaf662f8a9a6c9af20fad17a5a1dc", + "isProxy": false + }, + { + "name": "FallbackDomainRoutingHook", + "address": "0x623f284257f133E8bE7c74f6D4D684B61FE8923a", + "constructorArguments": "00000000000000000000000028f448885beaaf662f8a9a6c9af20fad17a5a1dc000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000007fa6009b59f139813ea710db5496976ee8d80e64", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0xeBe8D0e2BD026D12Ca5e51edA3B0D2b413e83c9c", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f", + "constructorArguments": "000000000000000000000000ebe8d0e2bd026d12ca5e51eda3b0d2b413e83c9c000000000000000000000000fba0c57a6ba24b5440d3e2089222099b4663b98b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeBe8D0e2BD026D12Ca5e51edA3B0D2b413e83c9c" + }, + { + "name": "ValidatorAnnounce", + "address": "0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7", + "constructorArguments": "00000000000000000000000028f448885beaaf662f8a9a6c9af20fad17a5a1dc", + "isProxy": false + } + ], + "abstracttestnet": [ + { + "name": "ProxyAdmin", + "address": "0xfbA0c57A6BA24B5440D3e2089222099b4663B98B", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0x5f33Bf018C55CD3034ac06e6DA41162F5acc2fF7", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000002b74", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC", + "constructorArguments": "0000000000000000000000005f33bf018c55cd3034ac06e6da41162f5acc2ff7000000000000000000000000fba0c57a6ba24b5440d3e2089222099b4663b98b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x5f33Bf018C55CD3034ac06e6DA41162F5acc2fF7" + }, + { + "name": "MerkleTreeHook", + "address": "0x7fa6009b59F139813eA710dB5496976eE8D80E64", + "constructorArguments": "00000000000000000000000028f448885beaaf662f8a9a6c9af20fad17a5a1dc", + "isProxy": false + }, + { + "name": "FallbackDomainRoutingHook", + "address": "0x623f284257f133E8bE7c74f6D4D684B61FE8923a", + "constructorArguments": "00000000000000000000000028f448885beaaf662f8a9a6c9af20fad17a5a1dc000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c0000000000000000000000007fa6009b59f139813ea710db5496976ee8d80e64", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0xeBe8D0e2BD026D12Ca5e51edA3B0D2b413e83c9c", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f", + "constructorArguments": "000000000000000000000000ebe8d0e2bd026d12ca5e51eda3b0d2b413e83c9c000000000000000000000000fba0c57a6ba24b5440d3e2089222099b4663b98b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeBe8D0e2BD026D12Ca5e51edA3B0D2b413e83c9c" + }, + { + "name": "ValidatorAnnounce", + "address": "0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7", + "constructorArguments": "00000000000000000000000028f448885beaaf662f8a9a6c9af20fad17a5a1dc", + "isProxy": false + } ] } diff --git a/typescript/infra/config/environments/testnet4/funding.ts b/typescript/infra/config/environments/testnet4/funding.ts index a1d96ef3f4..154619d301 100644 --- a/typescript/infra/config/environments/testnet4/funding.ts +++ b/typescript/infra/config/environments/testnet4/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'b8add3c-20241106-190239', + tag: 'bb4e82b-20241107-190423', }, // We're currently using the same deployer key as testnet2. // To minimize nonce clobbering we offset the key funder cron @@ -26,6 +26,7 @@ export const keyFunderConfig: KeyFunderConfig< }, // desired balance config desiredBalancePerChain: { + abstracttestnet: '0.1', alephzeroevmtestnet: '2', alfajores: '5', arbitrumsepolia: '0.1', @@ -57,6 +58,7 @@ export const keyFunderConfig: KeyFunderConfig< sonictestnet: '1', suavetoliman: '0.1', superpositiontestnet: '1', + treasuretopaz: '5', unichaintestnet: '0.1', }, desiredKathyBalancePerChain: { diff --git a/typescript/infra/config/environments/testnet4/gasPrices.json b/typescript/infra/config/environments/testnet4/gasPrices.json index 2624ca2fd8..cba1c9fa25 100644 --- a/typescript/infra/config/environments/testnet4/gasPrices.json +++ b/typescript/infra/config/environments/testnet4/gasPrices.json @@ -1,4 +1,8 @@ { + "abstracttestnet": { + "amount": "0.060764843", + "decimals": 9 + }, "alephzeroevmtestnet": { "amount": "40.0", "decimals": 9 @@ -16,11 +20,11 @@ "decimals": 9 }, "basesepolia": { - "amount": "0.001000308", + "amount": "0.00236715", "decimals": 9 }, "berabartio": { - "amount": "1.550227134", + "amount": "10.832064411", "decimals": 9 }, "bsctestnet": { @@ -32,7 +36,7 @@ "decimals": 9 }, "citreatestnet": { - "amount": "1.5", + "amount": "5.032361163", "decimals": 9 }, "connextsepolia": { @@ -56,7 +60,7 @@ "decimals": 9 }, "holesky": { - "amount": "0.318071759", + "amount": "0.760231049", "decimals": 9 }, "inksepolia": { @@ -68,19 +72,19 @@ "decimals": 9 }, "optimismsepolia": { - "amount": "0.001000253", + "amount": "0.001000256", "decimals": 9 }, "polygonamoy": { - "amount": "35.0", + "amount": "56.722205902", "decimals": 9 }, "scrollsepolia": { - "amount": "22.997979926", + "amount": "2.398017347", "decimals": 9 }, "sepolia": { - "amount": "6.302602541", + "amount": "4.349910601", "decimals": 9 }, "solanatestnet": { @@ -88,7 +92,7 @@ "decimals": 9 }, "soneiumtestnet": { - "amount": "0.001000273", + "amount": "0.001000259", "decimals": 9 }, "sonictestnet": { @@ -96,15 +100,19 @@ "decimals": 9 }, "suavetoliman": { - "amount": "1.0", + "amount": "2.0736", "decimals": 9 }, "superpositiontestnet": { "amount": "0.01", "decimals": 9 }, + "treasuretopaz": { + "amount": "0.060735501", + "decimals": 9 + }, "unichaintestnet": { - "amount": "0.00100027", + "amount": "0.001000264", "decimals": 9 } } diff --git a/typescript/infra/config/environments/testnet4/supportedChainNames.ts b/typescript/infra/config/environments/testnet4/supportedChainNames.ts index e84783874f..a4a7cb9e50 100644 --- a/typescript/infra/config/environments/testnet4/supportedChainNames.ts +++ b/typescript/infra/config/environments/testnet4/supportedChainNames.ts @@ -1,5 +1,6 @@ // Placing them here instead of adjacent chains file to avoid circular dep export const testnet4SupportedChainNames = [ + 'abstracttestnet', 'alephzeroevmtestnet', 'alfajores', 'arbitrumsepolia', @@ -29,6 +30,7 @@ export const testnet4SupportedChainNames = [ 'sonictestnet', 'suavetoliman', 'superpositiontestnet', + 'treasuretopaz', 'unichaintestnet', ] as const; diff --git a/typescript/infra/config/environments/testnet4/tokenPrices.json b/typescript/infra/config/environments/testnet4/tokenPrices.json index 0a3f068da5..24670e98ea 100644 --- a/typescript/infra/config/environments/testnet4/tokenPrices.json +++ b/typescript/infra/config/environments/testnet4/tokenPrices.json @@ -1,4 +1,5 @@ { + "abstracttestnet": "10", "alephzeroevmtestnet": "10", "alfajores": "10", "arbitrumsepolia": "10", @@ -25,5 +26,6 @@ "sonictestnet": "10", "suavetoliman": "10", "superpositiontestnet": "10", + "treasuretopaz": "10", "unichaintestnet": "10" } diff --git a/typescript/infra/config/environments/testnet4/validators.ts b/typescript/infra/config/environments/testnet4/validators.ts index 86ac9d4896..4a97ebaa44 100644 --- a/typescript/infra/config/environments/testnet4/validators.ts +++ b/typescript/infra/config/environments/testnet4/validators.ts @@ -368,5 +368,30 @@ export const validatorChainConfig = ( 'inksepolia', ), }, + + abstracttestnet: { + interval: 5, + reorgPeriod: getReorgPeriod('abstracttestnet'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e'], + [Contexts.ReleaseCandidate]: [], + [Contexts.Neutron]: [], + }, + 'abstracttestnet', + ), + }, + treasuretopaz: { + interval: 5, + reorgPeriod: getReorgPeriod('treasuretopaz'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x9750849beda0a7870462d4685f953fe39033a5ae'], + [Contexts.ReleaseCandidate]: [], + [Contexts.Neutron]: [], + }, + 'treasuretopaz', + ), + }, }; }; diff --git a/typescript/infra/config/registry.ts b/typescript/infra/config/registry.ts index 4b72c9f5be..8b9ea5edb7 100644 --- a/typescript/infra/config/registry.ts +++ b/typescript/infra/config/registry.ts @@ -12,6 +12,7 @@ import { ChainMap, ChainMetadata, ChainName, + WarpCoreConfig, getDomainId as resolveDomainId, getReorgPeriod as resolveReorgPeriod, } from '@hyperlane-xyz/sdk'; @@ -91,7 +92,7 @@ export function getChainAddresses(): ChainMap { return getRegistry().getAddresses(); } -export function getWarpAddresses(warpRouteId: string) { +export function getWarpCoreConfig(warpRouteId: string): WarpCoreConfig { const registry = getRegistry(); const warpRouteConfig = registry.getWarpRoute(warpRouteId); @@ -100,8 +101,12 @@ export function getWarpAddresses(warpRouteId: string) { `Warp route config for ${warpRouteId} not found in registry`, ); } + return warpRouteConfig; +} - return warpConfigToWarpAddresses(warpRouteConfig); +export function getWarpAddresses(warpRouteId: string) { + const warpCoreConfig = getWarpCoreConfig(warpRouteId); + return warpConfigToWarpAddresses(warpCoreConfig); } export function getEnvChains(env: DeployEnvironment): ChainName[] { diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index 3a9bf87e0b..53c202db8e 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -1,15 +1,16 @@ import { ChainMap, MultiProvider, - RouterConfig, + OwnableConfig, TokenRouterConfig, } from '@hyperlane-xyz/sdk'; +import { objMap } from '@hyperlane-xyz/utils'; -import { getHyperlaneCore } from '../scripts/core-utils.js'; import { EnvironmentConfig, getRouterConfigsForAllVms, } from '../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../src/config/warp.js'; import { getAncient8EthereumUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.js'; import { getArbitrumEthereumZircuitAmphrETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.js'; @@ -21,6 +22,7 @@ import { getEclipseEthereumWeEthsWarpConfig } from './environments/mainnet3/warp import { getEclipseStrideTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.js'; 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 { getEthereumInevmUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.js'; import { getEthereumInevmUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.js'; import { getEthereumSeiFastUSDWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.js'; @@ -33,16 +35,12 @@ import { getRenzoEZETHWarpConfig } from './environments/mainnet3/warp/configGett import { getRenzoPZETHWarpConfig } from './environments/mainnet3/warp/configGetters/getRenzoPZETHWarpConfig.js'; import { WarpRouteIds } from './environments/mainnet3/warp/warpIds.js'; -type WarpConfigGetterWithConfig = ( - routerConfig: ChainMap, +type WarpConfigGetter = ( + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ) => Promise>; -type WarpConfigGetterWithoutConfig = () => Promise>; - -export const warpConfigGetterMap: Record< - string, - WarpConfigGetterWithConfig | WarpConfigGetterWithoutConfig -> = { +export const warpConfigGetterMap: Record = { [WarpRouteIds.Ancient8EthereumUSDC]: getAncient8EthereumUSDCWarpConfig, [WarpRouteIds.ArbitrumEthereumZircuitAMPHRETH]: getArbitrumEthereumZircuitAmphrETHWarpConfig, @@ -53,6 +51,7 @@ export const warpConfigGetterMap: Record< [WarpRouteIds.ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiTaikoZircuitEZETH]: getRenzoEZETHWarpConfig, [WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig, + [WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig, [WarpRouteIds.EthereumSeiFastUSD]: getEthereumSeiFastUSDWarpConfig, [WarpRouteIds.EthereumVictionETH]: getEthereumVictionETHWarpConfig, [WarpRouteIds.EthereumVictionUSDC]: getEthereumVictionUSDCWarpConfig, @@ -77,6 +76,19 @@ export async function getWarpConfig( envConfig, multiProvider, ); + // Strip the owners from the router config + const routerConfigWithoutOwner = objMap(routerConfig, (_chain, config) => { + const { owner, ownerOverrides, ...configWithoutOwner } = config; + return configWithoutOwner; + }); + // Isolate the owners from the router config + const abacusWorksEnvOwnerConfig = objMap(routerConfig, (_chain, config) => { + const { owner, ownerOverrides } = config; + return { + owner, + ownerOverrides, + }; + }); const warpConfigGetter = warpConfigGetterMap[warpRouteId]; if (!warpConfigGetter) { @@ -87,9 +99,5 @@ export async function getWarpConfig( ); } - if (warpConfigGetter.length === 1) { - return warpConfigGetter(routerConfig); - } else { - return (warpConfigGetter as WarpConfigGetterWithoutConfig)(); - } + return warpConfigGetter(routerConfigWithoutOwner, abacusWorksEnvOwnerConfig); } diff --git a/typescript/infra/helm/warp-routes/templates/_helpers.tpl b/typescript/infra/helm/warp-routes/templates/_helpers.tpl index 52bc42a863..2a9424b0a9 100644 --- a/typescript/infra/helm/warp-routes/templates/_helpers.tpl +++ b/typescript/infra/helm/warp-routes/templates/_helpers.tpl @@ -69,14 +69,14 @@ The warp-routes container imagePullPolicy: IfNotPresent env: - name: LOG_FORMAT - value: pretty + value: json command: - ./node_modules/.bin/tsx - - ./typescript/infra/scripts/warp-routes/monitor-warp-routes-balances.ts + - ./typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts - -v - - "10000" - - -f - - {{ .Values.configFilePath }} + - "30000" + - --warpRouteId + - {{ .Values.warpRouteId }} - -e - {{ .Values.environment}} envFrom: diff --git a/typescript/infra/helm/warp-routes/templates/env-var-external-secret.yaml b/typescript/infra/helm/warp-routes/templates/env-var-external-secret.yaml index d1f1eda25d..5bad068b9c 100644 --- a/typescript/infra/helm/warp-routes/templates/env-var-external-secret.yaml +++ b/typescript/infra/helm/warp-routes/templates/env-var-external-secret.yaml @@ -22,6 +22,7 @@ spec: data: GCP_SECRET_OVERRIDES_ENABLED: "true" GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_COINGECKO_API_KEY: {{ printf "'{{ .%s_coingecko_api_key | toString }}'" .Values.hyperlane.runEnv }} + GCP_SECRET_OVERRIDE_HYPERLANE_{{ .Values.hyperlane.runEnv | upper }}_KEY_DEPLOYER: {{ print "'{{ .deployer_key | toString }}'" }} {{/* * For each network, create an environment variable with the RPC endpoint. * The templating of external-secrets will use the data section below to know how @@ -34,6 +35,9 @@ spec: - secretKey: {{ printf "%s_coingecko_api_key" .Values.hyperlane.runEnv }} remoteRef: key: {{ printf "%s-coingecko-api-key" .Values.hyperlane.runEnv }} + - secretKey: deployer_key + remoteRef: + key: {{ printf "hyperlane-%s-key-deployer" .Values.hyperlane.runEnv }} {{/* * For each network, load the secret in GCP secret manager with the form: environment-rpc-endpoint-network, * and associate it with the secret key networkname_rpc. diff --git a/typescript/infra/package.json b/typescript/infra/package.json index c1f29f85f9..35ffda5853 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": "6.0.0", + "version": "7.1.0", "dependencies": { "@arbitrum/sdk": "^3.0.0", "@aws-sdk/client-iam": "^3.74.0", @@ -13,10 +13,10 @@ "@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "6.0.0", - "@hyperlane-xyz/registry": "4.10.0", - "@hyperlane-xyz/sdk": "6.0.0", - "@hyperlane-xyz/utils": "6.0.0", + "@hyperlane-xyz/helloworld": "7.1.0", + "@hyperlane-xyz/registry": "6.1.0", + "@hyperlane-xyz/sdk": "7.1.0", + "@hyperlane-xyz/utils": "7.1.0", "@inquirer/prompts": "^5.3.8", "@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 4fd4c8ec3d..105fdcf49b 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -1,11 +1,7 @@ import path, { join } from 'path'; import yargs, { Argv } from 'yargs'; -import { - ChainAddresses, - IRegistry, - warpConfigToWarpAddresses, -} from '@hyperlane-xyz/registry'; +import { ChainAddresses, IRegistry } from '@hyperlane-xyz/registry'; import { ChainMap, ChainMetadata, @@ -157,20 +153,26 @@ export function withChain(args: Argv) { .alias('c', 'chain'); } -export function withChains(args: Argv) { +export function withChains(args: Argv, chainOptions?: ChainName[]) { return ( args .describe('chains', 'Set of chains to perform actions on.') .array('chains') - .choices('chains', getChains()) + .choices( + 'chains', + !chainOptions || chainOptions.length === 0 ? getChains() : chainOptions, + ) // Ensure chains are unique .coerce('chains', (chains: string[]) => Array.from(new Set(chains))) .alias('c', 'chains') ); } -export function withChainsRequired(args: Argv) { - return withChains(args).demandOption('chains'); +export function withChainsRequired( + args: Argv, + chainOptions?: ChainName[], +) { + return withChains(args, chainOptions).demandOption('chains'); } export function withWarpRouteId(args: Argv) { @@ -191,9 +193,8 @@ export function withProtocol(args: Argv) { export function withAgentRole(args: Argv) { return args - .describe('role', 'agent roles') - .array('role') - .coerce('role', (role: string[]): Role[] => role.map(assertRole)) + .describe('role', 'agent role') + .coerce('role', (role: string): Role => assertRole(role)) .demandOption('role') .alias('r', 'role'); } @@ -206,11 +207,16 @@ export function withAgentRoles(args: Argv) { .coerce('roles', (role: string[]): Role[] => role.map(assertRole)) .choices('roles', Object.values(Role)) // Ensure roles are unique - .coerce('roles', (roles: string[]) => Array.from(new Set(roles))) + .coerce('roles', (roles: Role[]) => Array.from(new Set(roles))) .alias('r', 'roles') + .alias('role', 'roles') ); } +export function withAgentRolesRequired(args: Argv) { + return withAgentRoles(args).demandOption('roles'); +} + export function withKeyRoleAndChain(args: Argv) { return args .describe('role', 'key role') diff --git a/typescript/infra/scripts/agents/utils.ts b/typescript/infra/scripts/agents/utils.ts index 84fe60f597..fa3a1da4ce 100644 --- a/typescript/infra/scripts/agents/utils.ts +++ b/typescript/infra/scripts/agents/utils.ts @@ -11,7 +11,7 @@ import { HelmCommand } from '../../src/utils/helm.js'; import { assertCorrectKubeContext, getArgs, - withAgentRole, + withAgentRolesRequired, withChains, withContext, } from '../agent-utils.js'; @@ -70,21 +70,23 @@ export class AgentCli { protected async init() { if (this.initialized) return; - const argv = await withChains(withAgentRole(withContext(getArgs()))) + const argv = await withChains( + withAgentRolesRequired(withContext(getArgs())), + ) .describe('dry-run', 'Run through the steps without making any changes') .boolean('dry-run').argv; if ( argv.chains && argv.chains.length > 0 && - !argv.role.includes(Role.Validator) + !argv.roles.includes(Role.Validator) ) { console.warn('Chain argument applies to validator role only. Ignoring.'); } const { envConfig, agentConfig } = await getConfigsBasedOnArgs(argv); await assertCorrectKubeContext(envConfig); - this.roles = argv.role; + this.roles = argv.roles; this.envConfig = envConfig; this.agentConfig = agentConfig; this.dryRun = argv.dryRun || false; diff --git a/typescript/infra/scripts/announce-validators.ts b/typescript/infra/scripts/announce-validators.ts index 2072fde3c4..b883b2ba18 100644 --- a/typescript/infra/scripts/announce-validators.ts +++ b/typescript/infra/scripts/announce-validators.ts @@ -74,7 +74,8 @@ async function main() { await Promise.all( Object.entries(agentConfig.validators.chains) .filter(([validatorChain, _]) => { - if (chainsToSkip.includes(validatorChain)) { + // Ensure we skip lumia, as we don't have the addresses in registry. + if (validatorChain === 'lumia') { return false; } diff --git a/typescript/infra/scripts/check/check-owner-ica.ts b/typescript/infra/scripts/check/check-owner-ica.ts index bd52ad9222..308093bf5a 100644 --- a/typescript/infra/scripts/check/check-owner-ica.ts +++ b/typescript/infra/scripts/check/check-owner-ica.ts @@ -1,14 +1,8 @@ -import { ethers } from 'ethers'; - import { AccountConfig, InterchainAccount } from '@hyperlane-xyz/sdk'; -import { - Address, - eqAddress, - isZeroish, - isZeroishAddress, -} from '@hyperlane-xyz/utils'; +import { Address, eqAddress, isZeroishAddress } from '@hyperlane-xyz/utils'; import { icas } from '../../config/environments/mainnet3/owners.js'; +import { chainsToSkip } from '../../src/config/chain.js'; import { isEthereumProtocolChain } from '../../src/utils/utils.js'; import { getArgs as getEnvArgs, withChains } from '../agent-utils.js'; import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js'; @@ -39,7 +33,9 @@ async function main() { const checkOwnerIcaChains = ( chains?.length ? chains : Object.keys(icas) - ).filter(isEthereumProtocolChain); + ).filter( + (chain) => isEthereumProtocolChain(chain) && !chainsToSkip.includes(chain), + ); const ownerConfig: AccountConfig = { origin: ownerChain, diff --git a/typescript/infra/scripts/check/check-validator-announce.ts b/typescript/infra/scripts/check/check-validator-announce.ts index fec2f2e071..0f484329f4 100644 --- a/typescript/infra/scripts/check/check-validator-announce.ts +++ b/typescript/infra/scripts/check/check-validator-announce.ts @@ -23,9 +23,10 @@ async function main() { const config = getEnvironmentConfig(environment); const { core } = await getHyperlaneCore(environment); + // Ensure we skip lumia, as we don't have the addresses in registry. const targetNetworks = ( chains && chains.length > 0 ? chains : config.supportedChainNames - ).filter(isEthereumProtocolChain); + ).filter((chain) => isEthereumProtocolChain(chain) && chain !== 'lumia'); const chainsWithUnannouncedValidators: ChainMap = {}; diff --git a/typescript/infra/scripts/create-keys.ts b/typescript/infra/scripts/keys/create-keys.ts similarity index 61% rename from typescript/infra/scripts/create-keys.ts rename to typescript/infra/scripts/keys/create-keys.ts index c5798679aa..43b7694b0b 100644 --- a/typescript/infra/scripts/create-keys.ts +++ b/typescript/infra/scripts/keys/create-keys.ts @@ -1,6 +1,5 @@ -import { createAgentKeysIfNotExists } from '../src/agents/key-utils.js'; - -import { getAgentConfigsBasedOnArgs } from './agent-utils.js'; +import { createAgentKeysIfNotExists } from '../../src/agents/key-utils.js'; +import { getAgentConfigsBasedOnArgs } from '../agent-utils.js'; async function main() { const { agentConfig } = await getAgentConfigsBasedOnArgs(); diff --git a/typescript/infra/scripts/delete-keys.ts b/typescript/infra/scripts/keys/delete-keys.ts similarity index 58% rename from typescript/infra/scripts/delete-keys.ts rename to typescript/infra/scripts/keys/delete-keys.ts index 934733cfda..12a0f1bb78 100644 --- a/typescript/infra/scripts/delete-keys.ts +++ b/typescript/infra/scripts/keys/delete-keys.ts @@ -1,6 +1,5 @@ -import { deleteAgentKeys } from '../src/agents/key-utils.js'; - -import { getAgentConfigsBasedOnArgs } from './agent-utils.js'; +import { deleteAgentKeys } from '../../src/agents/key-utils.js'; +import { getAgentConfigsBasedOnArgs } from '../agent-utils.js'; async function main() { const { agentConfig } = await getAgentConfigsBasedOnArgs(); diff --git a/typescript/infra/scripts/get-key-addresses.ts b/typescript/infra/scripts/keys/get-key-addresses.ts similarity index 80% rename from typescript/infra/scripts/get-key-addresses.ts rename to typescript/infra/scripts/keys/get-key-addresses.ts index b35c38cd22..9cd7df379a 100644 --- a/typescript/infra/scripts/get-key-addresses.ts +++ b/typescript/infra/scripts/keys/get-key-addresses.ts @@ -1,7 +1,6 @@ -import { getAllCloudAgentKeys } from '../src/agents/key-utils.js'; - -import { getArgs, withContext, withProtocol } from './agent-utils.js'; -import { getConfigsBasedOnArgs } from './core-utils.js'; +import { getAllCloudAgentKeys } from '../../src/agents/key-utils.js'; +import { getArgs, withContext, withProtocol } from '../agent-utils.js'; +import { getConfigsBasedOnArgs } from '../core-utils.js'; async function main() { const argv = await withProtocol(withContext(getArgs())).argv; diff --git a/typescript/infra/scripts/keys/get-key.ts b/typescript/infra/scripts/keys/get-key.ts new file mode 100644 index 0000000000..60338717de --- /dev/null +++ b/typescript/infra/scripts/keys/get-key.ts @@ -0,0 +1,38 @@ +import { getCloudAgentKey } from '../../src/agents/key-utils.js'; +import { + getArgs, + withAgentRole, + withContext, + withProtocol, +} from '../agent-utils.js'; +import { getConfigsBasedOnArgs } from '../core-utils.js'; + +async function main() { + const argv = await withAgentRole(withContext(getArgs())).argv; + + const { agentConfig } = await getConfigsBasedOnArgs(argv); + + // As a (very rudimentary) security precaution, we don't print the private key directly to + // the console if this script is ran directly. + // We only write the private key to the console if it is not a tty, e.g. if + // this is being called in a subshell or piped to another command. + // + // E.g. this will print the private key: + // $ echo `yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer` + // or this too: + // $ echo $(yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer) + // and even this: + // $ yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer | cat + // + // But this will not print the private key directly to the shell: + // $ yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer + if (process.stdout.isTTY) { + console.log(''); + } else { + const key = getCloudAgentKey(agentConfig, argv.role); + await key.fetch(); + console.log(key.privateKey); + } +} + +main().catch(console.error); diff --git a/typescript/infra/scripts/get-owner-ica.ts b/typescript/infra/scripts/keys/get-owner-ica.ts similarity index 90% rename from typescript/infra/scripts/get-owner-ica.ts rename to typescript/infra/scripts/keys/get-owner-ica.ts index bfb348cb3a..b4d42c860e 100644 --- a/typescript/infra/scripts/get-owner-ica.ts +++ b/typescript/infra/scripts/keys/get-owner-ica.ts @@ -1,10 +1,10 @@ import { AccountConfig, InterchainAccount } from '@hyperlane-xyz/sdk'; import { Address, eqAddress, isZeroishAddress } from '@hyperlane-xyz/utils'; -import { isEthereumProtocolChain } from '../src/utils/utils.js'; - -import { getArgs as getEnvArgs, withChains } from './agent-utils.js'; -import { getEnvironmentConfig, getHyperlaneCore } from './core-utils.js'; +import { chainsToSkip } from '../../src/config/chain.js'; +import { isEthereumProtocolChain } from '../../src/utils/utils.js'; +import { getArgs as getEnvArgs, withChains } from '../agent-utils.js'; +import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js'; function getArgs() { return withChains(getEnvArgs()) @@ -62,7 +62,9 @@ async function main() { const getOwnerIcaChains = ( chains?.length ? chains : config.supportedChainNames - ).filter(isEthereumProtocolChain); + ).filter( + (chain) => isEthereumProtocolChain(chain) && !chainsToSkip.includes(chain), + ); const results: Record = {}; const settledResults = await Promise.allSettled( diff --git a/typescript/infra/scripts/rotate-key.ts b/typescript/infra/scripts/keys/rotate-key.ts similarity index 97% rename from typescript/infra/scripts/rotate-key.ts rename to typescript/infra/scripts/keys/rotate-key.ts index c7a9fe5597..bd01f6071c 100644 --- a/typescript/infra/scripts/rotate-key.ts +++ b/typescript/infra/scripts/keys/rotate-key.ts @@ -3,7 +3,7 @@ import { getArgs, withContext, withKeyRoleAndChain, -} from './agent-utils.js'; +} from '../agent-utils.js'; async function rotateKey() { const argv = await withContext(withKeyRoleAndChain(getArgs())).argv; diff --git a/typescript/infra/scripts/update-key.ts b/typescript/infra/scripts/keys/update-key.ts similarity index 97% rename from typescript/infra/scripts/update-key.ts rename to typescript/infra/scripts/keys/update-key.ts index 862b8c8bc6..da27c410bd 100644 --- a/typescript/infra/scripts/update-key.ts +++ b/typescript/infra/scripts/keys/update-key.ts @@ -3,7 +3,7 @@ import { getArgs, withContext, withKeyRoleAndChain, -} from './agent-utils.js'; +} from '../agent-utils.js'; async function rotateKey() { const argv = await withKeyRoleAndChain(withContext(getArgs())).argv; diff --git a/typescript/infra/scripts/relay.ts b/typescript/infra/scripts/relay.ts index ddfbad99df..e689146d8f 100644 --- a/typescript/infra/scripts/relay.ts +++ b/typescript/infra/scripts/relay.ts @@ -10,11 +10,10 @@ const CACHE_PATH = process.env.RELAYER_CACHE ?? './relayer-cache.json'; async function main() { const { environment } = await getArgs().argv; const { core } = await getHyperlaneCore(environment); - const relayer = new HyperlaneRelayer({ core }); - // target subset of chains - // const chains = ['ethereum', 'polygon', 'bsc'] - const chains = undefined; + // target subset of chains and senders/recipients + const whitelist = undefined; + const relayer = new HyperlaneRelayer({ core, whitelist }); try { const contents = await readFile(CACHE_PATH, 'utf-8'); @@ -26,10 +25,10 @@ async function main() { console.error(`Failed to load cache from ${CACHE_PATH}`); } - relayer.start(chains); + relayer.start(); process.once('SIGINT', async () => { - relayer.stop(chains); + relayer.stop(); const cache = JSON.stringify(relayer.cache); await writeFile(CACHE_PATH, cache, 'utf-8'); diff --git a/typescript/infra/scripts/safes/get-pending-txs.ts b/typescript/infra/scripts/safes/get-pending-txs.ts new file mode 100644 index 0000000000..0c7fc70842 --- /dev/null +++ b/typescript/infra/scripts/safes/get-pending-txs.ts @@ -0,0 +1,202 @@ +import { confirm } from '@inquirer/prompts'; +import chalk from 'chalk'; +import yargs from 'yargs'; + +import { MultiProvider } from '@hyperlane-xyz/sdk'; + +import { Contexts } from '../../config/contexts.js'; +import { safes } from '../../config/environments/mainnet3/owners.js'; +import { Role } from '../../src/roles.js'; +import { executeTx, getSafeAndService } from '../../src/utils/safe.js'; +import { withChains } from '../agent-utils.js'; +import { getEnvironmentConfig } from '../core-utils.js'; + +export enum SafeTxStatus { + NO_CONFIRMATIONS = '🔴', + PENDING = '🟡', + ONE_AWAY = '🔵', + READY_TO_EXECUTE = '🟢', +} + +type SafeStatus = { + chain: string; + nonce: number; + submissionDate: string; + shortTxHash: string; + fullTxHash: string; + confs: number; + threshold: number; + status: string; +}; + +export async function getPendingTxsForChains( + chains: string[], + multiProvider: MultiProvider, +): Promise { + const txs: SafeStatus[] = []; + await Promise.all( + chains.map(async (chain) => { + if (!safes[chain]) { + console.error(chalk.red.bold(`No safe found for ${chain}`)); + return; + } + + if (chain === 'endurance') { + console.info( + chalk.gray.italic( + `Skipping chain ${chain} as it does not have a functional safe API`, + ), + ); + return; + } + + let safeSdk, safeService; + try { + ({ safeSdk, safeService } = await getSafeAndService( + chain, + multiProvider, + safes[chain], + )); + } catch (error) { + console.warn( + chalk.yellow( + `Skipping chain ${chain} as there was an error getting the safe service: ${error}`, + ), + ); + return; + } + + const threshold = await safeSdk.getThreshold(); + const pendingTxs = await safeService.getPendingTransactions(safes[chain]); + if (pendingTxs.results.length === 0) { + return; + } + + pendingTxs.results.forEach( + ({ nonce, submissionDate, safeTxHash, confirmations }) => { + const confs = confirmations?.length ?? 0; + const status = + confs >= threshold + ? SafeTxStatus.READY_TO_EXECUTE + : confs === 0 + ? SafeTxStatus.NO_CONFIRMATIONS + : threshold - confs + ? SafeTxStatus.ONE_AWAY + : SafeTxStatus.PENDING; + + txs.push({ + chain, + nonce, + submissionDate: new Date(submissionDate).toDateString(), + shortTxHash: `${safeTxHash.slice(0, 6)}...${safeTxHash.slice(-4)}`, + fullTxHash: safeTxHash, + confs, + threshold, + status, + }); + }, + ); + }), + ); + return txs.sort( + (a, b) => a.chain.localeCompare(b.chain) || a.nonce - b.nonce, + ); +} + +async function main() { + const safeChains = Object.keys(safes); + const { chains, fullTxHash, execute } = await withChains( + yargs(process.argv.slice(2)), + safeChains, + ) + .describe( + 'fullTxHash', + 'If enabled, include the full tx hash in the output', + ) + .boolean('fullTxHash') + .default('fullTxHash', false) + .describe( + 'execute', + 'If enabled, execute transactions that have enough confirmations', + ) + .boolean('execute') + .default('execute', false).argv; + + const chainsToCheck = chains || safeChains; + if (chainsToCheck.length === 0) { + console.error('No chains provided'); + process.exit(1); + } + + const envConfig = getEnvironmentConfig('mainnet3'); + const multiProvider = await envConfig.getMultiProvider( + Contexts.Hyperlane, + Role.Deployer, + true, + chainsToCheck, + ); + + const pendingTxs = await getPendingTxsForChains(chainsToCheck, multiProvider); + if (pendingTxs.length === 0) { + console.info(chalk.green('No pending transactions found!')); + process.exit(0); + } + console.table(pendingTxs, [ + 'chain', + 'nonce', + 'submissionDate', + fullTxHash ? 'fullTxHash' : 'shortTxHash', + 'confs', + 'threshold', + 'status', + ]); + + const executableTxs = pendingTxs.filter( + (tx) => tx.status === SafeTxStatus.READY_TO_EXECUTE, + ); + if ( + executableTxs.length === 0 || + !execute || + !(await confirm({ + message: 'Execute transactions?', + default: execute, + })) + ) { + console.info(chalk.green('No transactions to execute!')); + process.exit(0); + } else { + console.info(chalk.blueBright('Executing transactions...')); + } + + for (const tx of executableTxs) { + const confirmExecuteTx = await confirm({ + message: `Execute transaction ${tx.shortTxHash} on chain ${tx.chain}?`, + default: execute, + }); + if (confirmExecuteTx) { + console.log( + `Executing transaction ${tx.shortTxHash} on chain ${tx.chain}`, + ); + try { + await executeTx( + tx.chain, + multiProvider, + safes[tx.chain], + tx.fullTxHash, + ); + } catch (error) { + console.error(chalk.red(`Error executing transaction: ${error}`)); + return; + } + } + } + + process.exit(0); +} + +main() + .then() + .catch((e) => { + console.error(e); + process.exit(1); + }); diff --git a/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts b/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts index 95a749acef..e7714778ca 100644 --- a/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts +++ b/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts @@ -1,32 +1,65 @@ +import { checkbox } from '@inquirer/prompts'; import yargs from 'yargs'; import { Contexts } from '../../config/contexts.js'; +import { WarpRouteIds } from '../../config/environments/mainnet3/warp/warpIds.js'; import { HelmCommand } from '../../src/utils/helm.js'; import { WarpRouteMonitorHelmManager } from '../../src/warp/helm.js'; -import { assertCorrectKubeContext, getAgentConfig } from '../agent-utils.js'; +import { + assertCorrectKubeContext, + getAgentConfig, + getArgs, + withWarpRouteId, +} from '../agent-utils.js'; import { getEnvironmentConfig } from '../core-utils.js'; async function main() { - const { filePath } = await yargs(process.argv.slice(2)) - .alias('f', 'filePath') - .describe( - 'filePath', - 'indicate the filepath to the warp route yaml file relative to the monorepo root', - ) - .demandOption('filePath') - .string('filePath') - .parse(); - - const environment = 'mainnet3'; + const { environment, warpRouteId } = await withWarpRouteId(getArgs()).argv; + + let warpRouteIds; + if (warpRouteId) { + warpRouteIds = [warpRouteId]; + } else { + warpRouteIds = await getWarpRouteIdsInteractive(); + } + await assertCorrectKubeContext(getEnvironmentConfig(environment)); const agentConfig = getAgentConfig(Contexts.Hyperlane, environment); - const helmManager = new WarpRouteMonitorHelmManager( - filePath, - environment, - agentConfig.environmentChainNames, - ); - await helmManager.runHelmCommand(HelmCommand.InstallOrUpgrade); + const deployWarpMonitor = async (warpRouteId: string) => { + const helmManager = new WarpRouteMonitorHelmManager( + warpRouteId, + environment, + agentConfig.environmentChainNames, + ); + await helmManager.runHelmCommand(HelmCommand.InstallOrUpgrade); + }; + + for (const id of warpRouteIds) { + console.log(`Deploying Warp Monitor for Warp Route ID: ${id}`); + await deployWarpMonitor(id); + } +} + +async function getWarpRouteIdsInteractive() { + const choices = Object.values(WarpRouteIds).map((id) => ({ + value: id, + })); + + let selection: WarpRouteIds[] = []; + + while (!selection.length) { + selection = await checkbox({ + message: 'Select Warp Route IDs to deploy', + choices, + pageSize: 30, + }); + if (!selection.length) { + console.log('Please select at least one Warp Route ID'); + } + } + + return selection; } main() diff --git a/typescript/infra/scripts/warp-routes/monitor-warp-routes-balances.ts b/typescript/infra/scripts/warp-routes/monitor-warp-routes-balances.ts deleted file mode 100644 index fd4da97f57..0000000000 --- a/typescript/infra/scripts/warp-routes/monitor-warp-routes-balances.ts +++ /dev/null @@ -1,697 +0,0 @@ -import { SystemProgram } from '@solana/web3.js'; -import { ethers } from 'ethers'; -import { Gauge, Registry } from 'prom-client'; - -import { - HypXERC20Lockbox__factory, - HypXERC20__factory, - IXERC20, - IXERC20__factory, -} from '@hyperlane-xyz/core'; -import { ERC20__factory } from '@hyperlane-xyz/core'; -import { createWarpRouteConfigId } from '@hyperlane-xyz/registry'; -import { - ChainMap, - ChainMetadata, - ChainName, - CoinGeckoTokenPriceGetter, - CosmNativeTokenAdapter, - CwNativeTokenAdapter, - MultiProtocolProvider, - SealevelHypCollateralAdapter, - SealevelHypNativeAdapter, - SealevelHypSyntheticAdapter, - TokenType, - WarpRouteConfig, - WarpRouteConfigSchema, -} from '@hyperlane-xyz/sdk'; -import { - ProtocolType, - objMap, - promiseObjAll, - rootLogger, -} from '@hyperlane-xyz/utils'; - -import { DeployEnvironment } from '../../src/config/environment.js'; -import { fetchGCPSecret } from '../../src/utils/gcloud.js'; -import { startMetricsServer } from '../../src/utils/metrics.js'; -import { readYaml } from '../../src/utils/utils.js'; -import { getArgs } from '../agent-utils.js'; -import { getEnvironmentConfig } from '../core-utils.js'; - -const logger = rootLogger.child({ module: 'warp-balance-monitor' }); - -const metricsRegister = new Registry(); - -interface WarpRouteMetrics { - chain_name: ChainName; - token_address: string; - token_name: string; - wallet_address: string; - token_type: TokenType; - warp_route_id: string; - related_chain_names: string; -} - -type WarpRouteMetricLabels = keyof WarpRouteMetrics; - -const warpRouteMetricLabels: WarpRouteMetricLabels[] = [ - 'chain_name', - 'token_address', - 'token_name', - 'wallet_address', - 'token_type', - 'warp_route_id', - 'related_chain_names', -]; - -const warpRouteTokenBalance = new Gauge({ - name: 'hyperlane_warp_route_token_balance', - help: 'HypERC20 token balance of a Warp Route', - registers: [metricsRegister], - labelNames: warpRouteMetricLabels, -}); - -const warpRouteCollateralValue = new Gauge({ - name: 'hyperlane_warp_route_collateral_value', - help: 'Total value of collateral held in a HypERC20Collateral or HypNative contract of a Warp Route', - registers: [metricsRegister], - labelNames: warpRouteMetricLabels, -}); - -const xERC20LimitsGauge = new Gauge({ - name: 'hyperlane_xerc20_limits', - help: 'Current minting and burning limits of xERC20 tokens', - registers: [metricsRegister], - labelNames: ['chain_name', 'limit_type', 'token_name'], -}); - -interface xERC20Limit { - tokenName: string; - mint: number; - burn: number; - mintMax: number; - burnMax: number; -} - -interface WarpRouteInfo { - balance: number; - valueUSD?: number; -} - -export function readWarpRouteConfig(filePath: string) { - const config = readYaml(filePath); - if (!config) throw new Error(`No warp config found at ${filePath}`); - const result = WarpRouteConfigSchema.safeParse(config); - if (!result.success) { - const errorMessages = result.error.issues.map( - (issue: any) => `${issue.path} => ${issue.message}`, - ); - throw new Error(`Invalid warp config:\n ${errorMessages.join('\n')}`); - } - return result.data; -} - -async function main(): Promise { - const { checkFrequency, filePath, environment } = await getArgs() - .describe('checkFrequency', 'frequency to check balances in ms') - .demandOption('checkFrequency') - .alias('v', 'checkFrequency') // v as in Greek letter nu - .number('checkFrequency') - .alias('f', 'filePath') - .describe( - 'filePath', - 'indicate the filepatch to the warp route yaml file relative to typescript/infra', - ) - .demandOption('filePath') - .string('filePath') - .parse(); - - startMetricsServer(metricsRegister); - - const tokenConfig: WarpRouteConfig = - readWarpRouteConfig(filePath).data.config; - - const envConfig = getEnvironmentConfig(environment); - const registry = await envConfig.getRegistry(); - const chainMetadata = await registry.getMetadata(); - - await checkWarpRouteMetrics(checkFrequency, tokenConfig, chainMetadata); - - return true; -} - -// TODO: see issue https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/2708 -async function checkBalance( - tokenConfig: WarpRouteConfig, - multiProtocolProvider: MultiProtocolProvider, - tokenPriceGetter: CoinGeckoTokenPriceGetter, -): Promise> { - const output = objMap( - tokenConfig, - async (chain: ChainName, token: WarpRouteConfig[ChainName]) => { - switch (token.type) { - case TokenType.native: { - switch (token.protocolType) { - case ProtocolType.Ethereum: { - const provider = multiProtocolProvider.getEthersV5Provider(chain); - const nativeBalance = await provider.getBalance(token.hypAddress); - - return getNativeTokenWarpInfo( - nativeBalance, - token.decimals, - tokenPriceGetter, - chain, - ); - } - case ProtocolType.Sealevel: { - const adapter = new SealevelHypNativeAdapter( - chain, - multiProtocolProvider, - { - token: token.tokenAddress, - warpRouter: token.hypAddress, - // Mailbox only required for transfers, using system as placeholder - mailbox: SystemProgram.programId.toBase58(), - }, - // Not used for native tokens, but required for the adapter - token?.isSpl2022 ?? false, - ); - const balance = ethers.BigNumber.from( - await adapter.getBalance(token.hypAddress), - ); - - return getNativeTokenWarpInfo( - balance, - token.decimals, - tokenPriceGetter, - chain, - ); - } - case ProtocolType.Cosmos: { - if (!token.ibcDenom) - throw new Error('IBC denom missing for native token'); - const adapter = new CosmNativeTokenAdapter( - chain, - multiProtocolProvider, - {}, - { ibcDenom: token.ibcDenom }, - ); - const tokenBalance = await adapter.getBalance(token.hypAddress); - - return getNativeTokenWarpInfo( - tokenBalance, - token.decimals, - tokenPriceGetter, - chain, - ); - } - } - break; - } - case TokenType.collateral: { - switch (token.protocolType) { - case ProtocolType.Ethereum: { - const provider = multiProtocolProvider.getEthersV5Provider(chain); - if (!token.tokenAddress) - throw new Error('Token address missing for collateral token'); - const tokenContract = ERC20__factory.connect( - token.tokenAddress, - provider, - ); - const collateralBalance = await tokenContract.balanceOf( - token.hypAddress, - ); - - return getCollateralTokenWarpInfo( - collateralBalance, - token.decimals, - tokenPriceGetter, - token.tokenCoinGeckoId, - ); - } - case ProtocolType.Sealevel: { - if (!token.tokenAddress) - throw new Error('Token address missing for collateral token'); - const adapter = new SealevelHypCollateralAdapter( - chain, - multiProtocolProvider, - { - token: token.tokenAddress, - warpRouter: token.hypAddress, - // Mailbox only required for transfers, using system as placeholder - mailbox: SystemProgram.programId.toBase58(), - }, - token?.isSpl2022 ?? false, - ); - const collateralBalance = ethers.BigNumber.from( - await adapter.getBalance(token.hypAddress), - ); - - return getCollateralTokenWarpInfo( - collateralBalance, - token.decimals, - tokenPriceGetter, - token.tokenCoinGeckoId, - ); - } - case ProtocolType.Cosmos: { - if (!token.tokenAddress) - throw new Error('Token address missing for cosmos token'); - const adapter = new CwNativeTokenAdapter( - chain, - multiProtocolProvider, - { - token: token.hypAddress, - }, - token.tokenAddress, - ); - const collateralBalance = ethers.BigNumber.from( - await adapter.getBalance(token.hypAddress), - ); - - return getCollateralTokenWarpInfo( - collateralBalance, - token.decimals, - tokenPriceGetter, - token.tokenCoinGeckoId, - ); - } - } - break; - } - case TokenType.synthetic: { - switch (token.protocolType) { - case ProtocolType.Ethereum: { - const provider = multiProtocolProvider.getEthersV5Provider(chain); - const tokenContract = ERC20__factory.connect( - token.hypAddress, - provider, - ); - const syntheticBalance = await tokenContract.totalSupply(); - return { - balance: parseFloat( - ethers.utils.formatUnits(syntheticBalance, token.decimals), - ), - }; - } - case ProtocolType.Sealevel: { - if (!token.tokenAddress) - throw new Error('Token address missing for synthetic token'); - const adapter = new SealevelHypSyntheticAdapter( - chain, - multiProtocolProvider, - { - token: token.tokenAddress, - warpRouter: token.hypAddress, - // Mailbox only required for transfers, using system as placeholder - mailbox: SystemProgram.programId.toBase58(), - }, - token?.isSpl2022 ?? false, - ); - const syntheticBalance = ethers.BigNumber.from( - await adapter.getTotalSupply(), - ); - return { - balance: parseFloat( - ethers.utils.formatUnits(syntheticBalance, token.decimals), - ), - }; - } - case ProtocolType.Cosmos: - // TODO - cosmos synthetic - return { balance: 0 }; - } - break; - } - case TokenType.XERC20: { - switch (token.protocolType) { - case ProtocolType.Ethereum: { - const provider = multiProtocolProvider.getEthersV5Provider(chain); - const hypXERC20 = HypXERC20__factory.connect( - token.hypAddress, - provider, - ); - const xerc20Address = await hypXERC20.wrappedToken(); - const xerc20 = IXERC20__factory.connect(xerc20Address, provider); - const syntheticBalance = await xerc20.totalSupply(); - - return { - balance: parseFloat( - ethers.utils.formatUnits(syntheticBalance, token.decimals), - ), - }; - } - default: - throw new Error( - `Unsupported protocol type ${token.protocolType} for token type ${token.type}`, - ); - } - } - case TokenType.XERC20Lockbox: { - switch (token.protocolType) { - case ProtocolType.Ethereum: { - if (!token.tokenAddress) - throw new Error( - 'Token address missing for xERC20Lockbox token', - ); - const provider = multiProtocolProvider.getEthersV5Provider(chain); - const hypXERC20Lockbox = HypXERC20Lockbox__factory.connect( - token.hypAddress, - provider, - ); - const xerc20LockboxAddress = await hypXERC20Lockbox.lockbox(); - const tokenContract = ERC20__factory.connect( - token.tokenAddress, - provider, - ); - - const collateralBalance = await tokenContract.balanceOf( - xerc20LockboxAddress, - ); - - return getCollateralTokenWarpInfo( - collateralBalance, - token.decimals, - tokenPriceGetter, - token.tokenCoinGeckoId, - ); - } - default: - throw new Error( - `Unsupported protocol type ${token.protocolType} for token type ${token.type}`, - ); - } - } - } - return { balance: 0 }; - }, - ); - - return promiseObjAll(output); -} - -export function updateTokenBalanceMetrics( - tokenConfig: WarpRouteConfig, - balances: ChainMap, -) { - objMap(tokenConfig, (chain: ChainName, token: WarpRouteConfig[ChainName]) => { - const metrics: WarpRouteMetrics = { - chain_name: chain, - token_address: token.tokenAddress ?? ethers.constants.AddressZero, - token_name: token.name, - wallet_address: token.hypAddress, - token_type: token.type, - warp_route_id: createWarpRouteConfigId( - token.symbol, - Object.keys(tokenConfig) as ChainName[], - ), - related_chain_names: Object.keys(tokenConfig) - .filter((chainName) => chainName !== chain) - .sort() - .join(','), - }; - - warpRouteTokenBalance.labels(metrics).set(balances[chain].balance); - if (balances[chain].valueUSD) { - warpRouteCollateralValue - .labels(metrics) - .set(balances[chain].valueUSD as number); - logger.debug('Collateral value updated for chain', { - chain, - related_chain_names: metrics.related_chain_names, - warp_route_id: metrics.warp_route_id, - token: metrics.token_name, - value: balances[chain].valueUSD, - }); - } - logger.debug('Wallet balance updated for chain', { - chain, - related_chain_names: metrics.related_chain_names, - warp_route_id: metrics.warp_route_id, - token: metrics.token_name, - balance: balances[chain].balance, - }); - }); -} - -export function updateXERC20LimitsMetrics( - xERC20Limits: ChainMap, -) { - objMap(xERC20Limits, (chain: ChainName, limits: xERC20Limit | undefined) => { - if (limits) { - xERC20LimitsGauge - .labels({ - chain_name: chain, - limit_type: 'mint', - token_name: limits.tokenName, - }) - .set(limits.mint); - xERC20LimitsGauge - .labels({ - chain_name: chain, - limit_type: 'burn', - token_name: limits.tokenName, - }) - .set(limits.burn); - xERC20LimitsGauge - .labels({ - chain_name: chain, - limit_type: 'mintMax', - token_name: limits.tokenName, - }) - .set(limits.mintMax); - xERC20LimitsGauge - .labels({ - chain_name: chain, - limit_type: 'burnMax', - token_name: limits.tokenName, - }) - .set(limits.burnMax); - logger.info('xERC20 limits updated for chain', { - chain, - limits, - }); - } - }); -} - -async function getXERC20Limits( - tokenConfig: WarpRouteConfig, - chainMetadata: ChainMap, -): Promise> { - const multiProtocolProvider = new MultiProtocolProvider(chainMetadata); - - const output = objMap( - tokenConfig, - async (chain: ChainName, token: WarpRouteConfig[ChainName]) => { - switch (token.protocolType) { - case ProtocolType.Ethereum: { - switch (token.type) { - case TokenType.XERC20Lockbox: { - const provider = multiProtocolProvider.getEthersV5Provider(chain); - const routerAddress = token.hypAddress; - const lockbox = HypXERC20Lockbox__factory.connect( - token.hypAddress, - provider, - ); - const xerc20Address = await lockbox.xERC20(); - const xerc20 = IXERC20__factory.connect(xerc20Address, provider); - return getXERC20Limit( - routerAddress, - xerc20, - token.decimals, - token.name, - ); - } - case TokenType.XERC20: { - const provider = multiProtocolProvider.getEthersV5Provider(chain); - const routerAddress = token.hypAddress; - const hypXERC20 = HypXERC20__factory.connect( - routerAddress, - provider, - ); - const xerc20Address = await hypXERC20.wrappedToken(); - const xerc20 = IXERC20__factory.connect(xerc20Address, provider); - return getXERC20Limit( - routerAddress, - xerc20, - token.decimals, - token.name, - ); - } - default: - logger.info( - `Unsupported token type ${token.type} for xERC20 limits check on protocol type ${token.protocolType}`, - ); - - return undefined; - } - } - default: - throw new Error(`Unsupported protocol type ${token.protocolType}`); - } - }, - ); - - return promiseObjAll(output); -} - -const getXERC20Limit = async ( - routerAddress: string, - xerc20: IXERC20, - decimals: number, - tokenName: string, -): Promise => { - const mintCurrent = await xerc20.mintingCurrentLimitOf(routerAddress); - const mintMax = await xerc20.mintingMaxLimitOf(routerAddress); - const burnCurrent = await xerc20.burningCurrentLimitOf(routerAddress); - const burnMax = await xerc20.burningMaxLimitOf(routerAddress); - return { - tokenName, - mint: parseFloat(ethers.utils.formatUnits(mintCurrent, decimals)), - mintMax: parseFloat(ethers.utils.formatUnits(mintMax, decimals)), - burn: parseFloat(ethers.utils.formatUnits(burnCurrent, decimals)), - burnMax: parseFloat(ethers.utils.formatUnits(burnMax, decimals)), - }; -}; - -async function getTokenPriceByChain( - chain: ChainName, - tokenPriceGetter: CoinGeckoTokenPriceGetter, -): Promise { - try { - return await tokenPriceGetter.getTokenPrice(chain); - } catch (e) { - logger.warn('Error getting token price', e); - return undefined; - } -} - -async function getNativeTokenValue( - chain: ChainName, - balanceFloat: number, - tokenPriceGetter: CoinGeckoTokenPriceGetter, -): Promise { - const price = await getTokenPriceByChain(chain, tokenPriceGetter); - logger.debug(`${chain} native token price ${price}`); - if (!price) return undefined; - return balanceFloat * price; -} - -async function getNativeTokenWarpInfo( - balance: ethers.BigNumber | bigint, - decimal: number, - tokenPriceGetter: CoinGeckoTokenPriceGetter, - chain: ChainName, -): Promise { - const balanceFloat = parseFloat(ethers.utils.formatUnits(balance, decimal)); - const value = await getNativeTokenValue( - chain, - balanceFloat, - tokenPriceGetter, - ); - return { balance: balanceFloat, valueUSD: value }; -} - -async function getCollateralTokenPrice( - tokenCoinGeckoId: string | undefined, - tokenPriceGetter: CoinGeckoTokenPriceGetter, -): Promise { - if (!tokenCoinGeckoId) return undefined; - const prices = await tokenPriceGetter.getTokenPriceByIds([tokenCoinGeckoId]); - if (!prices) return undefined; - return prices[0]; -} - -async function getCollateralTokenValue( - tokenCoinGeckoId: string | undefined, - balanceFloat: number, - tokenPriceGetter: CoinGeckoTokenPriceGetter, -): Promise { - const price = await getCollateralTokenPrice( - tokenCoinGeckoId, - tokenPriceGetter, - ); - logger.debug(`${tokenCoinGeckoId} token price ${price}`); - if (!price) return undefined; - return balanceFloat * price; -} - -async function getCollateralTokenWarpInfo( - balance: ethers.BigNumber | bigint, - decimal: number, - tokenPriceGetter: CoinGeckoTokenPriceGetter, - tokenCoinGeckoId?: string, -): Promise { - const balanceFloat = parseFloat(ethers.utils.formatUnits(balance, decimal)); - const value = await getCollateralTokenValue( - tokenCoinGeckoId, - balanceFloat, - tokenPriceGetter, - ); - return { balance: balanceFloat, valueUSD: value }; -} - -async function checkWarpRouteMetrics( - checkFrequency: number, - tokenConfig: WarpRouteConfig, - chainMetadata: ChainMap, -) { - const tokenPriceGetter = CoinGeckoTokenPriceGetter.withDefaultCoinGecko( - chainMetadata, - await getCoinGeckoApiKey(), - ); - - setInterval(async () => { - try { - const multiProtocolProvider = new MultiProtocolProvider(chainMetadata); - const balances = await checkBalance( - tokenConfig, - multiProtocolProvider, - tokenPriceGetter, - ); - logger.info('Token Balances:', balances); - updateTokenBalanceMetrics(tokenConfig, balances); - } catch (e) { - logger.error('Error checking balances', e); - } - - // only check xERC20 limits if there are xERC20 tokens in the config - if ( - Object.keys(tokenConfig).some( - (chain) => - tokenConfig[chain].type === TokenType.XERC20 || - tokenConfig[chain].type === TokenType.XERC20Lockbox, - ) - ) { - try { - const xERC20Limits = await getXERC20Limits(tokenConfig, chainMetadata); - logger.info('xERC20 Limits:', xERC20Limits); - updateXERC20LimitsMetrics(xERC20Limits); - } catch (e) { - logger.error('Error checking xERC20 limits', e); - } - } - }, checkFrequency); -} - -async function getCoinGeckoApiKey(): Promise { - const environment: DeployEnvironment = 'mainnet3'; - let apiKey: string | undefined; - try { - apiKey = (await fetchGCPSecret( - `${environment}-coingecko-api-key`, - false, - )) as string; - } catch (e) { - logger.error( - 'Error fetching CoinGecko API key, proceeding with public tier', - e, - ); - } - - return apiKey; -} - -main().then(logger.info).catch(logger.error); diff --git a/typescript/infra/scripts/warp-routes/monitor/metrics.ts b/typescript/infra/scripts/warp-routes/monitor/metrics.ts new file mode 100644 index 0000000000..eec6738ab1 --- /dev/null +++ b/typescript/infra/scripts/warp-routes/monitor/metrics.ts @@ -0,0 +1,111 @@ +import { Gauge, Registry } from 'prom-client'; + +import { createWarpRouteConfigId } from '@hyperlane-xyz/registry'; +import { ChainName, Token, TokenStandard, WarpCore } from '@hyperlane-xyz/sdk'; + +import { WarpRouteBalance, XERC20Limit } from './types.js'; +import { logger } from './utils.js'; + +export const metricsRegister = new Registry(); + +type WarpRouteMetricLabels = keyof WarpRouteMetrics; + +interface WarpRouteMetrics { + chain_name: ChainName; + token_address: string; + token_name: string; + wallet_address: string; + token_standard: TokenStandard; + warp_route_id: string; + related_chain_names: string; +} + +const warpRouteMetricLabels: WarpRouteMetricLabels[] = [ + 'chain_name', + 'token_address', + 'token_name', + 'wallet_address', + 'token_standard', + 'warp_route_id', + 'related_chain_names', +]; + +const warpRouteTokenBalance = new Gauge({ + name: 'hyperlane_warp_route_token_balance', + help: 'HypERC20 token balance of a Warp Route', + registers: [metricsRegister], + labelNames: warpRouteMetricLabels, +}); + +const warpRouteCollateralValue = new Gauge({ + name: 'hyperlane_warp_route_collateral_value', + help: 'Total value of collateral held in a HypERC20Collateral or HypNative contract of a Warp Route', + registers: [metricsRegister], + labelNames: warpRouteMetricLabels, +}); + +const xERC20LimitsGauge = new Gauge({ + name: 'hyperlane_xerc20_limits', + help: 'Current minting and burning limits of xERC20 tokens', + registers: [metricsRegister], + labelNames: ['chain_name', 'limit_type', 'token_name'], +}); + +export function updateTokenBalanceMetrics( + warpCore: WarpCore, + token: Token, + balanceInfo: WarpRouteBalance, +) { + const metrics: WarpRouteMetrics = { + chain_name: token.chainName, + token_address: token.collateralAddressOrDenom || token.addressOrDenom, + token_name: token.name, + wallet_address: token.addressOrDenom, + token_standard: token.standard, + warp_route_id: createWarpRouteConfigId( + token.symbol, + warpCore.getTokenChains(), + ), + related_chain_names: warpCore + .getTokenChains() + .filter((chainName) => chainName !== token.chainName) + .sort() + .join(','), + }; + + warpRouteTokenBalance.labels(metrics).set(balanceInfo.balance); + logger.info( + { + labels: metrics, + balance: balanceInfo.balance, + }, + 'Wallet balance updated for token', + ); + + if (balanceInfo.valueUSD) { + warpRouteCollateralValue.labels(metrics).set(balanceInfo.valueUSD); + logger.info( + { + labels: metrics, + valueUSD: balanceInfo.valueUSD, + }, + 'Wallet value updated for token', + ); + } +} + +export function updateXERC20LimitsMetrics(token: Token, limits: XERC20Limit) { + for (const [limitType, limit] of Object.entries(limits)) { + xERC20LimitsGauge + .labels({ + chain_name: token.chainName, + limit_type: limitType, + token_name: token.name, + }) + .set(limit); + } + logger.info('xERC20 limits updated for chain', { + chain: token.chainName, + limits, + }); +} 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 new file mode 100644 index 0000000000..7a8fdb645a --- /dev/null +++ b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts @@ -0,0 +1,253 @@ +import { PopulatedTransaction } from 'ethers'; + +import { + ChainMap, + ChainMetadata, + CoinGeckoTokenPriceGetter, + EvmHypXERC20Adapter, + EvmHypXERC20LockboxAdapter, + IHypXERC20Adapter, + MultiProtocolProvider, + RouterConfig, + Token, + TokenStandard, + WarpCore, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType, objMap, objMerge, sleep } from '@hyperlane-xyz/utils'; + +import { getWarpCoreConfig } from '../../../config/registry.js'; +import { + DeployEnvironment, + getRouterConfigsForAllVms, +} from '../../../src/config/environment.js'; +import { fetchGCPSecret } from '../../../src/utils/gcloud.js'; +import { startMetricsServer } from '../../../src/utils/metrics.js'; +import { getArgs, withWarpRouteIdRequired } from '../../agent-utils.js'; +import { getEnvironmentConfig } from '../../core-utils.js'; + +import { + metricsRegister, + updateTokenBalanceMetrics, + updateXERC20LimitsMetrics, +} from './metrics.js'; +import { WarpRouteBalance, XERC20Limit } from './types.js'; +import { logger, tryFn } from './utils.js'; + +async function main() { + const { checkFrequency, environment, warpRouteId } = + await withWarpRouteIdRequired(getArgs()) + .describe('checkFrequency', 'frequency to check balances in ms') + .demandOption('checkFrequency') + .alias('v', 'checkFrequency') // v as in Greek letter nu + .number('checkFrequency') + .parse(); + + startMetricsServer(metricsRegister); + + const envConfig = getEnvironmentConfig(environment); + const registry = await envConfig.getRegistry(); + const chainMetadata = await registry.getMetadata(); + + // The Sealevel warp adapters require the Mailbox address, so we + // get router configs (that include the Mailbox address) for all chains + // and merge them with the chain metadata. + const routerConfig = await getRouterConfigsForAllVms( + envConfig, + await envConfig.getMultiProvider(), + ); + const mailboxes = objMap(routerConfig, (_chain, config: RouterConfig) => ({ + mailbox: config.mailbox, + })); + const multiProtocolProvider = new MultiProtocolProvider( + objMerge(chainMetadata, mailboxes), + ); + const warpCoreConfig = getWarpCoreConfig(warpRouteId); + const warpCore = WarpCore.FromConfig(multiProtocolProvider, warpCoreConfig); + + await pollAndUpdateWarpRouteMetrics(checkFrequency, warpCore, chainMetadata); +} + +// Indefinitely loops, updating warp route metrics at the specified frequency. +async function pollAndUpdateWarpRouteMetrics( + checkFrequency: number, + warpCore: WarpCore, + chainMetadata: ChainMap, +) { + const tokenPriceGetter = new CoinGeckoTokenPriceGetter({ + chainMetadata, + apiKey: await getCoinGeckoApiKey(), + }); + + while (true) { + await tryFn(async () => { + await Promise.all( + warpCore.tokens.map((token) => + updateTokenMetrics(warpCore, token, tokenPriceGetter), + ), + ); + }, 'Updating warp route metrics'); + await sleep(checkFrequency); + } +} + +// Updates the metrics for a single token in a warp route. +async function updateTokenMetrics( + warpCore: WarpCore, + token: Token, + tokenPriceGetter: CoinGeckoTokenPriceGetter, +) { + const promises = [ + tryFn(async () => { + const balanceInfo = await getTokenBridgedBalance( + warpCore, + token, + tokenPriceGetter, + ); + if (!balanceInfo) { + return; + } + updateTokenBalanceMetrics(warpCore, token, balanceInfo); + }, 'Getting bridged balance and value'), + ]; + + if (token.isXerc20()) { + promises.push( + tryFn(async () => { + const limits = await getXERC20Limits(warpCore, token); + updateXERC20LimitsMetrics(token, limits); + }, 'Getting xERC20 limits'), + ); + } + + await Promise.all(promises); +} + +// Gets the bridged balance and value of a token in a warp route. +async function getTokenBridgedBalance( + warpCore: WarpCore, + token: Token, + tokenPriceGetter: CoinGeckoTokenPriceGetter, +): Promise { + if (!token.isHypToken()) { + logger.warn('Cannot get bridged balance for a non-Hyperlane token', token); + return undefined; + } + + const adapter = token.getHypAdapter(warpCore.multiProvider); + const bridgedSupply = await adapter.getBridgedSupply(); + if (!bridgedSupply) { + logger.warn('Bridged supply not found for token', token); + return undefined; + } + const balance = token.amount(bridgedSupply).getDecimalFormattedAmount(); + + let tokenPrice; + // Only record value for collateralized and xERC20 lockbox tokens. + if ( + token.isCollateralized() || + token.standard === TokenStandard.EvmHypXERC20Lockbox + ) { + tokenPrice = await tryGetTokenPrice(token, tokenPriceGetter); + } + + return { + balance, + valueUSD: tokenPrice ? balance * tokenPrice : undefined, + }; +} + +async function getXERC20Limits( + warpCore: WarpCore, + token: Token, +): Promise { + if (token.protocol !== ProtocolType.Ethereum) { + throw new Error(`Unsupported XERC20 protocol type ${token.protocol}`); + } + + if (token.standard === TokenStandard.EvmHypXERC20) { + const adapter = token.getAdapter( + warpCore.multiProvider, + ) as EvmHypXERC20Adapter; + return getXERC20Limit(token, adapter); + } else if (token.standard === TokenStandard.EvmHypXERC20Lockbox) { + const adapter = token.getAdapter( + warpCore.multiProvider, + ) as EvmHypXERC20LockboxAdapter; + return getXERC20Limit(token, adapter); + } + throw new Error(`Unsupported XERC20 token standard ${token.standard}`); +} + +async function getXERC20Limit( + token: Token, + xerc20: IHypXERC20Adapter, +): Promise { + const formatBigInt = (num: bigint) => { + return token.amount(num).getDecimalFormattedAmount(); + }; + + const [mintCurrent, mintMax, burnCurrent, burnMax] = await Promise.all([ + xerc20.getMintLimit(), + xerc20.getMintMaxLimit(), + xerc20.getBurnLimit(), + xerc20.getBurnMaxLimit(), + ]); + + return { + mint: formatBigInt(mintCurrent), + mintMax: formatBigInt(mintMax), + burn: formatBigInt(burnCurrent), + burnMax: formatBigInt(burnMax), + }; +} + +// Tries to get the price of a token from CoinGecko. Returns undefined if there's no +// CoinGecko ID for the token. +async function tryGetTokenPrice( + token: Token, + tokenPriceGetter: CoinGeckoTokenPriceGetter, +): Promise { + // We only get a price if the token defines a CoinGecko ID. + // This way we can ignore values of certain types of collateralized warp routes, + // e.g. Native warp routes on rollups that have been pre-funded. + let coinGeckoId = token.coinGeckoId; + + if (!coinGeckoId) { + logger.warn('CoinGecko ID missing for token', token.symbol); + return undefined; + } + + return getCoingeckoPrice(tokenPriceGetter, coinGeckoId); +} + +async function getCoingeckoPrice( + tokenPriceGetter: CoinGeckoTokenPriceGetter, + coingeckoId: string, +): Promise { + const prices = await tokenPriceGetter.getTokenPriceByIds([coingeckoId]); + if (!prices) return undefined; + return prices[0]; +} + +async function getCoinGeckoApiKey(): Promise { + const environment: DeployEnvironment = 'mainnet3'; + let apiKey: string | undefined; + try { + apiKey = (await fetchGCPSecret( + `${environment}-coingecko-api-key`, + false, + )) as string; + } catch (e) { + logger.error( + 'Error fetching CoinGecko API key, proceeding with public tier', + e, + ); + } + + return apiKey; +} + +main().catch((err) => { + logger.error('Error in main:', err); + process.exit(1); +}); diff --git a/typescript/infra/scripts/warp-routes/monitor/types.ts b/typescript/infra/scripts/warp-routes/monitor/types.ts new file mode 100644 index 0000000000..5a2d877492 --- /dev/null +++ b/typescript/infra/scripts/warp-routes/monitor/types.ts @@ -0,0 +1,11 @@ +export interface XERC20Limit { + mint: number; + burn: number; + mintMax: number; + burnMax: number; +} + +export interface WarpRouteBalance { + balance: number; + valueUSD?: number; +} diff --git a/typescript/infra/scripts/warp-routes/monitor/utils.ts b/typescript/infra/scripts/warp-routes/monitor/utils.ts new file mode 100644 index 0000000000..414843416b --- /dev/null +++ b/typescript/infra/scripts/warp-routes/monitor/utils.ts @@ -0,0 +1,11 @@ +import { rootLogger } from '@hyperlane-xyz/utils'; + +export const logger = rootLogger.child({ module: 'warp-balance-monitor' }); + +export async function tryFn(fn: () => Promise, context: string) { + try { + await fn(); + } catch (e) { + logger.error(`Error in ${context}`, e); + } +} diff --git a/typescript/infra/src/agents/index.ts b/typescript/infra/src/agents/index.ts index 3f3f6469aa..b505bea1ae 100644 --- a/typescript/infra/src/agents/index.ts +++ b/typescript/infra/src/agents/index.ts @@ -1,7 +1,8 @@ import fs from 'fs'; import { join } from 'path'; -import { ChainName, RpcConsensusType } from '@hyperlane-xyz/sdk'; +import { ChainName, RelayerConfig, RpcConsensusType } from '@hyperlane-xyz/sdk'; +import { objFilter, objOmit, objOmitKeys, pick } from '@hyperlane-xyz/utils'; import { Contexts } from '../../config/contexts.js'; import { getChain } from '../../config/registry.js'; @@ -13,7 +14,11 @@ import { KubernetesResources, RootAgentConfig, } from '../config/agent/agent.js'; -import { RelayerConfigHelper } from '../config/agent/relayer.js'; +import { + RelayerConfigHelper, + RelayerConfigMapConfig, + RelayerEnvConfig, +} from '../config/agent/relayer.js'; import { ScraperConfigHelper } from '../config/agent/scraper.js'; import { ValidatorConfigHelper } from '../config/agent/validator.js'; import { DeployEnvironment } from '../config/environment.js'; @@ -151,10 +156,25 @@ export class RelayerHelmManager extends OmniscientAgentHelmManager { async helmValues(): Promise { const values = await super.helmValues(); + + const config = await this.config.buildConfig(); + + // Divide the keys between the configmap and the env config. + const configMapConfig: RelayerConfigMapConfig = { + addressBlacklist: config.addressBlacklist, + metricAppContexts: config.metricAppContexts, + gasPaymentEnforcement: config.gasPaymentEnforcement, + }; + const envConfig = objOmitKeys( + config, + Object.keys(configMapConfig), + ) as RelayerEnvConfig; + values.hyperlane.relayer = { enabled: true, aws: this.config.requiresAwsCredentials, - config: await this.config.buildConfig(), + envConfig, + configMapConfig, resources: this.kubernetesResources(), }; diff --git a/typescript/infra/src/config/agent/relayer.ts b/typescript/infra/src/config/agent/relayer.ts index cd7e4a46da..a7500ec74a 100644 --- a/typescript/infra/src/config/agent/relayer.ts +++ b/typescript/infra/src/config/agent/relayer.ts @@ -20,7 +20,11 @@ import { rootLogger, } from '@hyperlane-xyz/utils'; -import { getChain, getDomainId } from '../../../config/registry.js'; +import { + getChain, + getDomainId, + getWarpAddresses, +} from '../../../config/registry.js'; import { AgentAwsUser } from '../../agents/aws/user.js'; import { Role } from '../../roles.js'; import { HelmStatefulSetValues } from '../infrastructure.js'; @@ -45,17 +49,31 @@ export interface BaseRelayerConfig { addressBlacklist?: string; transactionGasLimit?: BigNumberish; skipTransactionGasLimitFor?: string[]; - metricAppContexts?: MetricAppContext[]; + metricAppContextsGetter?: () => MetricAppContext[]; } // Full relayer-specific agent config for a single chain export type RelayerConfig = Omit; +// Config intended to be set as configMap values, these are usually really long +// and are intended to derisk hitting max env var length limits. +export type RelayerConfigMapConfig = Pick< + RelayerConfig, + 'addressBlacklist' | 'gasPaymentEnforcement' | 'metricAppContexts' +>; +// The rest of the config is intended to be set as env vars. +export type RelayerEnvConfig = Omit< + RelayerConfig, + keyof RelayerConfigMapConfig +>; // See rust/main/helm/values.yaml for the full list of options and their defaults. // This is at `.hyperlane.relayer` in the values file. export interface HelmRelayerValues extends HelmStatefulSetValues { aws: boolean; - config?: RelayerConfig; + // Config intended to be set as env vars + envConfig?: RelayerEnvConfig; + // Config intended to be set as configMap values + configMapConfig?: RelayerConfigMapConfig; } // See rust/main/helm/values.yaml for the full list of options and their defaults. @@ -105,9 +123,9 @@ export class RelayerConfigHelper extends AgentConfigHelper { relayerConfig.skipTransactionGasLimitFor = baseConfig.skipTransactionGasLimitFor.join(','); } - if (baseConfig.metricAppContexts) { + if (baseConfig.metricAppContextsGetter) { relayerConfig.metricAppContexts = JSON.stringify( - baseConfig.metricAppContexts, + baseConfig.metricAppContextsGetter(), ); } @@ -213,12 +231,29 @@ export class RelayerConfigHelper extends AgentConfigHelper { } } +// Gets the matching list for the given warp route using addresses from the registry. +export function warpRouteMatchingList(warpRouteId: string): MatchingList { + return matchingList(getWarpAddresses(warpRouteId)); +} + export function routerMatchingList( routers: ChainMap<{ router: Address }>, ): MatchingList { return matchingList(routers); } +// Create a matching list for the given senders to any destination or recipient +export function senderMatchingList( + senders: ChainMap<{ sender: Address }>, +): MatchingList { + return Object.entries(senders).map(([chain, { sender }]) => ({ + originDomain: getDomainId(chain), + senderAddress: addressToBytes32(sender), + destinationDomain: '*', + recipientAddress: '*', + })); +} + // Create a matching list for the given contract addresses export function matchingList( addressesMap: HyperlaneAddressesMap, diff --git a/typescript/infra/src/config/chain.ts b/typescript/infra/src/config/chain.ts index e077ca407b..a7bb7c9f95 100644 --- a/typescript/infra/src/config/chain.ts +++ b/typescript/infra/src/config/chain.ts @@ -16,11 +16,17 @@ import { inCIMode } from '../utils/utils.js'; import { DeployEnvironment } from './environment.js'; -// Temporarily skip some chains +// A list of chains to skip during deploy, check-deploy and ICA operations. +// Used by scripts like check-owner-ica.ts to exclude chains that are temporarily +// unsupported (e.g. zksync, zeronetwork) or have known issues (e.g. lumia). export const chainsToSkip: ChainName[] = [ // TODO: remove once zksync PR is merged into main + // mainnets 'zksync', 'zeronetwork', + // testnets + 'abstracttestnet', + 'treasuretopaz', // Oct 16 batch 'lumia', diff --git a/typescript/infra/src/config/environment.ts b/typescript/infra/src/config/environment.ts index 25b17abff7..ecbf1030ab 100644 --- a/typescript/infra/src/config/environment.ts +++ b/typescript/infra/src/config/environment.ts @@ -104,3 +104,11 @@ export async function getRouterConfigsForAllVms( // Merge, giving evmRouterConfig precedence return objMerge(allRouterConfigs, evmRouterConfig); } + +export function getOwnerConfigForAddress(owner: string): OwnableConfig { + return { + owner, + // To ensure that any other overrides aren't applied + ownerOverrides: {}, + }; +} diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 27f159079b..51dfaf4d2f 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -1,13 +1,19 @@ -import { ChainMap } from '@hyperlane-xyz/sdk'; +import { + ChainMap, + OwnableConfig, + RouterConfig, + TokenRouterConfig, +} from '@hyperlane-xyz/sdk'; import { Address } from '@hyperlane-xyz/utils'; // Common collateral tokens to be used by warp route deployments. export const tokens: ChainMap> = { ethereum: { + amphrETH: '0x5fD13359Ba15A84B76f7F87568309040176167cd', + cbBTC: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf', + deUSD: '0x15700B564Ca08D9439C58cA5053166E8317aa138', USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', - deUSD: '0x15700B564Ca08D9439C58cA5053166E8317aa138', - amphrETH: '0x5fD13359Ba15A84B76f7F87568309040176167cd', WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88', }, @@ -15,3 +21,5 @@ export const tokens: ChainMap> = { fastUSD: '0x37a4dD9CED2b19Cfe8FAC251cd727b5787E45269', }, }; + +export type RouterConfigWithoutOwner = Omit; diff --git a/typescript/infra/src/utils/safe.ts b/typescript/infra/src/utils/safe.ts index 397e746c07..08ae74aabe 100644 --- a/typescript/infra/src/utils/safe.ts +++ b/typescript/infra/src/utils/safe.ts @@ -14,7 +14,7 @@ import { getSafe, getSafeService, } from '@hyperlane-xyz/sdk'; -import { Address, CallData, eqAddress } from '@hyperlane-xyz/utils'; +import { Address, CallData, eqAddress, retryAsync } from '@hyperlane-xyz/utils'; import safeSigners from '../../config/environments/mainnet3/safe/safeSigners.json' assert { type: 'json' }; import { AnnotatedCallData } from '../govern/HyperlaneAppGovernor.js'; @@ -24,10 +24,10 @@ export async function getSafeAndService( multiProvider: MultiProvider, safeAddress: Address, ) { - const safeSdk: Safe.default = await getSafe( - chain, - multiProvider, - safeAddress, + const safeSdk: Safe.default = await retryAsync( + () => getSafe(chain, multiProvider, safeAddress), + 5, + 1000, ); const safeService: SafeApiKit.default = getSafeService(chain, multiProvider); return { safeSdk, safeService }; @@ -41,6 +41,52 @@ export function createSafeTransactionData(call: CallData): MetaTransactionData { }; } +export async function executeTx( + chain: ChainNameOrId, + multiProvider: MultiProvider, + safeAddress: Address, + safeTxHash: string, +): Promise { + const { safeSdk, safeService } = await getSafeAndService( + chain, + multiProvider, + safeAddress, + ); + const safeTransaction = await safeService.getTransaction(safeTxHash); + if (!safeTransaction) { + throw new Error(`Failed to fetch transaction details for ${safeTxHash}`); + } + + // Throw if the safe doesn't have enough balance to cover the gas + let estimate; + try { + estimate = await safeService.estimateSafeTransaction( + safeAddress, + safeTransaction, + ); + } catch (error) { + throw new Error( + `Failed to estimate gas for Safe transaction ${safeTxHash} on chain ${chain}: ${error}`, + ); + } + const balance = await multiProvider + .getProvider(chain) + .getBalance(safeAddress); + if (balance.lt(estimate.safeTxGas)) { + throw new Error( + `Safe ${safeAddress} on ${chain} has insufficient balance (${balance.toString()}) for estimated gas (${ + estimate.safeTxGas + })`, + ); + } + + await safeSdk.executeTransaction(safeTransaction); + + console.log( + chalk.green.bold(`Executed transaction ${safeTxHash} on ${chain}`), + ); +} + export async function createSafeTransaction( safeSdk: Safe.default, safeService: SafeApiKit.default, diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 9c35df3b5e..fb9db10eed 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -11,7 +11,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { ); constructor( - readonly configFilePath: string, + readonly warpRouteId: string, readonly runEnv: DeployEnvironment, readonly environmentChainNames: string[], ) { @@ -19,17 +19,12 @@ export class WarpRouteMonitorHelmManager extends HelmManager { } async helmValues() { - const pathRelativeToMonorepoRoot = this.configFilePath.includes( - 'typescript/infra', - ) - ? this.configFilePath - : path.join('typescript/infra', this.configFilePath); return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'ef7a886-20241101-165749', + tag: '4d0de30-20241119-171012', }, - configFilePath: pathRelativeToMonorepoRoot, + warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, environment: this.runEnv, hyperlane: { @@ -43,8 +38,19 @@ export class WarpRouteMonitorHelmManager extends HelmManager { } get helmReleaseName(): string { - const match = this.configFilePath.match(/\/([^/]+)-deployments\.yaml$/); - const name = match ? match[1] : this.configFilePath; - return `hyperlane-warp-route-${name.toLowerCase()}`; // helm requires lower case release names + let name = `hyperlane-warp-route-${this.warpRouteId + .toLowerCase() + .replaceAll('/', '-')}`; + + // 52 because the max label length is 63, and there is an auto appended 11 char + // suffix, e.g. `controller-revision-hash=hyperlane-warp-route-tia-mantapacific-neutron-566dc75599` + const maxChars = 52; + + // Max out length, and it can't end with a dash. + if (name.length > maxChars) { + name = name.slice(0, maxChars); + name = name.replace(/-+$/, ''); + } + return name; } } diff --git a/typescript/infra/test/govern.hardhat-test.ts b/typescript/infra/test/govern.hardhat-test.ts index 6de17b11f6..90bf2d11ba 100644 --- a/typescript/infra/test/govern.hardhat-test.ts +++ b/typescript/infra/test/govern.hardhat-test.ts @@ -1,6 +1,6 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers.js'; import { expect } from 'chai'; -import { BigNumber, utils } from 'ethers'; +import { BigNumber } from 'ethers'; import hre from 'hardhat'; import { @@ -27,6 +27,7 @@ import { TestChainName, TestCoreApp, TestCoreDeployer, + randomAddress, } from '@hyperlane-xyz/sdk'; import { Address, CallData, eqAddress } from '@hyperlane-xyz/utils'; @@ -35,9 +36,6 @@ import { HyperlaneAppGovernor, } from '../src/govern/HyperlaneAppGovernor.js'; -// TODO de-dupe with test-utils after migrating this file to the SDK -const randomAddress = () => utils.hexlify(utils.randomBytes(20)); - export class TestApp extends HyperlaneApp<{}> {} export class TestChecker extends HyperlaneAppChecker { diff --git a/typescript/infra/test/warpIds.test.ts b/typescript/infra/test/warpIds.test.ts new file mode 100644 index 0000000000..11f8a2dd15 --- /dev/null +++ b/typescript/infra/test/warpIds.test.ts @@ -0,0 +1,17 @@ +import { expect } from 'chai'; + +import { WarpRouteIds } from '../config/environments/mainnet3/warp/warpIds.js'; +import { getRegistry } from '../config/registry.js'; + +describe('Warp IDs', () => { + it('Has all warp IDs in the registry', () => { + const registry = getRegistry(); + for (const warpId of Object.values(WarpRouteIds)) { + // That's a long sentence! + expect( + registry.getWarpRoute(warpId), + `Warp ID ${warpId} not in registry, the .registryrc or your local registry may be out of date`, + ).to.not.be.null.and.not.be.undefined; + } + }); +}); diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index e8be9ee0ef..2395e197fe 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,48 @@ # @hyperlane-xyz/sdk +## 7.1.0 + +### Minor Changes + +- 6f2d50fbd: Updated Fraxtal set to include Superlane validators, updated Flow set +- 1159e0f4b: Enroll new validators for alephzeroevmmainnet, chilizmainnet, flowmainnet, immutablezkevmmainnet, metal, polynomialfi, rarichain, rootstockmainnet, superpositionmainnet, flame, prom, inevm. +- ff2b4e2fb: Added helpers to Token and token adapters to get bridged supply of tokens" +- 0e285a443: Add a validateZodResult util function +- 5db46bd31: Implements persistent relayer for use in CLI +- 0cd65c571: Add chainMetadataToCosmosChain function + +### Patch Changes + +- Updated dependencies [0e285a443] + - @hyperlane-xyz/utils@7.1.0 + - @hyperlane-xyz/core@5.8.1 + +## 7.0.0 + +### Major Changes + +- f48cf8766: Upgrade Viem to 2.2 and Solana Web3 to 1.9 + Rename `chainMetadataToWagmiChain` to `chainMetadataToViemChain` +- 5f41b1134: Remove getCoingeckoTokenPrices (use CoinGeckoTokenPriceGetter instead) + +### Minor Changes + +- bbb970a44: Redeploy to alephzeroevmmainnet, chilizmainnet, flowmainnet, immutablezkevmmainnet, metal, polynomialfi, rarichain, rootstockmainnet, superpositionmainnet. Deploy to flame, prom. +- fa424826c: Add support for updating the mailbox proxy admin owner +- 40d59a2f4: Deploy to abstracttestnet and treasuretopaz +- 0264f709e: Deploy to alephzeroevmtestnet, update deployment for arcadiatestnet2. +- 836060240: Add storage based multisig ISM types +- f24835438: Added coinGeckoId as an optional property of the TokenConfigSchema + +### Patch Changes + +- ba0122279: feat: use message context in hook reader IGP derivation +- Updated dependencies [f48cf8766] +- Updated dependencies [836060240] +- Updated dependencies [e6f9d5c4f] + - @hyperlane-xyz/utils@7.0.0 + - @hyperlane-xyz/core@5.8.0 + ## 6.0.0 ### Major Changes diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index c842bf593e..f49f081df6 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,14 +1,15 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "6.0.0", + "version": "7.1.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-s3": "^3.74.0", + "@chain-registry/types": "^0.50.14", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@hyperlane-xyz/core": "5.7.1", - "@hyperlane-xyz/utils": "6.0.0", + "@hyperlane-xyz/core": "5.8.1", + "@hyperlane-xyz/utils": "7.1.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-deployments": "1.37.8", @@ -16,12 +17,11 @@ "@solana/web3.js": "^1.78.0", "@wagmi/chains": "^1.8.0", "bignumber.js": "^9.1.1", - "coingecko-api-v3": "^0.0.29", "cosmjs-types": "^0.9.0", "cross-fetch": "^3.1.5", "ethers": "^5.7.2", "pino": "^8.19.0", - "viem": "^1.20.0", + "viem": "^2.21.45", "zod": "^3.21.2" }, "devDependencies": { diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index a3fd5f9b1e..b71d3c34db 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -3,9 +3,18 @@ import { ChainMap } from '../types.js'; // TODO: consider migrating these to the registry too export const defaultMultisigConfigs: ChainMap = { - alephzeroevmmainnet: { + abstracttestnet: { threshold: 1, - validators: ['0x33f20e6e775747d60301c6ea1c50e51f0389740c'], + validators: ['0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e'], + }, + + alephzeroevmmainnet: { + threshold: 2, + validators: [ + '0x33f20e6e775747d60301c6ea1c50e51f0389740c', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, alephzeroevmtestnet: { @@ -154,6 +163,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + boba: { + threshold: 1, + validators: ['0xebeb92c94ca8408e73aa16fd554cb3a7df075c59'], + }, + bsc: { threshold: 3, validators: [ @@ -208,8 +222,12 @@ export const defaultMultisigConfigs: ChainMap = { }, chilizmainnet: { - threshold: 1, - validators: ['0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb'], + threshold: 2, + validators: [ + '0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, citreatestnet: { @@ -258,6 +276,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + duckchain: { + threshold: 1, + validators: ['0x91d55fe6dac596a6735d96365e21ce4bca21d83c'], + }, + eclipsemainnet: { threshold: 3, validators: [ @@ -319,8 +342,12 @@ export const defaultMultisigConfigs: ChainMap = { }, flame: { - threshold: 1, - validators: ['0x1fa928ce884fa16357d4b8866e096392d4d81f43'], + threshold: 2, + validators: [ + '0x1fa928ce884fa16357d4b8866e096392d4d81f43', + '0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab', // p-ops + '0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', // tessellated + ], }, flare: { @@ -333,8 +360,13 @@ export const defaultMultisigConfigs: ChainMap = { }, flowmainnet: { - threshold: 1, - validators: ['0xe132235c958ca1f3f24d772e5970dd58da4c0f6e'], + threshold: 3, + validators: [ + '0xe132235c958ca1f3f24d772e5970dd58da4c0f6e', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + '0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59', // flow foundation + ], }, formtestnet: { @@ -343,11 +375,14 @@ export const defaultMultisigConfigs: ChainMap = { }, fraxtal: { - threshold: 2, + threshold: 4, validators: [ '0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91', // luganodes + '0x0d4c1394a255568ec0ecd11795B28D1BdA183Ca4', // tessellated (superlane) + '0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82', // enigma (superlane) + '0x573e960e07ad74ea2c5f1e3c31b2055994b12797', // imperator (superlane) + '0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', // bware (superlane) + '0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91', // luganodes (superlane) ], }, @@ -408,15 +443,19 @@ export const defaultMultisigConfigs: ChainMap = { }, immutablezkevmmainnet: { - threshold: 1, - validators: ['0xbdda85b19a5efbe09e52a32db1a072f043dd66da'], + threshold: 2, + validators: [ + '0xbdda85b19a5efbe09e52a32db1a072f043dd66da', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, inevm: { threshold: 2, validators: [ '0xf9e35ee88e4448a3673b4676a4e153e3584a08eb', - '0x6B1d09A97b813D53e9D4b7523DA36604C0B52242', // caldera + '0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc', // decentrio '0x9ab11f38a609940153850df611c9a2175dcffe0f', // imperator ], }, @@ -524,8 +563,12 @@ export const defaultMultisigConfigs: ChainMap = { }, metal: { - threshold: 1, - validators: ['0xd9f7f1a05826197a93df51e86cefb41dfbfb896a'], + threshold: 2, + validators: [ + '0xd9f7f1a05826197a93df51e86cefb41dfbfb896a', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, metis: { @@ -674,13 +717,21 @@ export const defaultMultisigConfigs: ChainMap = { }, polynomialfi: { - threshold: 1, - validators: ['0x23d348c2d365040e56f3fee07e6897122915f513'], + threshold: 2, + validators: [ + '0x23d348c2d365040e56f3fee07e6897122915f513', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, prom: { - threshold: 1, - validators: ['0xb0c4042b7c9a95345be8913f4cdbf4043b923d98'], + threshold: 2, + validators: [ + '0xb0c4042b7c9a95345be8913f4cdbf4043b923d98', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, proofofplay: { @@ -693,8 +744,12 @@ export const defaultMultisigConfigs: ChainMap = { }, rarichain: { - threshold: 1, - validators: ['0xeac012df7530720dd7d6f9b727e4fe39807d1516'], + threshold: 2, + validators: [ + '0xeac012df7530720dd7d6f9b727e4fe39807d1516', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, real: { @@ -717,8 +772,12 @@ export const defaultMultisigConfigs: ChainMap = { }, rootstockmainnet: { - threshold: 1, - validators: ['0x8675eb603d62ab64e3efe90df914e555966e04ac'], + threshold: 2, + validators: [ + '0x8675eb603d62ab64e3efe90df914e555966e04ac', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, sanko: { @@ -843,8 +902,12 @@ export const defaultMultisigConfigs: ChainMap = { }, superpositionmainnet: { - threshold: 1, - validators: ['0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84'], + threshold: 2, + validators: [ + '0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84', + '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + ], }, superpositiontestnet: { @@ -852,6 +915,11 @@ export const defaultMultisigConfigs: ChainMap = { validators: ['0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a'], }, + superseed: { + threshold: 1, + validators: ['0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88'], + }, + taiko: { threshold: 3, validators: [ @@ -871,11 +939,26 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + treasuretopaz: { + threshold: 1, + validators: ['0x9750849beda0a7870462d4685f953fe39033a5ae'], + }, + + unichain: { + threshold: 1, + validators: ['0x9773a382342ebf604a2e5de0a1f462fb499e28b1'], + }, + unichaintestnet: { threshold: 1, validators: ['0x5e99961cf71918308c3b17ef21b5f515a4f86fe5'], }, + vana: { + threshold: 1, + validators: ['0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534'], + }, + viction: { threshold: 2, validators: [ diff --git a/typescript/sdk/src/core/EvmCoreModule.ts b/typescript/sdk/src/core/EvmCoreModule.ts index 84a931dca7..a14cdc5fe9 100644 --- a/typescript/sdk/src/core/EvmCoreModule.ts +++ b/typescript/sdk/src/core/EvmCoreModule.ts @@ -1,4 +1,8 @@ -import { Mailbox, Mailbox__factory } from '@hyperlane-xyz/core'; +import { + Mailbox, + Mailbox__factory, + Ownable__factory, +} from '@hyperlane-xyz/core'; import { Address, Domain, @@ -24,6 +28,7 @@ import { ProxyFactoryFactories, proxyFactoryFactories, } from '../deploy/contracts.js'; +import { proxyAdminUpdateTxs } from '../deploy/proxy.js'; import { ContractVerifier } from '../deploy/verify/ContractVerifier.js'; import { HookFactories } from '../hook/contracts.js'; import { EvmIsmModule } from '../ism/EvmIsmModule.js'; @@ -65,6 +70,7 @@ export class EvmCoreModule extends HyperlaneModule< this.chainName = multiProvider.getChainName(args.chain); this.chainId = multiProvider.getEvmChainId(args.chain); this.domainId = multiProvider.getDomainId(args.chain); + this.chainId = multiProvider.getEvmChainId(args.chain); } /** @@ -92,6 +98,12 @@ export class EvmCoreModule extends HyperlaneModule< transactions.push( ...(await this.createDefaultIsmUpdateTxs(actualConfig, expectedConfig)), ...this.createMailboxOwnerUpdateTxs(actualConfig, expectedConfig), + ...proxyAdminUpdateTxs( + this.chainId, + this.args.addresses.mailbox, + actualConfig, + expectedConfig, + ), ); return transactions; @@ -276,15 +288,17 @@ export class EvmCoreModule extends HyperlaneModule< ); // Deploy proxyAdmin - const proxyAdmin = ( - await coreDeployer.deployContract(chainName, 'proxyAdmin', []) - ).address; + const proxyAdmin = await coreDeployer.deployContract( + chainName, + 'proxyAdmin', + [], + ); // Deploy Mailbox const mailbox = await this.deployMailbox({ config, coreDeployer, - proxyAdmin, + proxyAdmin: proxyAdmin.address, multiProvider, chain, }); @@ -333,11 +347,27 @@ export class EvmCoreModule extends HyperlaneModule< const { merkleTreeHook, interchainGasPaymaster } = serializedContracts[chainName]; + // Update the ProxyAdmin owner of the Mailbox if the config defines a different owner from the current signer + const currentProxyOwner = await proxyAdmin.owner(); + if ( + config?.proxyAdmin?.owner && + !eqAddress(config.proxyAdmin.owner, currentProxyOwner) + ) { + await multiProvider.sendTransaction(chainName, { + annotation: `Transferring ownership of ProxyAdmin to the configured address ${config.proxyAdmin.owner}`, + to: proxyAdmin.address, + data: Ownable__factory.createInterface().encodeFunctionData( + 'transferOwnership(address)', + [config.proxyAdmin.owner], + ), + }); + } + // Set Core & extra addresses return { ...ismFactoryFactories, - proxyAdmin, + proxyAdmin: proxyAdmin.address, mailbox: mailbox.address, interchainAccountRouter, interchainAccountIsm, diff --git a/typescript/sdk/src/core/EvmCoreReader.ts b/typescript/sdk/src/core/EvmCoreReader.ts index 6c945bcf5d..0c0a7887a1 100644 --- a/typescript/sdk/src/core/EvmCoreReader.ts +++ b/typescript/sdk/src/core/EvmCoreReader.ts @@ -1,6 +1,6 @@ import { providers } from 'ethers'; -import { Mailbox__factory } from '@hyperlane-xyz/core'; +import { Mailbox__factory, ProxyAdmin__factory } from '@hyperlane-xyz/core'; import { Address, objMap, @@ -9,6 +9,8 @@ import { } from '@hyperlane-xyz/utils'; import { DEFAULT_CONTRACT_READ_CONCURRENCY } from '../consts/concurrency.js'; +import { proxyAdmin } from '../deploy/proxy.js'; +import { DeployedOwnableConfig } from '../deploy/types.js'; import { EvmHookReader } from '../hook/EvmHookReader.js'; import { EvmIsmReader } from '../ism/EvmIsmReader.js'; import { MultiProvider } from '../providers/MultiProvider.js'; @@ -46,11 +48,13 @@ export class EvmCoreReader implements CoreReader { */ async deriveCoreConfig(address: Address): Promise { const mailbox = Mailbox__factory.connect(address, this.provider); - const [defaultIsm, defaultHook, requiredHook] = await Promise.all([ - mailbox.defaultIsm(), - mailbox.defaultHook(), - mailbox.requiredHook(), - ]); + const [defaultIsm, defaultHook, requiredHook, mailboxProxyAdmin] = + await Promise.all([ + mailbox.defaultIsm(), + mailbox.defaultHook(), + mailbox.requiredHook(), + proxyAdmin(this.provider, mailbox.address), + ]); // Parallelize each configuration request const results = await promiseObjAll( @@ -60,6 +64,7 @@ export class EvmCoreReader implements CoreReader { defaultIsm: this.evmIsmReader.deriveIsmConfig(defaultIsm), defaultHook: this.evmHookReader.deriveHookConfig(defaultHook), requiredHook: this.evmHookReader.deriveHookConfig(requiredHook), + proxyAdmin: this.getProxyAdminConfig(mailboxProxyAdmin), }, async (_, readerCall) => { try { @@ -77,4 +82,19 @@ export class EvmCoreReader implements CoreReader { return results as CoreConfig; } + + private async getProxyAdminConfig( + proxyAdminAddress: Address, + ): Promise { + const instance = ProxyAdmin__factory.connect( + proxyAdminAddress, + this.provider, + ); + + const owner = await instance.owner(); + return { + owner, + address: proxyAdminAddress, + }; + } } diff --git a/typescript/sdk/src/core/HyperlaneCore.ts b/typescript/sdk/src/core/HyperlaneCore.ts index 8b1425d102..a3f82e36d1 100644 --- a/typescript/sdk/src/core/HyperlaneCore.ts +++ b/typescript/sdk/src/core/HyperlaneCore.ts @@ -204,9 +204,16 @@ export class HyperlaneCore extends HyperlaneApp { mailbox.on( mailbox.filters.Dispatch(), (_sender, _destination, _recipient, message, event) => { - const parsed = HyperlaneCore.parseDispatchedMessage(message); - this.logger.info(`Observed message ${parsed.id} on ${originChain}`); - return handler(parsed, event); + const dispatched = HyperlaneCore.parseDispatchedMessage(message); + + // add human readable chain names + dispatched.parsed.originChain = this.getOrigin(dispatched); + dispatched.parsed.destinationChain = this.getDestination(dispatched); + + this.logger.info( + `Observed message ${dispatched.id} on ${originChain} to ${dispatched.parsed.destinationChain}`, + ); + return handler(dispatched, event); }, ); }); diff --git a/typescript/sdk/src/core/HyperlaneRelayer.ts b/typescript/sdk/src/core/HyperlaneRelayer.ts index cb0ba570e9..0a1a451ebf 100644 --- a/typescript/sdk/src/core/HyperlaneRelayer.ts +++ b/typescript/sdk/src/core/HyperlaneRelayer.ts @@ -2,13 +2,18 @@ import { ethers, providers } from 'ethers'; import { Logger } from 'pino'; import { z } from 'zod'; +import { ChainMap } from '@hyperlane-xyz/sdk'; import { Address, + ParsedMessage, assert, + bytes32ToAddress, + messageId, objMap, objMerge, - pollAsync, + parseMessage, promiseObjAll, + sleep, } from '@hyperlane-xyz/utils'; import { DerivedHookConfig, EvmHookReader } from '../hook/EvmHookReader.js'; @@ -31,19 +36,64 @@ const DerivedHookConfigWithAddressSchema = const DerivedIsmConfigWithAddressSchema = IsmConfigSchema.and(WithAddressSchema); +const BacklogMessageSchema = z.object({ + attempts: z.number(), + lastAttempt: z.number(), + message: z.string(), + dispatchTx: z.string(), +}); + +const MessageBacklogSchema = z.array(BacklogMessageSchema); + export const RelayerCacheSchema = z.object({ hook: z.record(z.record(DerivedHookConfigWithAddressSchema)), ism: z.record(z.record(DerivedIsmConfigWithAddressSchema)), + backlog: MessageBacklogSchema, }); type RelayerCache = z.infer; +type MessageWhitelist = ChainMap>; + +// message must have origin and destination chains in the whitelist +// if whitelist has non-empty address set for chain, message must have sender and recipient in the set +export function messageMatchesWhitelist( + whitelist: MessageWhitelist, + message: ParsedMessage, +): boolean { + const originAddresses = whitelist[message.originChain ?? message.origin]; + if (!originAddresses) { + return false; + } + + const sender = bytes32ToAddress(message.sender); + if (originAddresses.size !== 0 && !originAddresses.has(sender)) { + return false; + } + + const destinationAddresses = + whitelist[message.destinationChain ?? message.destination]; + if (!destinationAddresses) { + return false; + } + + const recipient = bytes32ToAddress(message.recipient); + if (destinationAddresses.size !== 0 && !destinationAddresses.has(recipient)) { + return false; + } + + return true; +} + export class HyperlaneRelayer { protected multiProvider: MultiProvider; protected metadataBuilder: BaseMetadataBuilder; protected readonly core: HyperlaneCore; protected readonly retryTimeout: number; + protected readonly whitelist: ChainMap> | undefined; + + public backlog: RelayerCache['backlog']; public cache: RelayerCache | undefined; protected stopRelayingHandler: ((chains?: ChainName[]) => void) | undefined; @@ -53,21 +103,32 @@ export class HyperlaneRelayer { constructor({ core, caching = true, - retryTimeout = 5 * 1000, + retryTimeout = 1000, + whitelist = undefined, }: { core: HyperlaneCore; caching?: boolean; retryTimeout?: number; + whitelist?: ChainMap; }) { this.core = core; this.retryTimeout = retryTimeout; this.logger = core.logger.child({ module: 'Relayer' }); this.metadataBuilder = new BaseMetadataBuilder(core); this.multiProvider = core.multiProvider; + if (whitelist) { + this.whitelist = objMap( + whitelist, + (_chain, addresses) => new Set(addresses), + ); + } + + this.backlog = []; if (caching) { this.cache = { hook: {}, ism: {}, + backlog: [], }; } } @@ -152,11 +213,24 @@ export class HyperlaneRelayer { messageIndex = 0, message = HyperlaneCore.getDispatchedMessages(dispatchTx)[messageIndex], ): Promise { + if (this.whitelist) { + // add human readable names for use in whitelist checks + message.parsed = { + originChain: this.core.getOrigin(message), + destinationChain: this.core.getDestination(message), + ...message.parsed, + }; + assert( + messageMatchesWhitelist(this.whitelist, message.parsed), + `Message ${message.id} does not match whitelist`, + ); + } + this.logger.info(`Preparing to relay message ${message.id}`); const isDelivered = await this.core.isDelivered(message); if (isDelivered) { - this.logger.debug(`Message ${message.id} already delivered`); + this.logger.info(`Message ${message.id} already delivered`); return this.core.getProcessedReceipt(message); } @@ -170,18 +244,14 @@ export class HyperlaneRelayer { ]); this.logger.debug({ ism, hook }, `Retrieved ISM and hook configs`); - const blockTime = this.multiProvider.getChainMetadata( - message.parsed.destination, - ).blocks?.estimateBlockTime; - const waitTime = blockTime ? blockTime * 2 : this.retryTimeout; - - const metadata = await pollAsync( - () => this.metadataBuilder.build({ message, ism, hook, dispatchTx }), - waitTime, - 12, // 12 attempts - ); + const metadata = await this.metadataBuilder.build({ + message, + ism, + hook, + dispatchTx, + }); - this.logger.info({ message, metadata }, `Relaying message ${message.id}`); + this.logger.info(`Relaying message ${message.id}`); return this.core.deliver(message, metadata); } @@ -206,44 +276,92 @@ export class HyperlaneRelayer { ); } - start(chains = this.core.chains()): void { - assert(!this.stopRelayingHandler, 'Relayer already started'); + protected async flushBacklog(): Promise { + while (this.stopRelayingHandler) { + const backlogMsg = this.backlog.shift(); - const { removeHandler } = this.core.onDispatch(async (message, event) => { - const destination = message.parsed.destination; - const chain = this.multiProvider.tryGetChainName(destination); - if (!chain) { - this.logger.warn(`Unknown destination ${destination}`); - return; + if (!backlogMsg) { + this.logger.trace('Backlog empty, waiting 1s'); + await sleep(1000); + continue; } - if (!chains.includes(chain)) { - this.logger.info(`Skipping message to chain ${chain}`); - return; + // linear backoff (attempts * retryTimeout) + if ( + Date.now() < + backlogMsg.lastAttempt + backlogMsg.attempts * this.retryTimeout + ) { + this.backlog.push(backlogMsg); + continue; } - const dispatchReceipt = await event.getTransactionReceipt(); - const processReceipt = await this.relayMessage( - dispatchReceipt, - undefined, - message, - ); + const { message, dispatchTx, attempts } = backlogMsg; + const id = messageId(message); + const parsed = parseMessage(message); + const dispatchMsg = { id, message, parsed }; + + try { + const dispatchReceipt = await this.multiProvider + .getProvider(parsed.origin) + .getTransactionReceipt(dispatchTx); + + // TODO: handle batching + await this.relayMessage(dispatchReceipt, undefined, dispatchMsg); + } catch (error) { + this.logger.error( + `Failed to relay message ${id} (attempt #${attempts + 1})`, + ); + this.backlog.push({ + ...backlogMsg, + attempts: attempts + 1, + lastAttempt: Date.now(), + }); + } + } + } - this.logger.info( - `Message ${message.id} was processed in ${ - this.multiProvider.tryGetExplorerTxUrl(destination, { - hash: processReceipt.transactionHash, - }) ?? 'tx ' + processReceipt.transactionHash - }`, - ); - }, chains); + protected whitelistChains() { + return this.whitelist ? Object.keys(this.whitelist) : undefined; + } + + start(): void { + assert(!this.stopRelayingHandler, 'Relayer already started'); + + this.backlog = this.cache?.backlog ?? []; + + const { removeHandler } = this.core.onDispatch(async (message, event) => { + if ( + this.whitelist && + !messageMatchesWhitelist(this.whitelist, message.parsed) + ) { + this.logger.debug( + { message, whitelist: this.whitelist }, + `Skipping message ${message.id} not matching whitelist`, + ); + return; + } + + this.backlog.push({ + attempts: 0, + lastAttempt: Date.now(), + message: message.message, + dispatchTx: event.transactionHash, + }); + }, this.whitelistChains()); this.stopRelayingHandler = removeHandler; + + // start flushing backlog + void this.flushBacklog(); } - stop(chains = this.core.chains()): void { + stop(): void { assert(this.stopRelayingHandler, 'Relayer not started'); - this.stopRelayingHandler(chains); + this.stopRelayingHandler(this.whitelistChains()); this.stopRelayingHandler = undefined; + + if (this.cache) { + this.cache.backlog = this.backlog; + } } } diff --git a/typescript/sdk/src/core/schemas.ts b/typescript/sdk/src/core/schemas.ts index 569bb2ee08..470df95ab0 100644 --- a/typescript/sdk/src/core/schemas.ts +++ b/typescript/sdk/src/core/schemas.ts @@ -3,12 +3,15 @@ import { z } from 'zod'; import { ProxyFactoryFactoriesSchema } from '../deploy/schemas.js'; import { HookConfigSchema } from '../hook/schemas.js'; import { IsmConfigSchema } from '../ism/schemas.js'; -import { OwnableSchema } from '../schemas.js'; +import { DeployedOwnableSchema, OwnableSchema } from '../schemas.js'; export const CoreConfigSchema = OwnableSchema.extend({ defaultIsm: IsmConfigSchema, defaultHook: HookConfigSchema, requiredHook: HookConfigSchema, + // This field is set as optional because the old core config + // did not have it and we want to maintain backward compatibility + proxyAdmin: DeployedOwnableSchema.optional(), }); export const DeployedCoreAddressesSchema = ProxyFactoryFactoriesSchema.extend({ diff --git a/typescript/sdk/src/deploy/proxy.ts b/typescript/sdk/src/deploy/proxy.ts index 041d27cac2..ed9767225e 100644 --- a/typescript/sdk/src/deploy/proxy.ts +++ b/typescript/sdk/src/deploy/proxy.ts @@ -1,6 +1,12 @@ import { ethers } from 'ethers'; -import { Address, eqAddress } from '@hyperlane-xyz/utils'; +import { ProxyAdmin__factory } from '@hyperlane-xyz/core'; +import { Address, ChainId, eqAddress } from '@hyperlane-xyz/utils'; + +import { transferOwnershipTransactions } from '../contracts/contracts.js'; +import { AnnotatedEV5Transaction } from '../providers/ProviderType.js'; + +import { DeployedOwnableConfig } from './types.js'; export type UpgradeConfig = { timelock: { @@ -67,3 +73,50 @@ export async function isProxy( const admin = await proxyAdmin(provider, proxy); return !eqAddress(admin, ethers.constants.AddressZero); } + +export function proxyAdminUpdateTxs( + chainId: ChainId, + proxyAddress: Address, + actualConfig: Readonly<{ proxyAdmin?: DeployedOwnableConfig }>, + expectedConfig: Readonly<{ proxyAdmin?: DeployedOwnableConfig }>, +): AnnotatedEV5Transaction[] { + const transactions: AnnotatedEV5Transaction[] = []; + + // Return early because old config files did not have the + // proxyAdmin property + if (!expectedConfig.proxyAdmin?.address) { + return transactions; + } + + const actualProxyAdmin = actualConfig.proxyAdmin!; + const parsedChainId = + typeof chainId === 'string' ? parseInt(chainId) : chainId; + + if ( + actualProxyAdmin.address && + actualProxyAdmin.address !== expectedConfig.proxyAdmin.address + ) { + transactions.push({ + chainId: parsedChainId, + annotation: `Updating ProxyAdmin for proxy at "${proxyAddress}" from "${actualProxyAdmin.address}" to "${expectedConfig.proxyAdmin.address}"`, + to: actualProxyAdmin.address, + data: ProxyAdmin__factory.createInterface().encodeFunctionData( + 'changeProxyAdmin(address,address)', + [proxyAddress, expectedConfig.proxyAdmin.address], + ), + }); + } else { + transactions.push( + // Internally the createTransferOwnershipTx method already checks if the + // two owner values are the same and produces an empty tx batch if they are + ...transferOwnershipTransactions( + parsedChainId, + actualProxyAdmin.address!, + actualProxyAdmin, + expectedConfig.proxyAdmin, + ), + ); + } + + return transactions; +} diff --git a/typescript/sdk/src/gas/token-prices.test.ts b/typescript/sdk/src/gas/token-prices.test.ts index 48deda8bc8..dbc1dc76b1 100644 --- a/typescript/sdk/src/gas/token-prices.test.ts +++ b/typescript/sdk/src/gas/token-prices.test.ts @@ -1,51 +1,83 @@ import { expect } from 'chai'; +import sinon from 'sinon'; + +import { ethereum, solanamainnet } from '@hyperlane-xyz/registry'; import { TestChainName, testChainMetadata } from '../consts/testChains.js'; -import { MockCoinGecko } from '../test/MockCoinGecko.js'; import { CoinGeckoTokenPriceGetter } from './token-prices.js'; +const MOCK_FETCH_CALLS = true; + describe('TokenPriceGetter', () => { let tokenPriceGetter: CoinGeckoTokenPriceGetter; - let mockCoinGecko: MockCoinGecko; - const chainA = TestChainName.test1, - chainB = TestChainName.test2, - priceA = 1, - priceB = 5.5; - before(async () => { - mockCoinGecko = new MockCoinGecko(); - // Origin token - mockCoinGecko.setTokenPrice(chainA, priceA); - // Destination token - mockCoinGecko.setTokenPrice(chainB, priceB); - tokenPriceGetter = new CoinGeckoTokenPriceGetter( - mockCoinGecko, - testChainMetadata, - undefined, - 0, - ); + + const chainA = TestChainName.test1; + const chainB = TestChainName.test2; + const priceA = 2; + const priceB = 5; + let stub: sinon.SinonStub; + + beforeEach(() => { + tokenPriceGetter = new CoinGeckoTokenPriceGetter({ + chainMetadata: { ethereum, solanamainnet, ...testChainMetadata }, + apiKey: 'test', + expirySeconds: 10, + sleepMsBetweenRequests: 10, + }); + + if (MOCK_FETCH_CALLS) { + stub = sinon + .stub(tokenPriceGetter, 'fetchPriceData') + .returns(Promise.resolve([priceA, priceB])); + } }); - describe('getTokenPrice', () => { - it('returns a token price', async () => { - expect(await tokenPriceGetter.getTokenPrice(chainA)).to.equal(priceA); + afterEach(() => { + if (MOCK_FETCH_CALLS && stub) { + stub.restore(); + } + }); + + describe('getTokenPriceByIds', () => { + it('returns token prices', async () => { + // stubbed results + expect( + await tokenPriceGetter.getTokenPriceByIds([ + ethereum.name, + solanamainnet.name, + ]), + ).to.eql([priceA, priceB]); }); + }); - it('caches a token price', async () => { - mockCoinGecko.setFail(chainA, true); - expect(await tokenPriceGetter.getTokenPrice(chainA)).to.equal(priceA); - mockCoinGecko.setFail(chainA, false); + describe('getTokenPrice', () => { + it('returns a token price', async () => { + // hardcoded result of 1 for testnets + expect( + await tokenPriceGetter.getTokenPrice(TestChainName.test1), + ).to.equal(1); + // stubbed result for non-testnet + expect(await tokenPriceGetter.getTokenPrice(ethereum.name)).to.equal( + priceA, + ); }); }); describe('getTokenExchangeRate', () => { it('returns a value consistent with getTokenPrice()', async () => { - const exchangeRate = await tokenPriceGetter.getTokenExchangeRate( - chainA, - chainB, - ); - // Should equal 1 because testnet prices are always forced to 1 - expect(exchangeRate).to.equal(1); + // hardcoded result of 1 for testnets + expect( + await tokenPriceGetter.getTokenExchangeRate(chainA, chainB), + ).to.equal(1); + + // stubbed result for non-testnet + expect( + await tokenPriceGetter.getTokenExchangeRate( + ethereum.name, + solanamainnet.name, + ), + ).to.equal(priceA / priceB); }); }); }); diff --git a/typescript/sdk/src/gas/token-prices.ts b/typescript/sdk/src/gas/token-prices.ts index 80b1ae2888..62a477422a 100644 --- a/typescript/sdk/src/gas/token-prices.ts +++ b/typescript/sdk/src/gas/token-prices.ts @@ -1,21 +1,15 @@ -import { CoinGeckoClient, SimplePriceResponse } from 'coingecko-api-v3'; - -import { rootLogger, sleep } from '@hyperlane-xyz/utils'; +import { objKeys, rootLogger, sleep } from '@hyperlane-xyz/utils'; import { ChainMetadata } from '../metadata/chainMetadataTypes.js'; import { ChainMap, ChainName } from '../types.js'; +const COINGECKO_PRICE_API = 'https://api.coingecko.com/api/v3/simple/price'; + export interface TokenPriceGetter { getTokenPrice(chain: ChainName): Promise; getTokenExchangeRate(base: ChainName, quote: ChainName): Promise; } -export type CoinGeckoInterface = Pick; -export type CoinGeckoSimplePriceInterface = CoinGeckoClient['simplePrice']; -export type CoinGeckoSimplePriceParams = - Parameters[0]; -export type CoinGeckoResponse = ReturnType; - type TokenPriceCacheEntry = { price: number; timestamp: Date; @@ -65,38 +59,28 @@ class TokenPriceCache { } export class CoinGeckoTokenPriceGetter implements TokenPriceGetter { - protected coinGecko: CoinGeckoInterface; protected cache: TokenPriceCache; + protected apiKey?: string; protected sleepMsBetweenRequests: number; protected metadata: ChainMap; - constructor( - coinGecko: CoinGeckoInterface, - chainMetadata: ChainMap, - expirySeconds?: number, + constructor({ + chainMetadata, + apiKey, + expirySeconds, sleepMsBetweenRequests = 5000, - ) { - this.coinGecko = coinGecko; + }: { + chainMetadata: ChainMap; + apiKey?: string; + expirySeconds?: number; + sleepMsBetweenRequests?: number; + }) { + this.apiKey = apiKey; this.cache = new TokenPriceCache(expirySeconds); this.metadata = chainMetadata; this.sleepMsBetweenRequests = sleepMsBetweenRequests; } - static withDefaultCoinGecko( - chainMetadata: ChainMap, - apiKey?: string, - expirySeconds?: number, - sleepMsBetweenRequests = 5000, - ): CoinGeckoTokenPriceGetter { - const coinGecko = new CoinGeckoClient(undefined, apiKey); - return new CoinGeckoTokenPriceGetter( - coinGecko, - chainMetadata, - expirySeconds, - sleepMsBetweenRequests, - ); - } - async getTokenPrice( chain: ChainName, currency: string = 'usd', @@ -105,6 +89,15 @@ export class CoinGeckoTokenPriceGetter implements TokenPriceGetter { return price; } + async getAllTokenPrices(currency: string = 'usd'): Promise> { + const chains = objKeys(this.metadata); + const prices = await this.getTokenPrices(chains, currency); + return chains.reduce( + (agg, chain, i) => ({ ...agg, [chain]: prices[i] }), + {}, + ); + } + async getTokenExchangeRate( base: ChainName, quote: ChainName, @@ -153,14 +146,9 @@ export class CoinGeckoTokenPriceGetter implements TokenPriceGetter { await sleep(this.sleepMsBetweenRequests); if (toQuery.length > 0) { - let response: SimplePriceResponse; try { - response = await this.coinGecko.simplePrice({ - ids: toQuery.join(','), - vs_currencies: currency, - }); - const prices = toQuery.map((id) => response[id][currency]); - toQuery.map((id, i) => this.cache.put(id, prices[i])); + const prices = await this.fetchPriceData(toQuery, currency); + prices.forEach((price, i) => this.cache.put(toQuery[i], price)); } catch (e) { rootLogger.warn('Error when querying token prices', e); return undefined; @@ -168,4 +156,25 @@ export class CoinGeckoTokenPriceGetter implements TokenPriceGetter { } return ids.map((id) => this.cache.fetch(id)); } + + public async fetchPriceData( + ids: string[], + currency: string, + ): Promise { + let url = `${COINGECKO_PRICE_API}?ids=${Object.entries(ids).join( + ',', + )}&vs_currencies=${currency}`; + if (this.apiKey) { + url += `&x-cg-pro-api-key=${this.apiKey}`; + } + + const resp = await fetch(url); + const idPrices = await resp.json(); + + return ids.map((id) => { + const price = idPrices[id]?.[currency]; + if (!price) throw new Error(`No price found for ${id}`); + return Number(price); + }); + } } diff --git a/typescript/sdk/src/gas/utils.ts b/typescript/sdk/src/gas/utils.ts index 3a658d9b6a..6f007398c5 100644 --- a/typescript/sdk/src/gas/utils.ts +++ b/typescript/sdk/src/gas/utils.ts @@ -9,7 +9,6 @@ import { } from '../consts/igp.js'; import { ChainMetadataManager } from '../metadata/ChainMetadataManager.js'; import { AgentCosmosGasPrice } from '../metadata/agentConfig.js'; -import { ChainMetadata } from '../metadata/chainMetadataTypes.js'; import { MultiProtocolProvider } from '../providers/MultiProtocolProvider.js'; import { ChainMap, ChainName } from '../types.js'; import { getCosmosRegistryChain } from '../utils/cosmos.js'; @@ -215,37 +214,3 @@ export function getLocalStorageGasOracleConfig({ }; }, {} as ChainMap); } - -const COINGECKO_PRICE_API = 'https://api.coingecko.com/api/v3/simple/price'; - -export async function getCoingeckoTokenPrices( - chainMetadata: ChainMap, - currency = 'usd', -): Promise> { - const ids = objMap( - chainMetadata, - (_, metadata) => metadata.gasCurrencyCoinGeckoId ?? metadata.name, - ); - - const resp = await fetch( - `${COINGECKO_PRICE_API}?ids=${Object.entries(ids).join( - ',', - )}&vs_currencies=${currency}`, - ); - - const idPrices = await resp.json(); - - const prices = objMap(ids, (chain, id) => { - const idData = idPrices[id]; - if (!idData) { - return undefined; - } - const price = idData[currency]; - if (!price) { - return undefined; - } - return price.toString(); - }); - - return prices; -} diff --git a/typescript/sdk/src/hook/EvmHookReader.test.ts b/typescript/sdk/src/hook/EvmHookReader.test.ts index 6bab47a920..befd73a431 100644 --- a/typescript/sdk/src/hook/EvmHookReader.test.ts +++ b/typescript/sdk/src/hook/EvmHookReader.test.ts @@ -19,6 +19,7 @@ import { WithAddress } from '@hyperlane-xyz/utils'; import { TestChainName, test1 } from '../consts/testChains.js'; import { MultiProvider } from '../providers/MultiProvider.js'; +import { randomAddress } from '../test/testUtils.js'; import { EvmHookReader } from './EvmHookReader.js'; import { @@ -35,8 +36,6 @@ describe('EvmHookReader', () => { let multiProvider: MultiProvider; let sandbox: sinon.SinonSandbox; - const generateRandomAddress = () => ethers.Wallet.createRandom().address; - beforeEach(() => { sandbox = sinon.createSandbox(); multiProvider = MultiProvider.createTestMultiProvider(); @@ -48,8 +47,8 @@ describe('EvmHookReader', () => { }); it('should derive merkle tree config correctly', async () => { - const mockAddress = generateRandomAddress(); - const mockOwner = generateRandomAddress(); + const mockAddress = randomAddress(); + const mockOwner = randomAddress(); // Mocking the connect method + returned what we need from contract object const mockContract = { @@ -78,9 +77,9 @@ describe('EvmHookReader', () => { }); it('should derive protocol fee hook correctly', async () => { - const mockAddress = generateRandomAddress(); - const mockOwner = generateRandomAddress(); - const mockBeneficiary = generateRandomAddress(); + const mockAddress = randomAddress(); + const mockOwner = randomAddress(); + const mockBeneficiary = randomAddress(); // Mocking the connect method + returned what we need from contract object const mockContract = { @@ -116,8 +115,8 @@ describe('EvmHookReader', () => { }); it('should derive pausable config correctly', async () => { - const mockAddress = generateRandomAddress(); - const mockOwner = generateRandomAddress(); + const mockAddress = randomAddress(); + const mockOwner = randomAddress(); const mockPaused = randomBytes(1)[0] % 2 === 0; // Mocking the connect method + returned what we need from contract object @@ -151,9 +150,9 @@ describe('EvmHookReader', () => { // eslint-disable-next-line @typescript-eslint/no-empty-function it('should derive op stack config correctly', async () => { - const mockAddress = generateRandomAddress(); - const mockOwner = generateRandomAddress(); - const l1Messenger = generateRandomAddress(); + const mockAddress = randomAddress(); + const mockOwner = randomAddress(); + const l1Messenger = randomAddress(); // Mocking the connect method + returned what we need from contract object const mockContract = { @@ -187,8 +186,8 @@ describe('EvmHookReader', () => { }); it('should throw if derivation fails', async () => { - const mockAddress = generateRandomAddress(); - const mockOwner = generateRandomAddress(); + const mockAddress = randomAddress(); + const mockOwner = randomAddress(); // Mocking the connect method + returned what we need from contract object const mockContract = { diff --git a/typescript/sdk/src/hook/EvmHookReader.ts b/typescript/sdk/src/hook/EvmHookReader.ts index f84eecc8aa..9ebcd8ae03 100644 --- a/typescript/sdk/src/hook/EvmHookReader.ts +++ b/typescript/sdk/src/hook/EvmHookReader.ts @@ -243,7 +243,9 @@ export class EvmHookReader extends HyperlaneReader implements HookReader { let oracleKey: string | undefined; - const domainIds = this.multiProvider.getKnownDomainIds(); + const domainIds = this.messageContext + ? [this.messageContext.parsed.destination] + : this.multiProvider.getKnownDomainIds(); const allKeys = await concurrentMap( this.concurrency, diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index e52b6109af..c7db758b7d 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -328,6 +328,7 @@ export { SmartProviderOptions, } from './providers/SmartProvider/types.js'; export { CallData } from './providers/transactions/types.js'; +export { randomAddress } from './test/testUtils.js'; export { SubmitterMetadataSchema } from './providers/transactions/submitter/schemas.js'; export { TxSubmitterInterface } from './providers/transactions/submitter/TxSubmitterInterface.js'; @@ -369,6 +370,10 @@ export { EV5TxTransformerInterface } from './providers/transactions/transformer/ export { EV5InterchainAccountTxTransformerPropsSchema } from './providers/transactions/transformer/ethersV5/schemas.js'; export { EV5InterchainAccountTxTransformerProps } from './providers/transactions/transformer/ethersV5/types.js'; +export { + chainMetadataToCosmosChain, + chainMetadataToViemChain, +} from './metadata/chainMetadataConversion.js'; export { EvmGasRouterAdapter, EvmRouterAdapter, @@ -419,11 +424,14 @@ export { EvmHypCollateralAdapter, EvmHypNativeAdapter, EvmHypSyntheticAdapter, + EvmHypXERC20Adapter, + EvmHypXERC20LockboxAdapter, EvmNativeTokenAdapter, EvmTokenAdapter, } from './token/adapters/EvmTokenAdapter.js'; export { IHypTokenAdapter, + IHypXERC20Adapter, ITokenAdapter, InterchainGasQuote, TransferParams, @@ -499,7 +507,6 @@ export { getSealevelAccountDataSchema, } from './utils/sealevelSerialization.js'; export { getChainIdFromTxs } from './utils/transactions.js'; -export { chainMetadataToWagmiChain } from './utils/wagmi.js'; export { FeeConstantConfig, RouteBlacklist, @@ -529,7 +536,7 @@ export { isSyntheticRebaseConfig, isTokenMetadata, } from './token/schemas.js'; -export { isCompliant } from './utils/schemas.js'; +export { isCompliant, validateZodResult } from './utils/schemas.js'; export { canProposeSafeTransactions, @@ -556,8 +563,6 @@ export { EvmERC20WarpModule } from './token/EvmERC20WarpModule.js'; export { GasPriceConfig, NativeTokenPriceConfig, - ChainGasOracleParams, - getCoingeckoTokenPrices, getCosmosChainGasPrice, getGasPrice, getLocalStorageGasOracleConfig, diff --git a/typescript/sdk/src/ism/EvmIsmReader.test.ts b/typescript/sdk/src/ism/EvmIsmReader.test.ts index 95368949b3..4da13a80a9 100644 --- a/typescript/sdk/src/ism/EvmIsmReader.test.ts +++ b/typescript/sdk/src/ism/EvmIsmReader.test.ts @@ -1,5 +1,4 @@ import { expect } from 'chai'; -import { ethers } from 'ethers'; import sinon from 'sinon'; import { @@ -20,6 +19,7 @@ import { WithAddress } from '@hyperlane-xyz/utils'; import { TestChainName } from '../consts/testChains.js'; import { MultiProvider } from '../providers/MultiProvider.js'; +import { randomAddress } from '../test/testUtils.js'; import { EvmIsmReader } from './EvmIsmReader.js'; import { @@ -35,8 +35,6 @@ describe('EvmIsmReader', () => { let multiProvider: MultiProvider; let sandbox: sinon.SinonSandbox; - const generateRandomAddress = () => ethers.Wallet.createRandom().address; - beforeEach(() => { sandbox = sinon.createSandbox(); multiProvider = MultiProvider.createTestMultiProvider(); @@ -48,8 +46,8 @@ describe('EvmIsmReader', () => { }); it('should derive multisig config correctly', async () => { - const mockAddress = generateRandomAddress(); - const mockValidators = [generateRandomAddress(), generateRandomAddress()]; + const mockAddress = randomAddress(); + const mockValidators = [randomAddress(), randomAddress()]; const mockThreshold = 2; // Mocking the connect method + returned what we need from contract object @@ -83,8 +81,8 @@ describe('EvmIsmReader', () => { }); it('should derive pausable config correctly', async () => { - const mockAddress = generateRandomAddress(); - const mockOwner = generateRandomAddress(); + const mockAddress = randomAddress(); + const mockOwner = randomAddress(); const mockPaused = true; // Mocking the connect method + returned what we need from contract object @@ -120,7 +118,7 @@ describe('EvmIsmReader', () => { }); it('should derive test ISM config correctly', async () => { - const mockAddress = generateRandomAddress(); + const mockAddress = randomAddress(); // Mocking the connect method + returned what we need from contract object const mockContract = { diff --git a/typescript/sdk/src/metadata/chainMetadataConversion.ts b/typescript/sdk/src/metadata/chainMetadataConversion.ts new file mode 100644 index 0000000000..d0574e3017 --- /dev/null +++ b/typescript/sdk/src/metadata/chainMetadataConversion.ts @@ -0,0 +1,98 @@ +import type { AssetList, Chain as CosmosChain } from '@chain-registry/types'; +import { Chain, defineChain } from 'viem'; + +import { test1 } from '../consts/testChains.js'; +import { + ChainMetadata, + getChainIdNumber, +} from '../metadata/chainMetadataTypes.js'; + +export function chainMetadataToViemChain(metadata: ChainMetadata): Chain { + return defineChain({ + id: getChainIdNumber(metadata), + name: metadata.displayName || metadata.name, + network: metadata.name, + nativeCurrency: metadata.nativeToken || test1.nativeToken!, + rpcUrls: { + public: { http: [metadata.rpcUrls[0].http] }, + default: { http: [metadata.rpcUrls[0].http] }, + }, + blockExplorers: metadata.blockExplorers?.length + ? { + default: { + name: metadata.blockExplorers[0].name, + url: metadata.blockExplorers[0].url, + }, + } + : undefined, + testnet: !!metadata.isTestnet, + }); +} + +export function chainMetadataToCosmosChain(metadata: ChainMetadata): { + chain: CosmosChain; + assets: AssetList; +} { + const { + name, + displayName, + chainId, + rpcUrls, + restUrls, + isTestnet, + nativeToken, + bech32Prefix, + slip44, + } = metadata; + + if (!nativeToken) throw new Error(`Missing native token for ${name}`); + + const chain: CosmosChain = { + chain_name: name, + chain_type: 'cosmos', + status: 'live', + network_type: isTestnet ? 'testnet' : 'mainnet', + pretty_name: displayName || name, + chain_id: chainId as string, + bech32_prefix: bech32Prefix!, + slip44: slip44!, + apis: { + rpc: [{ address: rpcUrls[0].http, provider: displayName || name }], + rest: restUrls + ? [{ address: restUrls[0].http, provider: displayName || name }] + : [], + }, + fees: { + fee_tokens: [{ denom: 'token' }], + }, + staking: { + staking_tokens: [{ denom: 'stake' }], + }, + }; + + const assets: AssetList = { + chain_name: name, + assets: [ + { + description: `The native token of ${displayName || name} chain.`, + denom_units: [{ denom: 'token', exponent: nativeToken.decimals }], + base: 'token', + name: 'token', + display: 'token', + symbol: 'token', + type_asset: 'sdk.coin', + }, + { + description: `The native token of ${displayName || name} chain.`, + denom_units: [{ denom: 'token', exponent: nativeToken.decimals }], + base: 'stake', + name: 'stake', + display: 'stake', + symbol: 'stake', + type_asset: 'sdk.coin', + }, + ], + }; + + return { chain, assets }; +} diff --git a/typescript/sdk/src/router/schemas.ts b/typescript/sdk/src/router/schemas.ts index 571cb0d1f5..19913aedbb 100644 --- a/typescript/sdk/src/router/schemas.ts +++ b/typescript/sdk/src/router/schemas.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; -import { ProxyFactoryFactoriesSchema } from '../deploy/schemas.js'; import { HookConfigSchema } from '../hook/schemas.js'; import { IsmConfigSchema } from '../ism/schemas.js'; import { ZHash } from '../metadata/customZodTypes.js'; @@ -10,7 +9,6 @@ export const MailboxClientConfigSchema = OwnableSchema.extend({ mailbox: ZHash, hook: HookConfigSchema.optional(), interchainSecurityModule: IsmConfigSchema.optional(), - ismFactoryAddresses: ProxyFactoryFactoriesSchema.optional(), }); export const ForeignDeploymentConfigSchema = z.object({ diff --git a/typescript/sdk/src/test/MockCoinGecko.ts b/typescript/sdk/src/test/MockCoinGecko.ts deleted file mode 100644 index 8b410125a3..0000000000 --- a/typescript/sdk/src/test/MockCoinGecko.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { SimplePriceResponse } from 'coingecko-api-v3'; - -import type { - CoinGeckoInterface, - CoinGeckoResponse, - CoinGeckoSimplePriceInterface, - CoinGeckoSimplePriceParams, -} from '../gas/token-prices.js'; -import type { ChainName } from '../types.js'; - -// A mock CoinGecko intended to be used by tests -export class MockCoinGecko implements CoinGeckoInterface { - // Prices keyed by coingecko id - private tokenPrices: Record; - // Whether or not to fail to return a response, keyed by coingecko id - private fail: Record; - - constructor() { - this.tokenPrices = {}; - this.fail = {}; - } - - price(input: CoinGeckoSimplePriceParams): CoinGeckoResponse { - const data: SimplePriceResponse = {}; - for (const id of input.ids) { - if (this.fail[id]) { - return Promise.reject(`Failed to fetch price for ${id}`); - } - data[id] = { - usd: this.tokenPrices[id], - }; - } - return Promise.resolve(data); - } - - get simplePrice(): CoinGeckoSimplePriceInterface { - return this.price; - } - - setTokenPrice(chain: ChainName, price: number): void { - this.tokenPrices[chain] = price; - } - - setFail(chain: ChainName, fail: boolean): void { - this.fail[chain] = fail; - } -} diff --git a/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts b/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts index 5895d783fc..7ed443eb6c 100644 --- a/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts +++ b/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts @@ -123,6 +123,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -151,6 +152,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -187,6 +189,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -219,6 +222,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -249,6 +253,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const { remoteRouters } = await evmERC20WarpModule.read(); expect(Object.keys(remoteRouters!).length).to.equal(numOfRouters); @@ -285,13 +290,14 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); for (const interchainSecurityModule of ismConfigToUpdate) { const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, + interchainSecurityModule, }; await sendTxs(await evmERC20WarpModule.update(expectedConfig)); @@ -316,6 +322,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); @@ -327,7 +334,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { }; const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, interchainSecurityModule, }; @@ -374,11 +380,11 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, interchainSecurityModule: { type: IsmType.ROUTING, owner: randomAddress(), @@ -415,6 +421,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const numOfRouters = Math.floor(Math.random() * 10); await sendTxs( @@ -446,6 +453,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const remoteRouters = randomRemoteRouters(1); await sendTxs( @@ -498,6 +506,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const currentConfig = await evmERC20WarpModule.read(); @@ -527,7 +536,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...baseConfig, type: TokenType.native, hook: hookAddress, - ismFactoryAddresses, }; const owner = signer.address.toLowerCase(); @@ -538,6 +546,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const currentConfig = await evmERC20WarpModule.read(); @@ -571,7 +580,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...baseConfig, type: TokenType.native, hook: hookAddress, - ismFactoryAddresses, remoteRouters: { [domain]: randomAddress(), }, @@ -584,6 +592,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...config, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); await sendTxs( await evmERC20WarpModule.update({ diff --git a/typescript/sdk/src/token/EvmERC20WarpModule.ts b/typescript/sdk/src/token/EvmERC20WarpModule.ts index 85ef112f07..729842fca4 100644 --- a/typescript/sdk/src/token/EvmERC20WarpModule.ts +++ b/typescript/sdk/src/token/EvmERC20WarpModule.ts @@ -6,7 +6,11 @@ import { TokenRouter__factory, } from '@hyperlane-xyz/core'; import { buildArtifact as coreBuildArtifact } from '@hyperlane-xyz/core/buildArtifact.js'; -import { ContractVerifier, ExplorerLicenseType } from '@hyperlane-xyz/sdk'; +import { + ContractVerifier, + ExplorerLicenseType, + HyperlaneAddresses, +} from '@hyperlane-xyz/sdk'; import { Address, Domain, @@ -15,7 +19,6 @@ import { addressToBytes32, assert, deepEquals, - eqAddress, isObjEmpty, objMap, rootLogger, @@ -26,6 +29,8 @@ import { HyperlaneModule, HyperlaneModuleParams, } from '../core/AbstractHyperlaneModule.js'; +import { ProxyFactoryFactories } from '../deploy/contracts.js'; +import { proxyAdminUpdateTxs } from '../deploy/proxy.js'; import { EvmIsmModule } from '../ism/EvmIsmModule.js'; import { DerivedIsmConfig } from '../ism/EvmIsmReader.js'; import { MultiProvider } from '../providers/MultiProvider.js'; @@ -40,7 +45,7 @@ import { TokenRouterConfig, TokenRouterConfigSchema } from './schemas.js'; export class EvmERC20WarpModule extends HyperlaneModule< ProtocolType.Ethereum, TokenRouterConfig, - { + HyperlaneAddresses & { deployedTokenRoute: Address; } > { @@ -56,7 +61,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< protected readonly multiProvider: MultiProvider, args: HyperlaneModuleParams< TokenRouterConfig, - { + HyperlaneAddresses & { deployedTokenRoute: Address; } >, @@ -67,6 +72,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< this.chainName = this.multiProvider.getChainName(args.chain); this.chainId = multiProvider.getEvmChainId(args.chain); this.domainId = multiProvider.getDomainId(args.chain); + this.chainId = multiProvider.getEvmChainId(args.chain); this.contractVerifier ??= new ContractVerifier( multiProvider, {}, @@ -112,7 +118,12 @@ export class EvmERC20WarpModule extends HyperlaneModule< ...this.createRemoteRoutersUpdateTxs(actualConfig, expectedConfig), ...this.createSetDestinationGasUpdateTxs(actualConfig, expectedConfig), ...this.createOwnershipUpdateTxs(actualConfig, expectedConfig), - ...this.updateProxyAdminOwnershipTxs(actualConfig, expectedConfig), + ...proxyAdminUpdateTxs( + this.chainId, + this.args.addresses.deployedTokenRoute, + actualConfig, + expectedConfig, + ), ); return transactions; @@ -236,36 +247,34 @@ export class EvmERC20WarpModule extends HyperlaneModule< return []; } - if (expectedConfig.ismFactoryAddresses) { - const actualDeployedIsm = ( - actualConfig.interchainSecurityModule as DerivedIsmConfig - ).address; - - // Try to update (may also deploy) Ism with the expected config - const { - deployedIsm: expectedDeployedIsm, - updateTransactions: ismUpdateTransactions, - } = await this.deployOrUpdateIsm(actualConfig, expectedConfig); - - // If an ISM is updated in-place, push the update txs - updateTransactions.push(...ismUpdateTransactions); - - // If a new ISM is deployed, push the setInterchainSecurityModule tx - if (actualDeployedIsm !== expectedDeployedIsm) { - const contractToUpdate = MailboxClient__factory.connect( - this.args.addresses.deployedTokenRoute, - this.multiProvider.getProvider(this.domainId), - ); - updateTransactions.push({ - chainId: this.chainId, - annotation: `Setting ISM for Warp Route to ${expectedDeployedIsm}`, - to: contractToUpdate.address, - data: contractToUpdate.interface.encodeFunctionData( - 'setInterchainSecurityModule', - [expectedDeployedIsm], - ), - }); - } + const actualDeployedIsm = ( + actualConfig.interchainSecurityModule as DerivedIsmConfig + ).address; + + // Try to update (may also deploy) Ism with the expected config + const { + deployedIsm: expectedDeployedIsm, + updateTransactions: ismUpdateTransactions, + } = await this.deployOrUpdateIsm(actualConfig, expectedConfig); + + // If an ISM is updated in-place, push the update txs + updateTransactions.push(...ismUpdateTransactions); + + // If a new ISM is deployed, push the setInterchainSecurityModule tx + if (actualDeployedIsm !== expectedDeployedIsm) { + const contractToUpdate = MailboxClient__factory.connect( + this.args.addresses.deployedTokenRoute, + this.multiProvider.getProvider(this.domainId), + ); + updateTransactions.push({ + chainId: this.chainId, + annotation: `Setting ISM for Warp Route to ${expectedDeployedIsm}`, + to: contractToUpdate.address, + data: contractToUpdate.interface.encodeFunctionData( + 'setInterchainSecurityModule', + [expectedDeployedIsm], + ), + }); } return updateTransactions; @@ -291,38 +300,6 @@ export class EvmERC20WarpModule extends HyperlaneModule< ); } - updateProxyAdminOwnershipTxs( - actualConfig: Readonly, - expectedConfig: Readonly, - ): AnnotatedEV5Transaction[] { - const transactions: AnnotatedEV5Transaction[] = []; - - // Return early because old warp config files did not have the - // proxyAdmin property - if (!expectedConfig.proxyAdmin) { - return transactions; - } - - const actualProxyAdmin = actualConfig.proxyAdmin!; - assert( - eqAddress(actualProxyAdmin.address!, expectedConfig.proxyAdmin.address!), - `ProxyAdmin contract addresses do not match. Expected ${expectedConfig.proxyAdmin.address}, got ${actualProxyAdmin.address}`, - ); - - transactions.push( - // Internally the createTransferOwnershipTx method already checks if the - // two owner values are the same and produces an empty tx batch if they are - ...transferOwnershipTransactions( - this.chainId, - actualProxyAdmin.address!, - actualProxyAdmin, - expectedConfig.proxyAdmin, - ), - ); - - return transactions; - } - /** * Updates or deploys the ISM using the provided configuration. * @@ -339,10 +316,6 @@ export class EvmERC20WarpModule extends HyperlaneModule< expectedConfig.interchainSecurityModule, 'Ism not derived correctly', ); - assert( - expectedConfig.ismFactoryAddresses, - 'Ism Factories addresses not provided', - ); const ismModule = new EvmIsmModule( this.multiProvider, @@ -350,7 +323,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< chain: this.args.chain, config: expectedConfig.interchainSecurityModule, addresses: { - ...expectedConfig.ismFactoryAddresses, + ...this.args.addresses, mailbox: expectedConfig.mailbox, deployedIsm: ( actualConfig.interchainSecurityModule as DerivedIsmConfig @@ -383,8 +356,15 @@ export class EvmERC20WarpModule extends HyperlaneModule< config: TokenRouterConfig; multiProvider: MultiProvider; contractVerifier?: ContractVerifier; + proxyFactoryFactories: HyperlaneAddresses; }): Promise { - const { chain, config, multiProvider, contractVerifier } = params; + const { + chain, + config, + multiProvider, + contractVerifier, + proxyFactoryFactories, + } = params; const chainName = multiProvider.getChainName(chain); const deployer = new HypERC20Deployer(multiProvider); const deployedContracts = await deployer.deployContracts(chainName, config); @@ -393,6 +373,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< multiProvider, { addresses: { + ...proxyFactoryFactories, deployedTokenRoute: deployedContracts[config.type].address, }, chain, diff --git a/typescript/sdk/src/token/IToken.ts b/typescript/sdk/src/token/IToken.ts index 28321597c5..d903e21e95 100644 --- a/typescript/sdk/src/token/IToken.ts +++ b/typescript/sdk/src/token/IToken.ts @@ -47,6 +47,10 @@ export const TokenConfigSchema = z.object({ .array(TokenConnectionConfigSchema) .optional() .describe('The list of token connections (e.g. warp or IBC)'), + coinGeckoId: z + .string() + .optional() + .describe('The CoinGecko id of the token, used for price lookups'), }); export type TokenArgs = Omit< diff --git a/typescript/sdk/src/token/Token.ts b/typescript/sdk/src/token/Token.ts index 527adc2b55..0217802e7c 100644 --- a/typescript/sdk/src/token/Token.ts +++ b/typescript/sdk/src/token/Token.ts @@ -24,6 +24,7 @@ import { TOKEN_NFT_STANDARDS, TOKEN_STANDARD_TO_PROTOCOL, TokenStandard, + XERC20_STANDARDS, } from './TokenStandard.js'; import { CwHypCollateralAdapter, @@ -39,6 +40,7 @@ import { } from './adapters/CosmosTokenAdapter.js'; import { EvmHypCollateralAdapter, + EvmHypCollateralFiatAdapter, EvmHypNativeAdapter, EvmHypSyntheticAdapter, EvmHypXERC20Adapter, @@ -191,13 +193,16 @@ export class Token implements IToken { }); } else if ( standard === TokenStandard.EvmHypCollateral || - standard === TokenStandard.EvmHypCollateralFiat || standard === TokenStandard.EvmHypOwnerCollateral || standard === TokenStandard.EvmHypRebaseCollateral ) { return new EvmHypCollateralAdapter(chainName, multiProvider, { token: addressOrDenom, }); + } else if (standard === TokenStandard.EvmHypCollateralFiat) { + return new EvmHypCollateralFiatAdapter(chainName, multiProvider, { + token: addressOrDenom, + }); } else if ( standard === TokenStandard.EvmHypSynthetic || standard === TokenStandard.EvmHypSyntheticRebase @@ -353,10 +358,18 @@ export class Token implements IToken { return Object.values(PROTOCOL_TO_NATIVE_STANDARD).includes(this.standard); } + isCollateralized(): boolean { + return TOKEN_COLLATERALIZED_STANDARDS.includes(this.standard); + } + isHypToken(): boolean { return TOKEN_HYP_STANDARDS.includes(this.standard); } + isXerc20(): boolean { + return XERC20_STANDARDS.includes(this.standard); + } + isIbcToken(): boolean { return this.standard === TokenStandard.CosmosIbc; } @@ -417,7 +430,7 @@ export class Token implements IToken { if (this.equals(token)) return true; - if (TOKEN_COLLATERALIZED_STANDARDS.includes(this.standard)) { + if (this.isCollateralized()) { if ( this.collateralAddressOrDenom && eqAddress(this.collateralAddressOrDenom, token.addressOrDenom) diff --git a/typescript/sdk/src/token/TokenStandard.ts b/typescript/sdk/src/token/TokenStandard.ts index ee434b7775..690096a43d 100644 --- a/typescript/sdk/src/token/TokenStandard.ts +++ b/typescript/sdk/src/token/TokenStandard.ts @@ -108,11 +108,13 @@ export const TOKEN_COLLATERALIZED_STANDARDS = [ TokenStandard.CwHypNative, ]; -export const MINT_LIMITED_STANDARDS = [ +export const XERC20_STANDARDS = [ TokenStandard.EvmHypXERC20, TokenStandard.EvmHypXERC20Lockbox, ]; +export const MINT_LIMITED_STANDARDS = [...XERC20_STANDARDS]; + export const TOKEN_HYP_STANDARDS = [ TokenStandard.EvmHypNative, TokenStandard.EvmHypCollateral, diff --git a/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.ts b/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.ts index 10f32e5b05..e472133bd8 100644 --- a/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.ts +++ b/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.ts @@ -90,6 +90,11 @@ export class CwNativeTokenAdapter ], }; } + + async getTotalSupply(): Promise { + // Not implemented. + return undefined; + } } export type CW20Metadata = TokenMetadata; @@ -172,6 +177,11 @@ export class CwTokenAdapter }, }); } + + async getTotalSupply(): Promise { + // Not implemented. + return undefined; + } } type TokenRouterResponse = @@ -274,6 +284,10 @@ export class CwHypSyntheticAdapter })); } + getBridgedSupply(): Promise { + return this.getTotalSupply(); + } + async quoteTransferRemoteGas( _destination: Domain, ): Promise { @@ -366,6 +380,10 @@ export class CwHypNativeAdapter return this.cw20adapter.getAllRouters(); } + getBridgedSupply(): Promise { + return this.getBalance(this.addresses.warpRouter); + } + quoteTransferRemoteGas(destination: Domain): Promise { return this.cw20adapter.quoteTransferRemoteGas(destination); } diff --git a/typescript/sdk/src/token/adapters/CosmosTokenAdapter.ts b/typescript/sdk/src/token/adapters/CosmosTokenAdapter.ts index 73f094b94e..06ea3dde10 100644 --- a/typescript/sdk/src/token/adapters/CosmosTokenAdapter.ts +++ b/typescript/sdk/src/token/adapters/CosmosTokenAdapter.ts @@ -61,6 +61,11 @@ export class CosmNativeTokenAdapter ): Promise { throw new Error('TODO not yet implemented'); } + + async getTotalSupply(): Promise { + // Not implemented. + return undefined; + } } // Interacts with native tokens on a Cosmos chain and adds support for IBC transfers @@ -103,6 +108,11 @@ export class CosmIbcTokenAdapter > { throw new Error('Method not applicable to IBC adapters'); } + + getBridgedSupply(): Promise { + throw new Error('Method not applicable to IBC adapters'); + } + async quoteTransferRemoteGas( _destination: Domain, ): Promise { diff --git a/typescript/sdk/src/token/adapters/EvmTokenAdapter.ts b/typescript/sdk/src/token/adapters/EvmTokenAdapter.ts index 885cdad2fd..cd9910a5a2 100644 --- a/typescript/sdk/src/token/adapters/EvmTokenAdapter.ts +++ b/typescript/sdk/src/token/adapters/EvmTokenAdapter.ts @@ -11,6 +11,7 @@ import { HypXERC20Lockbox, HypXERC20Lockbox__factory, HypXERC20__factory, + IXERC20, IXERC20__factory, } from '@hyperlane-xyz/core'; import { @@ -77,6 +78,11 @@ export class EvmNativeTokenAdapter const value = BigNumber.from(weiAmountOrId.toString()); return { value, to: recipient }; } + + async getTotalSupply(): Promise { + // Not implemented, native tokens don't have an accessible total supply + return undefined; + } } // Interacts with ERC20/721 contracts @@ -109,7 +115,7 @@ export class EvmTokenAdapter isNft ? 0 : this.contract.decimals(), this.contract.symbol(), this.contract.name(), - this.contract.totalSupply(), + this.getTotalSupply(), ]); return { decimals, symbol, name, totalSupply: totalSupply.toString() }; } @@ -142,6 +148,11 @@ export class EvmTokenAdapter weiAmountOrId.toString(), ); } + + async getTotalSupply(): Promise { + const totalSupply = await this.contract.totalSupply(); + return totalSupply.toBigInt(); + } } // Interacts with Hyp Synthetic token contracts (aka 'HypTokens') @@ -192,6 +203,10 @@ export class EvmHypSyntheticAdapter return domains.map((d, i) => ({ domain: d, address: routers[i] })); } + getBridgedSupply(): Promise { + return this.getTotalSupply(); + } + async quoteTransferRemoteGas( destination: Domain, ): Promise { @@ -246,14 +261,16 @@ export class EvmHypCollateralAdapter return this.wrappedTokenAddress!; } - protected async getWrappedTokenAdapter(): Promise< - ITokenAdapter - > { + protected async getWrappedTokenAdapter(): Promise { return new EvmTokenAdapter(this.chainName, this.multiProvider, { token: await this.getWrappedTokenAddress(), }); } + override getBridgedSupply(): Promise { + return this.getBalance(this.addresses.token); + } + override getMetadata(isNft?: boolean): Promise { return this.getWrappedTokenAdapter().then((t) => t.getMetadata(isNft)); } @@ -285,6 +302,21 @@ export class EvmHypCollateralAdapter } } +export class EvmHypCollateralFiatAdapter + extends EvmHypCollateralAdapter + implements IHypTokenAdapter +{ + /** + * Note this may be inaccurate, as this returns the total supply + * of the fiat token, which may be used by other bridges. + * However this is the best we can do with a simple view call. + */ + override async getBridgedSupply(): Promise { + const wrapped = await this.getWrappedTokenAdapter(); + return wrapped.getTotalSupply(); + } +} + // Interacts with HypXERC20Lockbox contracts export class EvmHypXERC20LockboxAdapter extends EvmHypCollateralAdapter @@ -305,26 +337,44 @@ export class EvmHypXERC20LockboxAdapter ); } - async getMintLimit(): Promise { - const xERC20 = await this.hypXERC20Lockbox.xERC20(); + /** + * Note this may be inaccurate, as this returns the balance + * of the lockbox contract, which may be used by other bridges. + * However this is the best we can do with a simple view call. + */ + override async getBridgedSupply(): Promise { + const lockboxAddress = await this.hypXERC20Lockbox.lockbox(); + return this.getBalance(lockboxAddress); + } - const limit = await IXERC20__factory.connect( - xERC20, - this.getProvider(), - ).mintingCurrentLimitOf(this.contract.address); + async getMintLimit(): Promise { + const xERC20 = await this.getXErc20(); + const limit = await xERC20.mintingCurrentLimitOf(this.contract.address); + return limit.toBigInt(); + } - return BigInt(limit.toString()); + async getMintMaxLimit(): Promise { + const xERC20 = await this.getXErc20(); + const limit = await xERC20.mintingMaxLimitOf(this.contract.address); + return limit.toBigInt(); } async getBurnLimit(): Promise { - const xERC20 = await this.hypXERC20Lockbox.xERC20(); + const xERC20 = await this.getXErc20(); + const limit = await xERC20.burningCurrentLimitOf(this.contract.address); + return limit.toBigInt(); + } - const limit = await IXERC20__factory.connect( - xERC20, - this.getProvider(), - ).mintingCurrentLimitOf(this.contract.address); + async getBurnMaxLimit(): Promise { + const xERC20 = await this.getXErc20(); + const limit = await xERC20.burningMaxLimitOf(this.contract.address); + return limit.toBigInt(); + } + + async getXErc20(): Promise { + const xERC20 = await this.hypXERC20Lockbox.xERC20(); - return BigInt(limit.toString()); + return IXERC20__factory.connect(xERC20, this.getProvider()); } } @@ -348,26 +398,47 @@ export class EvmHypXERC20Adapter ); } - async getMintLimit(): Promise { - const xERC20 = await this.hypXERC20.wrappedToken(); + /** + * Note this may be inaccurate, as this returns the total supply + * of the xERC20 contract, which may be used by other bridges. + * However this is the best we can do with a simple view call. + */ + override async getBridgedSupply(): Promise { + const xerc20TokenAddress = await this.hypXERC20.wrappedToken(); + const xerc20 = new EvmTokenAdapter(this.chainName, this.multiProvider, { + token: xerc20TokenAddress, + }); + return xerc20.getTotalSupply(); + } - const limit = await IXERC20__factory.connect( - xERC20, - this.getProvider(), - ).mintingCurrentLimitOf(this.contract.address); + async getMintLimit(): Promise { + const xERC20 = await this.getXErc20(); + const limit = await xERC20.mintingCurrentLimitOf(this.contract.address); + return limit.toBigInt(); + } - return BigInt(limit.toString()); + async getMintMaxLimit(): Promise { + const xERC20 = await this.getXErc20(); + const limit = await xERC20.mintingMaxLimitOf(this.contract.address); + return limit.toBigInt(); } async getBurnLimit(): Promise { - const xERC20 = await this.hypXERC20.wrappedToken(); + const xERC20 = await this.getXErc20(); + const limit = await xERC20.burningCurrentLimitOf(this.contract.address); + return limit.toBigInt(); + } - const limit = await IXERC20__factory.connect( - xERC20, - this.getProvider(), - ).burningCurrentLimitOf(this.contract.address); + async getBurnMaxLimit(): Promise { + const xERC20 = await this.getXErc20(); + const limit = await xERC20.burningMaxLimitOf(this.contract.address); + return limit.toBigInt(); + } + + async getXErc20(): Promise { + const xERC20 = await this.hypXERC20.wrappedToken(); - return BigInt(limit.toString()); + return IXERC20__factory.connect(xERC20, this.getProvider()); } } diff --git a/typescript/sdk/src/token/adapters/ITokenAdapter.ts b/typescript/sdk/src/token/adapters/ITokenAdapter.ts index f0a8032d55..d989fb7091 100644 --- a/typescript/sdk/src/token/adapters/ITokenAdapter.ts +++ b/typescript/sdk/src/token/adapters/ITokenAdapter.ts @@ -23,6 +23,7 @@ export interface InterchainGasQuote { export interface ITokenAdapter { getBalance(address: Address): Promise; + getTotalSupply(): Promise; getMetadata(isNft?: boolean): Promise; isApproveRequired( owner: Address, @@ -37,11 +38,15 @@ export interface IHypTokenAdapter extends ITokenAdapter { getDomains(): Promise; getRouterAddress(domain: Domain): Promise; getAllRouters(): Promise>; + getBridgedSupply(): Promise; quoteTransferRemoteGas(destination: Domain): Promise; populateTransferRemoteTx(p: TransferRemoteParams): Promise; } export interface IHypXERC20Adapter extends IHypTokenAdapter { getMintLimit(): Promise; + getMintMaxLimit(): Promise; + getBurnLimit(): Promise; + getBurnMaxLimit(): Promise; } diff --git a/typescript/sdk/src/token/adapters/SealevelTokenAdapter.ts b/typescript/sdk/src/token/adapters/SealevelTokenAdapter.ts index 1df0d86375..788fa5f91e 100644 --- a/typescript/sdk/src/token/adapters/SealevelTokenAdapter.ts +++ b/typescript/sdk/src/token/adapters/SealevelTokenAdapter.ts @@ -113,6 +113,11 @@ export class SealevelNativeTokenAdapter }), ); } + + async getTotalSupply(): Promise { + // Not implemented. + return undefined; + } } // Interacts with SPL token programs @@ -190,6 +195,13 @@ export class SealevelTokenAdapter this.getTokenProgramId(), ); } + + async getTotalSupply(): Promise { + const response = await this.getProvider().getTokenSupply( + this.tokenMintPubKey, + ); + return BigInt(response.value.amount); + } } interface HypTokenAddresses { @@ -266,6 +278,11 @@ export abstract class SealevelHypTokenAdapter })); } + // Intended to be overridden by subclasses + async getBridgedSupply(): Promise { + return undefined; + } + async quoteTransferRemoteGas( _destination: Domain, ): Promise { @@ -581,6 +598,10 @@ export class SealevelHypNativeAdapter extends SealevelHypTokenAdapter { return this.wrappedNative.getBalance(owner); } + override async getBridgedSupply(): Promise { + return this.getBalance(this.addresses.warpRouter); + } + override async getMetadata(): Promise { return this.wrappedNative.getMetadata(); } @@ -632,6 +653,10 @@ export class SealevelHypCollateralAdapter extends SealevelHypTokenAdapter { return super.getBalance(owner); } + override async getBridgedSupply(): Promise { + return this.getBalance(this.addresses.warpRouter); + } + override getTransferInstructionKeyList( params: KeyListParams, ): Array { @@ -697,6 +722,10 @@ export class SealevelHypSyntheticAdapter extends SealevelHypTokenAdapter { } } + override async getBridgedSupply(): Promise { + return this.getTotalSupply(); + } + async getTotalSupply(): Promise { const response = await this.getProvider().getTokenSupply( this.tokenMintPubKey, diff --git a/typescript/sdk/src/utils/schemas.ts b/typescript/sdk/src/utils/schemas.ts index 2babea6c0e..22de9ad0b5 100644 --- a/typescript/sdk/src/utils/schemas.ts +++ b/typescript/sdk/src/utils/schemas.ts @@ -1,6 +1,20 @@ -import { z } from 'zod'; +import { SafeParseReturnType, z } from 'zod'; + +import { rootLogger } from '@hyperlane-xyz/utils'; export function isCompliant(schema: S) { return (config: unknown): config is z.infer => schema.safeParse(config).success; } + +export function validateZodResult( + result: SafeParseReturnType, + desc: string = 'config', +): T { + if (!result.success) { + rootLogger.warn(`Invalid ${desc}`, result.error); + throw new Error(`Invalid desc: ${result.error.toString()}`); + } else { + return result.data; + } +} diff --git a/typescript/sdk/src/utils/wagmi.ts b/typescript/sdk/src/utils/wagmi.ts deleted file mode 100644 index 62c3de3434..0000000000 --- a/typescript/sdk/src/utils/wagmi.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { Chain as WagmiChain } from '@wagmi/chains'; - -import { test1 } from '../consts/testChains.js'; -import { - ChainMetadata, - getChainIdNumber, -} from '../metadata/chainMetadataTypes.js'; - -export function chainMetadataToWagmiChain(metadata: ChainMetadata): WagmiChain { - return { - id: getChainIdNumber(metadata), - name: metadata.displayName || metadata.name, - network: metadata.name, - nativeCurrency: metadata.nativeToken || test1.nativeToken!, - rpcUrls: { - public: { http: [metadata.rpcUrls[0].http] }, - default: { http: [metadata.rpcUrls[0].http] }, - }, - blockExplorers: metadata.blockExplorers?.length - ? { - default: { - name: metadata.blockExplorers[0].name, - url: metadata.blockExplorers[0].url, - }, - } - : undefined, - testnet: !!metadata.isTestnet, - }; -} diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index 2c407fb6b8..9d852ab866 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,22 @@ # @hyperlane-xyz/utils +## 7.1.0 + +### Minor Changes + +- 0e285a443: Add an isRelativeUrl function + +## 7.0.0 + +### Major Changes + +- f48cf8766: Upgrade Viem to 2.2 and Solana Web3 to 1.9 + Rename `chainMetadataToWagmiChain` to `chainMetadataToViemChain` + +### Patch Changes + +- e6f9d5c4f: Added a mustGet helper + ## 6.0.0 ### Major Changes diff --git a/typescript/utils/package.json b/typescript/utils/package.json index fd4439a3aa..43aa0ef270 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": "6.0.0", + "version": "7.1.0", "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.78.0", diff --git a/typescript/utils/src/async.test.ts b/typescript/utils/src/async.test.ts index 004abb1d18..74a830c0cd 100644 --- a/typescript/utils/src/async.test.ts +++ b/typescript/utils/src/async.test.ts @@ -17,7 +17,7 @@ describe('Async Utilities', () => { const start = Date.now(); await sleep(100); const duration = Date.now() - start; - expect(duration).to.be.at.least(100); + expect(duration).to.be.at.least(95); expect(duration).to.be.lessThan(200); }); }); diff --git a/typescript/utils/src/index.ts b/typescript/utils/src/index.ts index 0907631cae..ff226449fe 100644 --- a/typescript/utils/src/index.ts +++ b/typescript/utils/src/index.ts @@ -120,6 +120,7 @@ export { objMapEntries, objMerge, objOmit, + objOmitKeys, pick, promiseObjAll, stringifyObject, @@ -169,7 +170,7 @@ export { TokenCaip19Id, WithAddress, } from './types.js'; -export { isHttpsUrl, isUrl } from './url.js'; +export { isHttpsUrl, isRelativeUrl, isUrl } from './url.js'; export { assert } from './validation.js'; export { BaseValidator, ValidatorConfig } from './validator.js'; export { tryParseJsonOrYaml } from './yaml.js'; diff --git a/typescript/utils/src/objects.ts b/typescript/utils/src/objects.ts index 6446f9736a..97d9d99db6 100644 --- a/typescript/utils/src/objects.ts +++ b/typescript/utils/src/objects.ts @@ -190,6 +190,13 @@ export function objOmit = any>( return ret as T; } +export function objOmitKeys = any>( + obj: Record, + keys: string[], +): Partial { + return objFilter(obj, (k, _v): _v is any => !keys.includes(k)) as Partial; +} + export function invertKeysAndValues(data: any) { return Object.fromEntries( Object.entries(data) diff --git a/typescript/utils/src/url.test.ts b/typescript/utils/src/url.test.ts new file mode 100644 index 0000000000..d64c8d9f53 --- /dev/null +++ b/typescript/utils/src/url.test.ts @@ -0,0 +1,32 @@ +import { expect } from 'chai'; + +import { isHttpsUrl, isRelativeUrl, isUrl } from './url.js'; + +describe('URL Utilities', () => { + it('isUrl', () => { + expect(isUrl(undefined)).to.be.false; + expect(isUrl(null)).to.be.false; + expect(isUrl('')).to.be.false; + expect(isUrl('foobar')).to.be.false; + expect(isUrl('https://hyperlane.xyz')).to.be.true; + }); + + it('isHttpsUrl', () => { + expect(isHttpsUrl(undefined)).to.be.false; + expect(isHttpsUrl(null)).to.be.false; + expect(isHttpsUrl('')).to.be.false; + expect(isHttpsUrl('foobar')).to.be.false; + expect(isHttpsUrl('http://hyperlane.xyz')).to.be.false; + expect(isHttpsUrl('https://hyperlane.xyz')).to.be.true; + }); + + it('isRelativeUrl', () => { + expect(isRelativeUrl(undefined)).to.be.false; + expect(isRelativeUrl(null)).to.be.false; + expect(isRelativeUrl('')).to.be.false; + expect(isRelativeUrl('foobar')).to.be.false; + expect(isRelativeUrl('https://hyperlane.xyz')).to.be.false; + expect(isRelativeUrl('/foobar')).to.be.true; + expect(isRelativeUrl('/foo/bar', 'https://hyperlane.xyz')).to.be.true; + }); +}); diff --git a/typescript/utils/src/url.ts b/typescript/utils/src/url.ts index e1cca81ffc..98f9ee412d 100644 --- a/typescript/utils/src/url.ts +++ b/typescript/utils/src/url.ts @@ -1,5 +1,6 @@ -export function isUrl(value: string) { +export function isUrl(value?: string | null) { try { + if (!value) return false; const url = new URL(value); return !!url.hostname; } catch (error) { @@ -7,11 +8,22 @@ export function isUrl(value: string) { } } -export function isHttpsUrl(value: string) { +export function isHttpsUrl(value?: string | null) { try { + if (!value) return false; const url = new URL(value); return url.protocol === 'https:'; } catch (error) { return false; } } + +export function isRelativeUrl(value?: string | null, base?: string): boolean { + try { + if (!value || !value.startsWith('/')) return false; + const url = new URL(value, base || 'https://hyperlane.xyz'); + return !!url.pathname; + } catch { + return false; + } +} diff --git a/typescript/widgets/.eslintrc b/typescript/widgets/.eslintrc index 42933a0cc7..9041f842f6 100644 --- a/typescript/widgets/.eslintrc +++ b/typescript/widgets/.eslintrc @@ -1,6 +1,20 @@ { + "extends": [ + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "prettier" + ], + "plugins": ["react", "react-hooks"], "rules": { - // TODO use utils rootLogger in widgets lib - "no-console": ["off"] + "react/react-in-jsx-scope": "off", + "react/prop-types": "off", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn" + }, + "settings": { + "react": { + "version": "18", + "defaultVersion": "18" + } } } diff --git a/typescript/widgets/.storybook/main.ts b/typescript/widgets/.storybook/main.ts index 2afe9d3981..b14ff0a597 100644 --- a/typescript/widgets/.storybook/main.ts +++ b/typescript/widgets/.storybook/main.ts @@ -1,3 +1,4 @@ +import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'; import type { StorybookConfig } from '@storybook/react-vite'; import { mergeConfig } from 'vite'; @@ -9,6 +10,11 @@ const config: StorybookConfig = { '@storybook/addon-onboarding', '@storybook/addon-interactions', ], + refs: { + '@chakra-ui/react': { + disable: true, + }, + }, framework: { name: '@storybook/react-vite', options: {}, @@ -19,6 +25,15 @@ const config: StorybookConfig = { async viteFinal(config, { configType }) { return mergeConfig(config, { define: { 'process.env': {} }, + optimizeDeps: { + esbuildOptions: { + plugins: [ + NodeGlobalsPolyfillPlugin({ + buffer: true, + }), + ], + }, + }, }); }, }; diff --git a/typescript/widgets/CHANGELOG.md b/typescript/widgets/CHANGELOG.md index 1195f5a4e6..bcfbecee33 100644 --- a/typescript/widgets/CHANGELOG.md +++ b/typescript/widgets/CHANGELOG.md @@ -1,5 +1,47 @@ # @hyperlane-xyz/widgets +## 7.1.0 + +### Minor Changes + +- 0cd65c571: Add multi-protocol wallet integration hooks and types +- 186663505: New Icons + Updated modal with new props + Updated storybook for modal and icon list +- 0e285a443: Add various utility hooks: useIsSsr, useTimeout, useDebounce, useInterval +- 92b5fe777: Props and style update: IconButton and Tooltip + New Icons: XCircleIcon and SwapIcon + +### Patch Changes + +- 794501ba6: Prevent propagation of form submissions from ChainSearchMenu +- Updated dependencies [6f2d50fbd] +- Updated dependencies [1159e0f4b] +- Updated dependencies [0e285a443] +- Updated dependencies [ff2b4e2fb] +- Updated dependencies [0e285a443] +- Updated dependencies [5db46bd31] +- Updated dependencies [0cd65c571] + - @hyperlane-xyz/sdk@7.1.0 + - @hyperlane-xyz/utils@7.1.0 + +## 7.0.0 + +### Patch Changes + +- Updated dependencies [bbb970a44] +- Updated dependencies [fa424826c] +- Updated dependencies [f48cf8766] +- Updated dependencies [40d59a2f4] +- Updated dependencies [0264f709e] +- Updated dependencies [836060240] +- Updated dependencies [ba0122279] +- Updated dependencies [e6f9d5c4f] +- Updated dependencies [f24835438] +- Updated dependencies [5f41b1134] + - @hyperlane-xyz/sdk@7.0.0 + - @hyperlane-xyz/utils@7.0.0 + ## 6.0.0 ### Major Changes diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index 9a08861a6f..8a4331ef0c 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -1,20 +1,32 @@ { "name": "@hyperlane-xyz/widgets", "description": "Common react components for Hyperlane projects", - "version": "6.0.0", + "version": "7.1.0", "peerDependencies": { "react": "^18", "react-dom": "^18" }, "dependencies": { + "@cosmos-kit/react": "^2.18.0", "@headlessui/react": "^2.1.8", - "@hyperlane-xyz/sdk": "6.0.0", - "@hyperlane-xyz/utils": "6.0.0", + "@hyperlane-xyz/sdk": "7.1.0", + "@hyperlane-xyz/utils": "7.1.0", + "@interchain-ui/react": "^1.23.28", + "@rainbow-me/rainbowkit": "^2.2.0", + "@solana/wallet-adapter-react": "^0.15.32", + "@solana/wallet-adapter-react-ui": "^0.9.31", + "@solana/web3.js": "^1.95.4", "clsx": "^2.1.1", - "react-tooltip": "^5.28.0" + "react-tooltip": "^5.28.0", + "viem": "^2.21.41", + "wagmi": "^2.12.26" }, "devDependencies": { - "@hyperlane-xyz/registry": "4.7.0", + "@chakra-ui/react": "^2.8.2", + "@cosmjs/cosmwasm-stargate": "^0.32.4", + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@hyperlane-xyz/registry": "6.1.0", "@storybook/addon-essentials": "^7.6.14", "@storybook/addon-interactions": "^7.6.14", "@storybook/addon-links": "^7.6.14", @@ -23,6 +35,7 @@ "@storybook/react": "^7.6.14", "@storybook/react-vite": "^7.6.14", "@storybook/test": "^7.6.14", + "@tanstack/react-query": "^5.59.20", "@types/node": "^18.11.18", "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", @@ -32,7 +45,10 @@ "babel-loader": "^8.3.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-storybook": "^0.6.15", + "framer-motion": "^10.16.4", "postcss": "^8.4.21", "prettier": "^2.8.8", "react": "^18.2.0", @@ -70,7 +86,7 @@ "build:ts": "tsc", "build:css": "tailwindcss -c ./tailwind.config.cjs -i ./src/styles.css -o ./dist/styles.css --minify", "clean": "rm -rf ./dist ./cache ./storybook-static", - "lint": "eslint ./src --ext .ts", + "lint": "eslint ./src --ext '.ts,.tsx'", "prettier": "prettier --write ./src", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" diff --git a/typescript/widgets/src/chains/ChainAddMenu.tsx b/typescript/widgets/src/chains/ChainAddMenu.tsx index 102b1bf5e1..9b3c4065c0 100644 --- a/typescript/widgets/src/chains/ChainAddMenu.tsx +++ b/typescript/widgets/src/chains/ChainAddMenu.tsx @@ -21,6 +21,7 @@ import { CopyButton } from '../components/CopyButton.js'; import { LinkButton } from '../components/LinkButton.js'; import { ChevronIcon } from '../icons/Chevron.js'; import { PlusIcon } from '../icons/Plus.js'; +import { widgetLogger } from '../logger.js'; export interface ChainAddMenuProps { chainMetadata: ChainMap; @@ -143,7 +144,7 @@ function tryParseMetadataInput( const result = ChainMetadataSchema.safeParse(parsed.data); if (!result.success) { - console.error('Error validating chain config', result.error); + widgetLogger.error('Error validating chain config', result.error); const firstIssue = result.error.issues[0]; return failure(`${firstIssue.path} => ${firstIssue.message}`); } diff --git a/typescript/widgets/src/chains/ChainLogo.tsx b/typescript/widgets/src/chains/ChainLogo.tsx index 082c8eaf3f..0f58c66f1b 100644 --- a/typescript/widgets/src/chains/ChainLogo.tsx +++ b/typescript/widgets/src/chains/ChainLogo.tsx @@ -4,6 +4,7 @@ import type { IRegistry } from '@hyperlane-xyz/registry'; import { Circle } from '../icons/Circle.js'; import { QuestionMarkIcon } from '../icons/QuestionMark.js'; +import { widgetLogger } from '../logger.js'; type SvgIcon = (props: { width: number; @@ -41,8 +42,8 @@ export function ChainLogo({ registry .getChainLogoUri(chainName) .then((uri) => uri && setSvgLogos({ ...svgLogos, [chainName]: uri })) - .catch((err) => console.error(err)); - }, [chainName, registry, svgLogos, Icon]); + .catch((err) => widgetLogger.error('Error fetching log uri', err)); + }, [chainName, logoUri, registry, svgLogos, Icon]); if (!uri && !Icon) { return ( diff --git a/typescript/widgets/src/chains/ChainSearchMenu.tsx b/typescript/widgets/src/chains/ChainSearchMenu.tsx index 3d88152f5d..59532e9f6d 100644 --- a/typescript/widgets/src/chains/ChainSearchMenu.tsx +++ b/typescript/widgets/src/chains/ChainSearchMenu.tsx @@ -89,7 +89,7 @@ export function ChainSearchMenu({ overrideChainMetadata, ); return { mergedMetadata, listData: Object.values(mergedMetadata) }; - }, [chainMetadata]); + }, [chainMetadata, overrideChainMetadata]); const { ListComponent, searchFn, sortOptions, defaultSortState } = useCustomizedListItems(customListItemField, defaultSortField); @@ -297,7 +297,7 @@ function useCustomizedListItems( ({ data }: { data: ChainMetadata<{ disabled?: boolean }> }) => ( ), - [ChainListItem, customListItemField], + [customListItemField], ); // Bind the custom field to the search function diff --git a/typescript/widgets/src/components/ErrorBoundary.tsx b/typescript/widgets/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000000..79a7ce15e2 --- /dev/null +++ b/typescript/widgets/src/components/ErrorBoundary.tsx @@ -0,0 +1,48 @@ +import React, { Component, PropsWithChildren, ReactNode } from 'react'; + +import { errorToString } from '@hyperlane-xyz/utils'; + +import { ErrorIcon } from '../icons/Error.js'; +import { widgetLogger } from '../logger.js'; + +type Props = PropsWithChildren<{ + supportLink?: ReactNode; +}>; + +interface State { + error: any; + errorInfo: any; +} + +export class ErrorBoundary extends Component { + constructor(props: Props) { + super(props); + this.state = { error: null, errorInfo: null }; + } + + componentDidCatch(error: any, errorInfo: any) { + this.setState({ + error, + errorInfo, + }); + widgetLogger.error('Error caught by error boundary', error, errorInfo); + } + + render() { + const errorInfo = this.state.error || this.state.errorInfo; + if (errorInfo) { + const details = errorToString(errorInfo, 1000); + return ( +
+
+ +

Fatal Error Occurred

+
{details}
+ {this.props.supportLink} +
+
+ ); + } + return this.props.children; + } +} diff --git a/typescript/widgets/src/components/IconButton.tsx b/typescript/widgets/src/components/IconButton.tsx index bc515ee7e6..314ba40fa4 100644 --- a/typescript/widgets/src/components/IconButton.tsx +++ b/typescript/widgets/src/components/IconButton.tsx @@ -7,17 +7,17 @@ type Props = PropsWithChildren> & { }; export function IconButton(props: Props) { - const { className, children, ...rest } = props; + const { className, children, type, ...rest } = props; const base = 'htw-flex htw-items-center htw-justify-center htw-transition-all'; - const onHover = 'hover:htw-opacity-70 hover:htw-scale-105'; + const onHover = 'hover:htw-opacity-70'; const onDisabled = 'disabled:htw-opacity-30 disabled:htw-cursor-default'; const onActive = 'active:htw-opacity-60'; const allClasses = clsx(base, onHover, onDisabled, onActive, className); return ( - ); diff --git a/typescript/widgets/src/components/SearchMenu.tsx b/typescript/widgets/src/components/SearchMenu.tsx index 831b46e748..44c1c2c79f 100644 --- a/typescript/widgets/src/components/SearchMenu.tsx +++ b/typescript/widgets/src/components/SearchMenu.tsx @@ -102,12 +102,13 @@ export function SearchMenu< const handleSubmit = useCallback( (e: React.FormEvent) => { e.preventDefault(); + e.stopPropagation(); if (results.length === 1) { const item = results[0]; isEditMode ? onClickEditItem(item) : onClickItem(item); } }, - [results, isEditMode], + [results, isEditMode, onClickEditItem, onClickItem], ); useEffect(() => { @@ -254,6 +255,7 @@ function SortDropdown({ buttonClassname="htw-flex htw-items-stretch hover:htw-bg-gray-100 active:htw-scale-95" menuClassname="htw-py-1.5 htw-px-2 htw-flex htw-flex-col htw-gap-2 htw-text-sm htw-border htw-border-gray-100" menuItems={options.map((o) => ( + // eslint-disable-next-line react/jsx-key
onSetSortBy(o)} @@ -298,7 +300,7 @@ function FilterDropdown({ (k) => !deepEquals(value[k], defaultValue[k]), ); return modifiedKeys.map((k) => value[k]); - }, [value]); + }, [value, defaultValue]); const hasFilters = filterValues.length > 0; const onClear = () => { diff --git a/typescript/widgets/src/components/Tooltip.tsx b/typescript/widgets/src/components/Tooltip.tsx index 24c591132d..e62c46816a 100644 --- a/typescript/widgets/src/components/Tooltip.tsx +++ b/typescript/widgets/src/components/Tooltip.tsx @@ -1,5 +1,5 @@ import React, { AnchorHTMLAttributes } from 'react'; -import { Tooltip as ReactTooltip } from 'react-tooltip'; +import { PlacesType, Tooltip as ReactTooltip } from 'react-tooltip'; import { Circle } from '../icons/Circle.js'; import { QuestionMarkIcon } from '../icons/QuestionMark.js'; @@ -8,12 +8,26 @@ type Props = AnchorHTMLAttributes & { id: string; content: string; size?: number; + placement?: PlacesType; }; -export function Tooltip({ id, content, size = 16, ...rest }: Props) { +export function Tooltip({ + id, + content, + size = 16, + className, + placement = 'top-start', + ...rest +}: Props) { return ( <> - + + + + ); +} + +export const EllipsisIcon = memo(_EllipsisIcon); diff --git a/typescript/widgets/src/icons/Error.tsx b/typescript/widgets/src/icons/Error.tsx new file mode 100644 index 0000000000..3a667c2a10 --- /dev/null +++ b/typescript/widgets/src/icons/Error.tsx @@ -0,0 +1,18 @@ +import React, { memo } from 'react'; + +import { ColorPalette } from '../color.js'; + +import { DefaultIconProps } from './types.js'; + +function _Error({ color, ...rest }: DefaultIconProps) { + return ( + + + + ); +} + +export const ErrorIcon = memo(_Error); diff --git a/typescript/widgets/src/icons/Logout.tsx b/typescript/widgets/src/icons/Logout.tsx new file mode 100644 index 0000000000..4832f7c2a0 --- /dev/null +++ b/typescript/widgets/src/icons/Logout.tsx @@ -0,0 +1,29 @@ +import React, { memo } from 'react'; + +import { ColorPalette } from '../color.js'; + +import { DefaultIconProps } from './types.js'; + +function _LogoutIcon({ + color = ColorPalette.Black, + width = 48, + height = 48, + ...rest +}: DefaultIconProps) { + return ( + + + + ); +} + +export const LogoutIcon = memo(_LogoutIcon); diff --git a/typescript/widgets/src/icons/Swap.tsx b/typescript/widgets/src/icons/Swap.tsx new file mode 100644 index 0000000000..3c8e1400cd --- /dev/null +++ b/typescript/widgets/src/icons/Swap.tsx @@ -0,0 +1,18 @@ +import React, { memo } from 'react'; + +import { ColorPalette } from '../color.js'; + +import { DefaultIconProps } from './types.js'; + +function _SwapIcon({ color = ColorPalette.Black, ...rest }: DefaultIconProps) { + return ( + + + + ); +} + +export const SwapIcon = memo(_SwapIcon); diff --git a/typescript/widgets/src/icons/Warning.tsx b/typescript/widgets/src/icons/Warning.tsx new file mode 100644 index 0000000000..cc60aac5f7 --- /dev/null +++ b/typescript/widgets/src/icons/Warning.tsx @@ -0,0 +1,30 @@ +import React, { memo } from 'react'; + +import { ColorPalette } from '../color.js'; + +import { DefaultIconProps } from './types.js'; + +function _WarningIcon({ + color = ColorPalette.Black, + width = 18, + height = 16, + ...rest +}: DefaultIconProps) { + return ( + + + + ); +} + +export const WarningIcon = memo(_WarningIcon); diff --git a/typescript/widgets/src/icons/Web.tsx b/typescript/widgets/src/icons/Web.tsx index 8915ed026d..228087f5cd 100644 --- a/typescript/widgets/src/icons/Web.tsx +++ b/typescript/widgets/src/icons/Web.tsx @@ -57,9 +57,9 @@ function _Web({ color = ColorPalette.Black, ...rest }: DefaultIconProps) { /> ); diff --git a/typescript/widgets/src/icons/XCircle.tsx b/typescript/widgets/src/icons/XCircle.tsx new file mode 100644 index 0000000000..b5b400ae27 --- /dev/null +++ b/typescript/widgets/src/icons/XCircle.tsx @@ -0,0 +1,25 @@ +import React, { memo } from 'react'; + +import { ColorPalette } from '../color.js'; + +import { DefaultIconProps } from './types.js'; + +function _XCircleIcon({ + color = ColorPalette.Black, + ...rest +}: DefaultIconProps) { + return ( + + + + + ); +} + +export const XCircleIcon = memo(_XCircleIcon); diff --git a/typescript/widgets/src/index.ts b/typescript/widgets/src/index.ts index 2bb43315c8..655e3c1731 100644 --- a/typescript/widgets/src/index.ts +++ b/typescript/widgets/src/index.ts @@ -12,6 +12,7 @@ export { ColorPalette, seedToBgColor } from './color.js'; export { Button } from './components/Button.js'; export { CopyButton } from './components/CopyButton.js'; export { DatetimeField } from './components/DatetimeField.js'; +export { ErrorBoundary } from './components/ErrorBoundary.js'; export { IconButton } from './components/IconButton.js'; export { LinkButton } from './components/LinkButton.js'; export { SegmentedControl } from './components/SegmentedControl.js'; @@ -28,7 +29,9 @@ export { Circle } from './icons/Circle.js'; export { CopyIcon } from './icons/Copy.js'; export { DiscordIcon } from './icons/Discord.js'; export { DocsIcon } from './icons/Docs.js'; +export { EllipsisIcon } from './icons/Ellipsis.js'; export { EnvelopeIcon } from './icons/Envelope.js'; +export { ErrorIcon } from './icons/Error.js'; export { FilterIcon } from './icons/Filter.js'; export { FunnelIcon } from './icons/Funnel.js'; export { GearIcon } from './icons/Gear.js'; @@ -36,6 +39,7 @@ export { GithubIcon } from './icons/Github.js'; export { HistoryIcon } from './icons/History.js'; export { LinkedInIcon } from './icons/LinkedIn.js'; export { LockIcon } from './icons/Lock.js'; +export { LogoutIcon } from './icons/Logout.js'; export { MediumIcon } from './icons/Medium.js'; export { PencilIcon } from './icons/Pencil.js'; export { PlusIcon } from './icons/Plus.js'; @@ -44,17 +48,25 @@ export { QuestionMarkIcon } from './icons/QuestionMark.js'; export { SearchIcon } from './icons/Search.js'; export { ShieldIcon } from './icons/Shield.js'; export { SpinnerIcon } from './icons/Spinner.js'; +export { SwapIcon } from './icons/Swap.js'; export { TwitterIcon } from './icons/Twitter.js'; +export { type DefaultIconProps } from './icons/types.js'; export { UpDownArrowsIcon } from './icons/UpDownArrows.js'; export { WalletIcon } from './icons/Wallet.js'; +export { WarningIcon } from './icons/Warning.js'; export { WebIcon } from './icons/Web.js'; export { WideChevronIcon } from './icons/WideChevron.js'; export { XIcon } from './icons/X.js'; -export { type DefaultIconProps } from './icons/types.js'; +export { XCircleIcon } from './icons/XCircle.js'; export { DropdownMenu, type DropdownMenuProps } from './layout/DropdownMenu.js'; export { Modal, useModal, type ModalProps } from './layout/Modal.js'; export { Popover, type PopoverProps } from './layout/Popover.js'; +export { CosmosLogo } from './logos/Cosmos.js'; +export { EthereumLogo } from './logos/Ethereum.js'; export { HyperlaneLogo } from './logos/Hyperlane.js'; +export { PROTOCOL_TO_LOGO } from './logos/protocols.js'; +export { SolanaLogo } from './logos/Solana.js'; +export { WalletConnectLogo } from './logos/WalletConnect.js'; export { MessageTimeline } from './messages/MessageTimeline.js'; export { MessageStage, @@ -70,4 +82,66 @@ export { tryClipboardGet, tryClipboardSet, } from './utils/clipboard.js'; +export { useDebounce } from './utils/debounce.js'; +export { useIsSsr } from './utils/ssr.js'; +export { useInterval, useTimeout } from './utils/timeout.js'; export { useConnectionHealthTest } from './utils/useChainConnectionTest.js'; +export { + AccountList, + AccountSummary, +} from './walletIntegrations/AccountList.js'; +export { ConnectWalletButton } from './walletIntegrations/ConnectWalletButton.js'; +export { + getCosmosKitChainConfigs, + useCosmosAccount, + useCosmosActiveChain, + useCosmosConnectFn, + useCosmosDisconnectFn, + useCosmosTransactionFns, + useCosmosWalletDetails, +} from './walletIntegrations/cosmos.js'; +export { + getWagmiChainConfigs, + useEthereumAccount, + useEthereumActiveChain, + useEthereumConnectFn, + useEthereumDisconnectFn, + useEthereumTransactionFns, + useEthereumWalletDetails, +} from './walletIntegrations/ethereum.js'; +export { + getAccountAddressAndPubKey, + getAccountAddressForChain, + useAccountAddressForChain, + useAccountForChain, + useAccounts, + useActiveChains, + useConnectFns, + useDisconnectFns, + useTransactionFns, + useWalletDetails, +} from './walletIntegrations/multiProtocol.js'; +export { MultiProtocolWalletModal } from './walletIntegrations/MultiProtocolWalletModal.js'; +export { + useSolanaAccount, + useSolanaActiveChain, + useSolanaConnectFn, + useSolanaDisconnectFn, + useSolanaTransactionFns, + useSolanaWalletDetails, +} from './walletIntegrations/solana.js'; +export type { + AccountInfo, + ActiveChainInfo, + ChainAddress, + ChainTransactionFns, + SendTransactionFn, + SwitchNetworkFn, + WalletDetails, +} from './walletIntegrations/types.js'; +export { + ethers5TxToWagmiTx, + findChainByRpcUrl, + getChainsForProtocol, +} from './walletIntegrations/utils.js'; +export { WalletLogo } from './walletIntegrations/WalletLogo.js'; diff --git a/typescript/widgets/src/layout/Modal.tsx b/typescript/widgets/src/layout/Modal.tsx index 87c36e8318..bc0b872f01 100644 --- a/typescript/widgets/src/layout/Modal.tsx +++ b/typescript/widgets/src/layout/Modal.tsx @@ -1,9 +1,14 @@ -import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react'; +import { + Dialog, + DialogBackdrop, + DialogPanel, + DialogTitle, +} from '@headlessui/react'; import clsx from 'clsx'; import React, { ComponentProps, PropsWithChildren, useState } from 'react'; import { IconButton } from '../components/IconButton.js'; -import { XIcon } from '../icons/X.js'; +import { XCircleIcon } from '../icons/XCircle.js'; export function useModal() { const [isOpen, setIsOpen] = useState(false); @@ -20,6 +25,7 @@ export type ModalProps = PropsWithChildren<{ panelClassname?: string; panelProps?: ComponentProps; showCloseButton?: boolean; + title?: string; }>; export function Modal({ @@ -30,30 +36,33 @@ export function Modal({ panelClassname, panelProps, showCloseButton, + title, children, }: ModalProps) { return ( - +
+ {title && ( + + {title} + + )} {children} {showCloseButton && (
@@ -62,7 +71,7 @@ export function Modal({ title="Close" className="hover:htw-rotate-90" > - +
)} diff --git a/typescript/widgets/src/logger.ts b/typescript/widgets/src/logger.ts new file mode 100644 index 0000000000..b459551117 --- /dev/null +++ b/typescript/widgets/src/logger.ts @@ -0,0 +1,3 @@ +import { rootLogger } from '@hyperlane-xyz/utils'; + +export const widgetLogger = rootLogger.child({ module: 'widgets' }); diff --git a/typescript/widgets/src/logos/Cosmos.tsx b/typescript/widgets/src/logos/Cosmos.tsx new file mode 100644 index 0000000000..96b2ee8141 --- /dev/null +++ b/typescript/widgets/src/logos/Cosmos.tsx @@ -0,0 +1,40 @@ +import React, { SVGProps, memo } from 'react'; + +function _CosmosLogo(props: SVGProps) { + return ( + + + + + + + ); +} + +export const CosmosLogo = memo(_CosmosLogo); diff --git a/typescript/widgets/src/logos/Ethereum.tsx b/typescript/widgets/src/logos/Ethereum.tsx new file mode 100644 index 0000000000..6a298601c2 --- /dev/null +++ b/typescript/widgets/src/logos/Ethereum.tsx @@ -0,0 +1,27 @@ +import React, { SVGProps, memo } from 'react'; + +function _EthereumLogo(props: SVGProps) { + return ( + + + + + + + + + + + ); +} + +export const EthereumLogo = memo(_EthereumLogo); diff --git a/typescript/widgets/src/logos/Solana.tsx b/typescript/widgets/src/logos/Solana.tsx new file mode 100644 index 0000000000..07b3affa3f --- /dev/null +++ b/typescript/widgets/src/logos/Solana.tsx @@ -0,0 +1,63 @@ +import React, { SVGProps, memo } from 'react'; + +function _SolanaLogo(props: SVGProps) { + return ( + + + + + + + + + + + + + + + + + + ); +} + +export const SolanaLogo = memo(_SolanaLogo); diff --git a/typescript/widgets/src/logos/WalletConnect.tsx b/typescript/widgets/src/logos/WalletConnect.tsx new file mode 100644 index 0000000000..89b474cbe2 --- /dev/null +++ b/typescript/widgets/src/logos/WalletConnect.tsx @@ -0,0 +1,33 @@ +import React, { SVGProps, memo } from 'react'; + +function _WalletConnectLogo(props: SVGProps) { + return ( + + + + + + + + + + ); +} + +export const WalletConnectLogo = memo(_WalletConnectLogo); diff --git a/typescript/widgets/src/logos/protocols.ts b/typescript/widgets/src/logos/protocols.ts new file mode 100644 index 0000000000..414e4e4507 --- /dev/null +++ b/typescript/widgets/src/logos/protocols.ts @@ -0,0 +1,16 @@ +import { FC, SVGProps } from 'react'; + +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { CosmosLogo } from './Cosmos.js'; +import { EthereumLogo } from './Ethereum.js'; +import { SolanaLogo } from './Solana.js'; + +export const PROTOCOL_TO_LOGO: Record< + ProtocolType, + FC, 'ref'>> +> = { + [ProtocolType.Ethereum]: EthereumLogo, + [ProtocolType.Sealevel]: SolanaLogo, + [ProtocolType.Cosmos]: CosmosLogo, +}; diff --git a/typescript/widgets/src/messages/useMessage.ts b/typescript/widgets/src/messages/useMessage.ts index 78dea53023..3434f621c1 100644 --- a/typescript/widgets/src/messages/useMessage.ts +++ b/typescript/widgets/src/messages/useMessage.ts @@ -1,11 +1,14 @@ import { useCallback, useState } from 'react'; import { HYPERLANE_EXPLORER_API_URL } from '../consts.js'; +import { widgetLogger } from '../logger.js'; import { executeExplorerQuery } from '../utils/explorers.js'; -import { useInterval } from '../utils/useInterval.js'; +import { useInterval } from '../utils/timeout.js'; import { ApiMessage, MessageStatus } from './types.js'; +const logger = widgetLogger.child({ module: 'useMessage' }); + interface Params { messageId?: string; originTxHash?: string; @@ -40,7 +43,7 @@ export function useMessage({ }) .catch((e) => setError(e.toString())) .finally(() => setIsLoading(false)); - }, [messageId, originTxHash, data]); + }, [explorerApiUrl, messageId, originTxHash, data]); useInterval(fetcher, retryInterval); @@ -66,13 +69,13 @@ async function fetchMessage( const result = await executeExplorerQuery(url, 5000); if (result.length > 1) { - console.warn('More than one message received, should not occur'); + logger.warn('More than one message received, should not occur'); return result[0]; } else if (result.length === 1) { - console.debug('Message data found, id:', result[0].id); + logger.debug('Message data found, id:', result[0].id); return result[0]; } else { - console.debug('Message data not found'); + logger.debug('Message data not found'); return null; } } diff --git a/typescript/widgets/src/messages/useMessageStage.ts b/typescript/widgets/src/messages/useMessageStage.ts index 54345d4a92..26dd1678b4 100644 --- a/typescript/widgets/src/messages/useMessageStage.ts +++ b/typescript/widgets/src/messages/useMessageStage.ts @@ -4,8 +4,9 @@ import type { MultiProvider } from '@hyperlane-xyz/sdk'; import { fetchWithTimeout } from '@hyperlane-xyz/utils'; import { HYPERLANE_EXPLORER_API_URL } from '../consts.js'; +import { widgetLogger } from '../logger.js'; import { queryExplorerForBlock } from '../utils/explorers.js'; -import { useInterval } from '../utils/useInterval.js'; +import { useInterval } from '../utils/timeout.js'; import { MessageStatus, @@ -14,6 +15,8 @@ import { StageTimings, } from './types.js'; +const logger = widgetLogger.child({ module: 'useMessageStage' }); + const VALIDATION_TIME_EST = 5; const DEFAULT_BLOCK_TIME_EST = 3; const DEFAULT_FINALITY_BLOCKS = 3; @@ -67,7 +70,7 @@ export function useMessageStage({ }) .catch((e) => setError(e.toString())) .finally(() => setIsLoading(false)); - }, [message, data]); + }, [explorerApiUrl, multiProvider, message, data]); useInterval(fetcher, retryInterval); @@ -192,7 +195,7 @@ async function tryFetchChainLatestBlock( ) { const metadata = multiProvider.tryGetChainMetadata(domainId); if (!metadata) return null; - console.debug(`Attempting to fetch latest block for:`, metadata.name); + logger.debug(`Attempting to fetch latest block for:`, metadata.name); try { const block = await queryExplorerForBlock( metadata.name, @@ -201,7 +204,7 @@ async function tryFetchChainLatestBlock( ); return block; } catch (error) { - console.error('Error fetching latest block', error); + logger.error('Error fetching latest block', error); return null; } } @@ -213,7 +216,7 @@ async function tryFetchLatestNonce( ) { const metadata = multiProvider.tryGetChainMetadata(domainId); if (!metadata) return null; - console.debug(`Attempting to fetch nonce for:`, metadata.name); + logger.debug(`Attempting to fetch nonce for:`, metadata.name); try { const response = await fetchWithTimeout( `${explorerApiUrl}/latest-nonce`, @@ -227,10 +230,10 @@ async function tryFetchLatestNonce( 3000, ); const result = await response.json(); - console.debug(`Found nonce:`, result.nonce); + logger.debug(`Found nonce:`, result.nonce); return result.nonce; } catch (error) { - console.error('Error fetching nonce', error); + logger.error('Error fetching nonce', error); return null; } } diff --git a/typescript/widgets/src/stories/ErrorBoundary.stories.tsx b/typescript/widgets/src/stories/ErrorBoundary.stories.tsx new file mode 100644 index 0000000000..784e842377 --- /dev/null +++ b/typescript/widgets/src/stories/ErrorBoundary.stories.tsx @@ -0,0 +1,32 @@ +import { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; + +import { ErrorBoundary } from '../components/ErrorBoundary'; + +function ErrorTest() { + return ( + }> + + + ); +} + +function ComponentThatThrows() { + if (React) throw new Error('Something went wrong'); + return
Hello
; +} + +function SupportLink() { + return
MyLink; +} + +const meta = { + title: 'ErrorBoundary', + component: ErrorTest, +} satisfies Meta; +export default meta; +type Story = StoryObj; + +export const DefaultErrorBoundary = { + args: {}, +} satisfies Story; diff --git a/typescript/widgets/src/stories/IconList.stories.tsx b/typescript/widgets/src/stories/IconList.stories.tsx index 48570f106c..2a458c0c22 100644 --- a/typescript/widgets/src/stories/IconList.stories.tsx +++ b/typescript/widgets/src/stories/IconList.stories.tsx @@ -11,8 +11,12 @@ interface StoryIconProps { rounded?: boolean; } +const excludedComponents = ['IconButton', 'EllipsisIcon']; + const iconList = Object.entries(Hyperlane) - .filter(([name]) => name.includes('Icon') && !name.includes('IconButton')) + .filter( + ([name]) => name.includes('Icon') && !excludedComponents.includes(name), + ) .map(([_, Component]) => Component as React.ComponentType); function IconList({ @@ -22,6 +26,7 @@ function IconList({ direction, bgColorSeed, roundedWideChevron, + ellipsisDirection, }: { width: number; height: number; @@ -29,6 +34,7 @@ function IconList({ direction: 'n' | 'e' | 's' | 'w'; bgColorSeed: number | undefined; roundedWideChevron: boolean; + ellipsisDirection: 'vertical' | 'horizontal'; }) { return ( <> @@ -40,8 +46,8 @@ function IconList({ flexWrap: 'wrap', }} > - {iconList.map((Icon) => ( - + {iconList.map((Icon, index) => ( + {Icon.displayName} ))} + + EllipsisIcon + + Circle @@ -85,6 +100,10 @@ const meta = { options: ['n', 'e', 's', 'w'], control: { type: 'select' }, }, + ellipsisDirection: { + options: ['horizontal', 'vertical'], + control: { type: 'select' }, + }, }, } satisfies Meta; export default meta; @@ -98,5 +117,6 @@ export const DefaultIconList = { direction: 's', bgColorSeed: 0, roundedWideChevron: false, + ellipsisDirection: 'horizontal', }, } satisfies Story; diff --git a/typescript/widgets/src/stories/Modal.stories.tsx b/typescript/widgets/src/stories/Modal.stories.tsx index ea667df311..073a7077ac 100644 --- a/typescript/widgets/src/stories/Modal.stories.tsx +++ b/typescript/widgets/src/stories/Modal.stories.tsx @@ -4,7 +4,13 @@ import React, { useState } from 'react'; import { Modal } from '../layout/Modal.js'; -function MyModal() { +function MyModal({ + title, + showCloseButton, +}: { + title?: string; + showCloseButton?: boolean; +}) { const [isOpen, setIsOpen] = useState(false); const open = () => setIsOpen(true); const close = () => setIsOpen(false); @@ -15,8 +21,9 @@ function MyModal() {
Hello Modal
@@ -32,5 +39,5 @@ export default meta; type Story = StoryObj; export const BasicModal = { - args: {}, + args: { title: '', showCloseButton: true }, } satisfies Story; diff --git a/typescript/widgets/src/stories/MultiProtocolWalletModal.stories.tsx b/typescript/widgets/src/stories/MultiProtocolWalletModal.stories.tsx new file mode 100644 index 0000000000..dd2aadff71 --- /dev/null +++ b/typescript/widgets/src/stories/MultiProtocolWalletModal.stories.tsx @@ -0,0 +1,124 @@ +import { ChakraProvider } from '@chakra-ui/react'; +import { ChainProvider } from '@cosmos-kit/react'; +import '@interchain-ui/react/styles'; +import { RainbowKitProvider } from '@rainbow-me/rainbowkit'; +import '@rainbow-me/rainbowkit/styles.css'; +import { WalletAdapterNetwork } from '@solana/wallet-adapter-base'; +import { + ConnectionProvider, + WalletProvider, +} from '@solana/wallet-adapter-react'; +import { WalletModalProvider } from '@solana/wallet-adapter-react-ui'; +import '@solana/wallet-adapter-react-ui/styles.css'; +import { clusterApiUrl } from '@solana/web3.js'; +import { Meta, StoryObj } from '@storybook/react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import React, { PropsWithChildren, useState } from 'react'; +import { WagmiProvider, createConfig, http } from 'wagmi'; + +import { cosmoshub, ethereum, solanamainnet } from '@hyperlane-xyz/registry'; +import { MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { AccountList } from '../walletIntegrations/AccountList.js'; +import { ConnectWalletButton } from '../walletIntegrations/ConnectWalletButton.js'; +import { MultiProtocolWalletModal } from '../walletIntegrations/MultiProtocolWalletModal.js'; +import { getCosmosKitChainConfigs } from '../walletIntegrations/cosmos.js'; +import { getWagmiChainConfigs } from '../walletIntegrations/ethereum.js'; + +const multiProvider = new MultiProtocolProvider({ + ethereum, + cosmoshub, + solanamainnet, +}); + +function MinimalDapp({ protocols }: { protocols?: ProtocolType[] }) { + const [isOpen, setIsOpen] = useState(false); + const open = () => setIsOpen(true); + const close = () => setIsOpen(false); + + return ( + + + +
+

CONNECT BUTTON

+ +

ACCOUNT SUMMARY

+ +
+ +
+
+
+ ); +} + +const wagmiConfig = createConfig({ + chains: [getWagmiChainConfigs(multiProvider)[0]], + transports: { [ethereum.chainId]: http() }, +}); + +function EthereumWalletProvider({ children }: PropsWithChildren) { + const queryClient = new QueryClient(); + + return ( + + + {children} + + + ); +} + +const cosmosKitConfig = getCosmosKitChainConfigs(multiProvider); + +function CosmosWalletProvider({ children }: PropsWithChildren) { + return ( + + + {children} + + + ); +} + +function SolanaWalletProvider({ children }: PropsWithChildren) { + return ( + + + {children} + + + ); +} + +const meta = { + title: 'MultiProtocolWalletModal', + component: MinimalDapp, +} satisfies Meta; +export default meta; +type Story = StoryObj; + +export const DefaultPicker = { + args: {}, +} satisfies Story; + +export const EvmOnlyPicker = { + args: { protocols: [ProtocolType.Ethereum] }, +} satisfies Story; diff --git a/typescript/widgets/src/utils/clipboard.ts b/typescript/widgets/src/utils/clipboard.ts index eb331af45d..454b73a766 100644 --- a/typescript/widgets/src/utils/clipboard.ts +++ b/typescript/widgets/src/utils/clipboard.ts @@ -1,3 +1,5 @@ +import { widgetLogger } from '../logger.js'; + export function isClipboardReadSupported() { return !!navigator?.clipboard?.readText; } @@ -7,7 +9,7 @@ export async function tryClipboardSet(value: string) { await navigator.clipboard.writeText(value); return true; } catch (error) { - console.error('Failed to set clipboard', error); + widgetLogger.error('Failed to set clipboard', error); return false; } } @@ -18,7 +20,7 @@ export async function tryClipboardGet() { const value = await navigator.clipboard.readText(); return value; } catch (error) { - console.error('Failed to read from clipboard', error); + widgetLogger.error('Failed to read from clipboard', error); return null; } } diff --git a/typescript/widgets/src/utils/debounce.ts b/typescript/widgets/src/utils/debounce.ts new file mode 100644 index 0000000000..43524d5b0a --- /dev/null +++ b/typescript/widgets/src/utils/debounce.ts @@ -0,0 +1,18 @@ +import { useEffect, useState } from 'react'; + +// Based on https://usehooks.com/useDebounce +export function useDebounce(value: T, delayMs = 500): T { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedValue(value); + }, delayMs); + + return () => { + clearTimeout(handler); + }; + }, [value, delayMs]); + + return debouncedValue; +} diff --git a/typescript/widgets/src/utils/explorers.ts b/typescript/widgets/src/utils/explorers.ts index 38c470d31c..b546f425dc 100644 --- a/typescript/widgets/src/utils/explorers.ts +++ b/typescript/widgets/src/utils/explorers.ts @@ -1,6 +1,8 @@ import type { MultiProvider } from '@hyperlane-xyz/sdk'; import { fetchWithTimeout } from '@hyperlane-xyz/utils'; +import { widgetLogger } from '../logger.js'; + export interface ExplorerQueryResponse { status: string; message: string; @@ -29,7 +31,7 @@ export async function queryExplorer

( throw new Error(`No URL found for explorer for chain ${chainName}`); let url = `${baseUrl}/${path}`; - console.debug('Querying explorer url:', url); + widgetLogger.debug('Querying explorer url:', url); if (apiKey) { url += `&apikey=${apiKey}`; @@ -76,7 +78,7 @@ export async function queryExplorerForBlock( ); if (!block?.number || parseInt(block.number.toString()) < 0) { const msg = 'Invalid block result'; - console.error(msg, JSON.stringify(block), path); + widgetLogger.error(msg, JSON.stringify(block), path); throw new Error(msg); } return block; diff --git a/typescript/widgets/src/utils/ssr.ts b/typescript/widgets/src/utils/ssr.ts new file mode 100644 index 0000000000..98ff02a8b3 --- /dev/null +++ b/typescript/widgets/src/utils/ssr.ts @@ -0,0 +1,10 @@ +import { useEffect, useState } from 'react'; + +export function useIsSsr() { + const [isSsr, setIsSsr] = useState(true); + // Effects are only run on the client side + useEffect(() => { + setIsSsr(false); + }, []); + return isSsr; +} diff --git a/typescript/widgets/src/utils/timeout.ts b/typescript/widgets/src/utils/timeout.ts new file mode 100644 index 0000000000..e87f67b37d --- /dev/null +++ b/typescript/widgets/src/utils/timeout.ts @@ -0,0 +1,52 @@ +import { useCallback, useEffect, useLayoutEffect, useRef } from 'react'; + +const useIsomorphicLayoutEffect = + typeof window !== 'undefined' ? useLayoutEffect : useEffect; + +// https://usehooks-typescript.com/react-hook/use-interval +export function useInterval(callback: () => void, delay: number | null) { + const savedCallback = useRef(callback); + + // Remember the latest callback if it changes. + useIsomorphicLayoutEffect(() => { + savedCallback.current = callback; + }, [callback]); + + // Set up the interval. + useEffect(() => { + // Don't schedule if no delay is specified. + // Note: 0 is a valid value for delay. + if (!delay && delay !== 0) { + return; + } + + const id = setInterval(() => savedCallback.current(), delay); + + return () => clearInterval(id); + }, [delay]); +} + +// https://medium.com/javascript-in-plain-english/usetimeout-react-hook-3cc58b94af1f +export const useTimeout = ( + callback: () => void, + delay = 0, // in ms (default: immediately put into JS Event Queue) +): (() => void) => { + const timeoutIdRef = useRef(); + + const cancel = useCallback(() => { + const timeoutId = timeoutIdRef.current; + if (timeoutId) { + timeoutIdRef.current = undefined; + clearTimeout(timeoutId); + } + }, [timeoutIdRef]); + + useEffect(() => { + if (delay >= 0) { + timeoutIdRef.current = setTimeout(callback, delay); + } + return cancel; + }, [callback, delay, cancel]); + + return cancel; +}; diff --git a/typescript/widgets/src/utils/useChainConnectionTest.ts b/typescript/widgets/src/utils/useChainConnectionTest.ts index 920b2e7dd0..6892fb83bd 100644 --- a/typescript/widgets/src/utils/useChainConnectionTest.ts +++ b/typescript/widgets/src/utils/useChainConnectionTest.ts @@ -26,7 +26,7 @@ export function useConnectionHealthTest( timeout(tester(chainMetadata, index), HEALTH_TEST_TIMEOUT) .then((result) => setIsHealthy(result)) .catch(() => setIsHealthy(false)); - }, [chainMetadata, index, tester]); + }, [chainMetadata, index, type, tester]); return isHealthy; } diff --git a/typescript/widgets/src/utils/useInterval.ts b/typescript/widgets/src/utils/useInterval.ts deleted file mode 100644 index c8ae6d1220..0000000000 --- a/typescript/widgets/src/utils/useInterval.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { useEffect, useLayoutEffect, useRef } from 'react'; - -const useIsomorphicLayoutEffect = - typeof window !== 'undefined' ? useLayoutEffect : useEffect; - -// https://usehooks-typescript.com/react-hook/use-interval -export function useInterval(callback: () => void, delay: number | null) { - const savedCallback = useRef(callback); - - // Remember the latest callback if it changes. - useIsomorphicLayoutEffect(() => { - savedCallback.current = callback; - }, [callback]); - - // Set up the interval. - useEffect(() => { - // Don't schedule if no delay is specified. - // Note: 0 is a valid value for delay. - if (!delay && delay !== 0) { - return; - } - - const id = setInterval(() => savedCallback.current(), delay); - - return () => clearInterval(id); - }, [delay]); -} diff --git a/typescript/widgets/src/walletIntegrations/AccountList.tsx b/typescript/widgets/src/walletIntegrations/AccountList.tsx new file mode 100644 index 0000000000..db99a33a44 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/AccountList.tsx @@ -0,0 +1,143 @@ +import clsx from 'clsx'; +import React, { ButtonHTMLAttributes } from 'react'; + +import { MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType, objKeys } from '@hyperlane-xyz/utils'; + +import { Button } from '../components/Button.js'; +import { IconButton } from '../components/IconButton.js'; +import { LogoutIcon } from '../icons/Logout.js'; +import { WalletIcon } from '../icons/Wallet.js'; +import { XCircleIcon } from '../icons/XCircle.js'; +import { widgetLogger } from '../logger.js'; +import { tryClipboardSet } from '../utils/clipboard.js'; +import { WalletLogo } from '../walletIntegrations/WalletLogo.js'; +import { + useAccounts, + useDisconnectFns, + useWalletDetails, +} from '../walletIntegrations/multiProtocol.js'; + +import { AccountInfo, WalletDetails } from './types.js'; + +const logger = widgetLogger.child({ module: 'walletIntegrations/AccountList' }); + +export function AccountList({ + multiProvider, + onClickConnectWallet, + onCopySuccess, + className, +}: { + multiProvider: MultiProtocolProvider; + onClickConnectWallet: () => void; + onCopySuccess?: () => void; + className?: string; +}) { + const { readyAccounts } = useAccounts(multiProvider); + const disconnectFns = useDisconnectFns(); + const walletDetails = useWalletDetails(); + + const onClickDisconnect = async (protocol: ProtocolType) => { + try { + const disconnectFn = disconnectFns[protocol]; + if (disconnectFn) await disconnectFn(); + } catch (error) { + logger.error('Error disconnecting wallet', error); + } + }; + + const onClickDisconnectAll = async () => { + for (const protocol of objKeys(disconnectFns)) { + await onClickDisconnect(protocol); + } + }; + + return ( +

+ {readyAccounts.map((acc, i) => ( + onClickDisconnect(acc.protocol)} + /> + ))} + + +
+ ); +} + +type AccountSummaryProps = { + account: AccountInfo; + walletDetails: WalletDetails; + onCopySuccess?: () => void; + onClickDisconnect: () => Promise; +} & ButtonHTMLAttributes; + +export function AccountSummary({ + account, + onCopySuccess, + walletDetails, + onClickDisconnect, + className, + ...rest +}: AccountSummaryProps) { + const numAddresses = account?.addresses?.length || 0; + const onlyAddress = + numAddresses === 1 ? account.addresses[0].address : undefined; + + const onClickCopy = async () => { + const copyValue = account.addresses.map((a) => a.address).join(', '); + await tryClipboardSet(copyValue); + onCopySuccess?.(); + }; + + return ( +
+ +
+ + + +
+
+ ); +} + +const styles = { + btn: 'htw-flex htw-w-full htw-items-center all:htw-justify-start htw-rounded-sm htw-text-sm hover:htw-bg-gray-200 all:hover:htw-opacity-100', +}; diff --git a/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx b/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx new file mode 100644 index 0000000000..8ecc32f846 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx @@ -0,0 +1,115 @@ +import clsx from 'clsx'; +import React, { ButtonHTMLAttributes } from 'react'; + +import { MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType, shortenAddress } from '@hyperlane-xyz/utils'; + +import { Button } from '../components/Button.js'; +import { ChevronIcon } from '../icons/Chevron.js'; +import { WalletIcon } from '../icons/Wallet.js'; +import { useIsSsr } from '../utils/ssr.js'; + +import { WalletLogo } from './WalletLogo.js'; +import { useAccounts, useWalletDetails } from './multiProtocol.js'; + +type Props = { + multiProvider: MultiProtocolProvider; + onClickWhenConnected: () => void; + onClickWhenUnconnected: () => void; + countClassName?: string; +} & ButtonHTMLAttributes; + +export function ConnectWalletButton({ + multiProvider, + onClickWhenConnected, + onClickWhenUnconnected, + className, + countClassName, + ...rest +}: Props) { + const isSsr = useIsSsr(); + + const { readyAccounts } = useAccounts(multiProvider); + const walletDetails = useWalletDetails(); + + const numReady = readyAccounts.length; + const firstAccount = readyAccounts[0]; + const firstWallet = + walletDetails[firstAccount?.protocol || ProtocolType.Ethereum]; + + if (isSsr) { + // https://github.com/wagmi-dev/wagmi/issues/542#issuecomment-1144178142 + return null; + } + + return ( +
+
+ {numReady === 0 && ( + + )} + + {numReady === 1 && ( + + )} + + {numReady > 1 && ( + + )} +
+
+ ); +} diff --git a/typescript/widgets/src/walletIntegrations/MultiProtocolWalletModal.tsx b/typescript/widgets/src/walletIntegrations/MultiProtocolWalletModal.tsx new file mode 100644 index 0000000000..2c200f1cef --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/MultiProtocolWalletModal.tsx @@ -0,0 +1,86 @@ +import React, { PropsWithChildren } from 'react'; + +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { Modal } from '../layout/Modal.js'; +import { PROTOCOL_TO_LOGO } from '../logos/protocols.js'; + +import { useConnectFns } from './multiProtocol.js'; + +export function MultiProtocolWalletModal({ + isOpen, + close, + protocols, +}: { + isOpen: boolean; + close: () => void; + protocols?: ProtocolType[]; // defaults to all protocols if not provided +}) { + const connectFns = useConnectFns(); + + const onClickProtocol = (protocol: ProtocolType) => { + close(); + const connectFn = connectFns[protocol]; + if (connectFn) connectFn(); + }; + + const includesProtocol = (protocol: ProtocolType) => + !protocols || protocols.includes(protocol); + + return ( + +
+ {includesProtocol(ProtocolType.Ethereum) && ( + + Ethereum + + )} + {includesProtocol(ProtocolType.Sealevel) && ( + + Solana + + )} + {includesProtocol(ProtocolType.Cosmos) && ( + + Cosmos + + )} +
+
+ ); +} + +function ProtocolButton({ + onClick, + subTitle, + protocol, + children, +}: PropsWithChildren<{ + subTitle: string; + protocol: ProtocolType; + onClick: (protocol: ProtocolType) => void; +}>) { + const Logo = PROTOCOL_TO_LOGO[protocol]; + return ( + + ); +} diff --git a/typescript/widgets/src/walletIntegrations/WalletLogo.tsx b/typescript/widgets/src/walletIntegrations/WalletLogo.tsx new file mode 100644 index 0000000000..a41658295c --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/WalletLogo.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import { WalletIcon } from '../icons/Wallet.js'; +import { WalletConnectLogo } from '../logos/WalletConnect.js'; + +import { WalletDetails } from './types.js'; + +export function WalletLogo({ + walletDetails, + size, +}: { + walletDetails: WalletDetails; + size?: number; +}) { + const src = walletDetails.logoUrl?.trim(); + + if (src) { + return ; + } else if (walletDetails.name?.toLowerCase() === 'walletconnect') { + return ; + } else { + return ; + } +} diff --git a/typescript/widgets/src/walletIntegrations/cosmos.ts b/typescript/widgets/src/walletIntegrations/cosmos.ts new file mode 100644 index 0000000000..7b54c61cf1 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/cosmos.ts @@ -0,0 +1,208 @@ +import type { AssetList, Chain as CosmosChain } from '@chain-registry/types'; +import type { + DeliverTxResponse, + ExecuteResult, + IndexedTx, +} from '@cosmjs/cosmwasm-stargate'; +import { useChain, useChains } from '@cosmos-kit/react'; +import { useCallback, useMemo } from 'react'; + +import { cosmoshub } from '@hyperlane-xyz/registry'; +import { + ChainMetadata, + ChainName, + MultiProtocolProvider, + ProviderType, + TypedTransactionReceipt, + WarpTypedTransaction, + chainMetadataToCosmosChain, +} from '@hyperlane-xyz/sdk'; +import { HexString, ProtocolType, assert } from '@hyperlane-xyz/utils'; + +import { widgetLogger } from '../logger.js'; + +import { + AccountInfo, + ActiveChainInfo, + ChainAddress, + ChainTransactionFns, + WalletDetails, +} from './types.js'; +import { getChainsForProtocol } from './utils.js'; + +// Used because the CosmosKit hooks always require a chain name +const PLACEHOLDER_COSMOS_CHAIN = cosmoshub.name; + +const logger = widgetLogger.child({ + module: 'widgets/walletIntegrations/cosmos', +}); + +export function useCosmosAccount( + multiProvider: MultiProtocolProvider, +): AccountInfo { + const cosmosChains = getCosmosChainNames(multiProvider); + const chainToContext = useChains(cosmosChains); + return useMemo(() => { + const addresses: Array = []; + let publicKey: Promise | undefined = undefined; + let connectorName: string | undefined = undefined; + let isReady = false; + for (const [chainName, context] of Object.entries(chainToContext)) { + if (!context.address) continue; + addresses.push({ address: context.address, chainName }); + publicKey = context + .getAccount() + .then((acc) => Buffer.from(acc.pubkey).toString('hex')); + isReady = true; + connectorName ||= context.wallet?.prettyName; + } + return { + protocol: ProtocolType.Cosmos, + addresses, + publicKey, + isReady, + }; + }, [chainToContext]); +} + +export function useCosmosWalletDetails() { + const { wallet } = useChain(PLACEHOLDER_COSMOS_CHAIN); + const { logo, prettyName } = wallet || {}; + + return useMemo( + () => ({ + name: prettyName, + logoUrl: typeof logo === 'string' ? logo : undefined, + }), + [prettyName, logo], + ); +} + +export function useCosmosConnectFn(): () => void { + const { openView } = useChain(PLACEHOLDER_COSMOS_CHAIN); + return openView; +} + +export function useCosmosDisconnectFn(): () => Promise { + const { disconnect, address } = useChain(PLACEHOLDER_COSMOS_CHAIN); + const safeDisconnect = async () => { + if (address) await disconnect(); + }; + return safeDisconnect; +} + +export function useCosmosActiveChain( + _multiProvider: MultiProtocolProvider, +): ActiveChainInfo { + // Cosmoskit doesn't have the concept of an active chain + return useMemo(() => ({} as ActiveChainInfo), []); +} + +export function useCosmosTransactionFns( + multiProvider: MultiProtocolProvider, +): ChainTransactionFns { + const cosmosChains = getCosmosChainNames(multiProvider); + const chainToContext = useChains(cosmosChains); + + const onSwitchNetwork = useCallback( + async (chainName: ChainName) => { + const displayName = + multiProvider.getChainMetadata(chainName).displayName || chainName; + // CosmosKit does not have switch capability + throw new Error( + `Cosmos wallet must be connected to origin chain ${displayName}}`, + ); + }, + [multiProvider], + ); + + const onSendTx = useCallback( + async ({ + tx, + chainName, + activeChainName, + }: { + tx: WarpTypedTransaction; + chainName: ChainName; + activeChainName?: ChainName; + }) => { + const chainContext = chainToContext[chainName]; + if (!chainContext?.address) + throw new Error(`Cosmos wallet not connected for ${chainName}`); + + if (activeChainName && activeChainName !== chainName) + await onSwitchNetwork(chainName); + + logger.debug(`Sending tx on chain ${chainName}`); + const { getSigningCosmWasmClient, getSigningStargateClient } = + chainContext; + let result: ExecuteResult | DeliverTxResponse; + let txDetails: IndexedTx | null; + if (tx.type === ProviderType.CosmJsWasm) { + const client = await getSigningCosmWasmClient(); + result = await client.executeMultiple( + chainContext.address, + [tx.transaction], + 'auto', + ); + txDetails = await client.getTx(result.transactionHash); + } else if (tx.type === ProviderType.CosmJs) { + const client = await getSigningStargateClient(); + // The fee param of 'auto' here stopped working for Neutron-based IBC transfers + // It seems the signAndBroadcast method uses a default fee multiplier of 1.4 + // https://github.com/cosmos/cosmjs/blob/e819a1fc0e99a3e5320d8d6667a08d3b92e5e836/packages/stargate/src/signingstargateclient.ts#L115 + // A multiplier of 1.6 was insufficient for Celestia -> Neutron|Cosmos -> XXX transfers, but 2 worked. + result = await client.signAndBroadcast( + chainContext.address, + [tx.transaction], + 2, + ); + txDetails = await client.getTx(result.transactionHash); + } else { + throw new Error(`Invalid cosmos provider type ${tx.type}`); + } + + const confirm = async (): Promise => { + assert(txDetails, `Cosmos tx failed: ${JSON.stringify(result)}`); + return { + type: tx.type, + receipt: { ...txDetails, transactionHash: result.transactionHash }, + }; + }; + return { hash: result.transactionHash, confirm }; + }, + [onSwitchNetwork, chainToContext], + ); + + return { sendTransaction: onSendTx, switchNetwork: onSwitchNetwork }; +} + +function getCosmosChains( + multiProvider: MultiProtocolProvider, +): ChainMetadata[] { + return [ + ...getChainsForProtocol(multiProvider, ProtocolType.Cosmos), + cosmoshub, + ]; +} + +function getCosmosChainNames( + multiProvider: MultiProtocolProvider, +): ChainName[] { + return getCosmosChains(multiProvider).map((c) => c.name); +} + +// Metadata formatted for use in Wagmi config +export function getCosmosKitChainConfigs( + multiProvider: MultiProtocolProvider, +): { + chains: CosmosChain[]; + assets: AssetList[]; +} { + const chains = getCosmosChains(multiProvider); + const configList = chains.map(chainMetadataToCosmosChain); + return { + chains: configList.map((c) => c.chain), + assets: configList.map((c) => c.assets), + }; +} diff --git a/typescript/widgets/src/walletIntegrations/ethereum.ts b/typescript/widgets/src/walletIntegrations/ethereum.ts new file mode 100644 index 0000000000..0a9e8a4a13 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/ethereum.ts @@ -0,0 +1,169 @@ +import { useConnectModal } from '@rainbow-me/rainbowkit'; +import { + getAccount, + sendTransaction, + switchChain, + waitForTransactionReceipt, +} from '@wagmi/core'; +import { useCallback, useMemo } from 'react'; +import { Chain as ViemChain } from 'viem'; +import { useAccount, useConfig, useDisconnect } from 'wagmi'; + +import { + ChainName, + MultiProtocolProvider, + ProviderType, + TypedTransactionReceipt, + WarpTypedTransaction, + chainMetadataToViemChain, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType, assert, sleep } from '@hyperlane-xyz/utils'; + +import { widgetLogger } from '../logger.js'; + +import { + AccountInfo, + ActiveChainInfo, + ChainTransactionFns, + WalletDetails, +} from './types.js'; +import { ethers5TxToWagmiTx, getChainsForProtocol } from './utils.js'; + +const logger = widgetLogger.child({ module: 'walletIntegrations/ethereum' }); + +export function useEthereumAccount( + _multiProvider: MultiProtocolProvider, +): AccountInfo { + const { address, isConnected, connector } = useAccount(); + const isReady = !!(address && isConnected && connector); + + return useMemo( + () => ({ + protocol: ProtocolType.Ethereum, + addresses: address ? [{ address: `${address}` }] : [], + isReady: isReady, + }), + [address, isReady], + ); +} + +export function useEthereumWalletDetails() { + const { connector } = useAccount(); + const name = connector?.name; + const logoUrl = connector?.icon; + + return useMemo( + () => ({ + name, + logoUrl, + }), + [name, logoUrl], + ); +} + +export function useEthereumConnectFn(): () => void { + const { openConnectModal } = useConnectModal(); + return useCallback(() => openConnectModal?.(), [openConnectModal]); +} + +export function useEthereumDisconnectFn(): () => Promise { + const { disconnectAsync } = useDisconnect(); + return disconnectAsync; +} + +export function useEthereumActiveChain( + multiProvider: MultiProtocolProvider, +): ActiveChainInfo { + const { chain } = useAccount(); + return useMemo( + () => ({ + chainDisplayName: chain?.name, + chainName: chain + ? multiProvider.tryGetChainMetadata(chain.id)?.name + : undefined, + }), + [chain, multiProvider], + ); +} + +export function useEthereumTransactionFns( + multiProvider: MultiProtocolProvider, +): ChainTransactionFns { + const config = useConfig(); + + const onSwitchNetwork = useCallback( + async (chainName: ChainName) => { + const chainId = multiProvider.getChainMetadata(chainName) + .chainId as number; + await switchChain(config, { chainId }); + // Some wallets seem to require a brief pause after switch + await sleep(2000); + }, + [config, multiProvider], + ); + // Note, this doesn't use wagmi's prepare + send pattern because we're potentially sending two transactions + // The prepare hooks are recommended to use pre-click downtime to run async calls, but since the flow + // may require two serial txs, the prepare hooks aren't useful and complicate hook architecture considerably. + // See https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/issues/19 + // See https://github.com/wagmi-dev/wagmi/discussions/1564 + const onSendTx = useCallback( + async ({ + tx, + chainName, + activeChainName, + }: { + tx: WarpTypedTransaction; + chainName: ChainName; + activeChainName?: ChainName; + }) => { + if (tx.type !== ProviderType.EthersV5) + throw new Error(`Unsupported tx type: ${tx.type}`); + + // If the active chain is different from tx origin chain, try to switch network first + if (activeChainName && activeChainName !== chainName) + await onSwitchNetwork(chainName); + + // Since the network switching is not foolproof, we also force a network check here + const chainId = multiProvider.getChainMetadata(chainName) + .chainId as number; + logger.debug('Checking wallet current chain'); + const latestNetwork = await getAccount(config); + assert( + latestNetwork?.chain?.id === chainId, + `Wallet not on chain ${chainName} (ChainMismatchError)`, + ); + + logger.debug(`Sending tx on chain ${chainName}`); + const wagmiTx = ethers5TxToWagmiTx(tx.transaction); + const hash = await sendTransaction(config, { + chainId, + ...wagmiTx, + }); + const confirm = (): Promise => { + const foo = waitForTransactionReceipt(config, { + chainId, + hash, + confirmations: 1, + }); + return foo.then((r) => ({ + type: ProviderType.Viem, + receipt: { ...r, contractAddress: r.contractAddress || null }, + })); + }; + + return { hash, confirm }; + }, + [config, onSwitchNetwork, multiProvider], + ); + + return { sendTransaction: onSendTx, switchNetwork: onSwitchNetwork }; +} + +// Metadata formatted for use in Wagmi config +export function getWagmiChainConfigs( + multiProvider: MultiProtocolProvider, +): ViemChain[] { + return getChainsForProtocol(multiProvider, ProtocolType.Ethereum).map( + chainMetadataToViemChain, + ); +} diff --git a/typescript/widgets/src/walletIntegrations/multiProtocol.tsx b/typescript/widgets/src/walletIntegrations/multiProtocol.tsx new file mode 100644 index 0000000000..9fb58abb17 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/multiProtocol.tsx @@ -0,0 +1,256 @@ +import { useMemo } from 'react'; + +import { ChainName, MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { Address, HexString, ProtocolType } from '@hyperlane-xyz/utils'; + +import { widgetLogger } from '../logger.js'; + +import { + useCosmosAccount, + useCosmosActiveChain, + useCosmosConnectFn, + useCosmosDisconnectFn, + useCosmosTransactionFns, + useCosmosWalletDetails, +} from './cosmos.js'; +import { + useEthereumAccount, + useEthereumActiveChain, + useEthereumConnectFn, + useEthereumDisconnectFn, + useEthereumTransactionFns, + useEthereumWalletDetails, +} from './ethereum.js'; +import { + useSolanaAccount, + useSolanaActiveChain, + useSolanaConnectFn, + useSolanaDisconnectFn, + useSolanaTransactionFns, + useSolanaWalletDetails, +} from './solana.js'; +import { + AccountInfo, + ActiveChainInfo, + ChainTransactionFns, + WalletDetails, +} from './types.js'; + +const logger = widgetLogger.child({ + module: 'walletIntegrations/multiProtocol', +}); + +export function useAccounts( + multiProvider: MultiProtocolProvider, + blacklistedAddresses: Address[] = [], +): { + accounts: Record; + readyAccounts: Array; +} { + const evmAccountInfo = useEthereumAccount(multiProvider); + const solAccountInfo = useSolanaAccount(multiProvider); + const cosmAccountInfo = useCosmosAccount(multiProvider); + + // Filtered ready accounts + const readyAccounts = useMemo( + () => + [evmAccountInfo, solAccountInfo, cosmAccountInfo].filter( + (a) => a.isReady, + ), + [evmAccountInfo, solAccountInfo, cosmAccountInfo], + ); + + // Check if any of the ready accounts are blacklisted + const readyAddresses = readyAccounts + .map((a) => a.addresses) + .flat() + .map((a) => a.address.toLowerCase()); + if (readyAddresses.some((a) => blacklistedAddresses.includes(a))) { + throw new Error('Wallet address is blacklisted'); + } + + return useMemo( + () => ({ + accounts: { + [ProtocolType.Ethereum]: evmAccountInfo, + [ProtocolType.Sealevel]: solAccountInfo, + [ProtocolType.Cosmos]: cosmAccountInfo, + }, + readyAccounts, + }), + [evmAccountInfo, solAccountInfo, cosmAccountInfo, readyAccounts], + ); +} + +export function useAccountForChain( + multiProvider: MultiProtocolProvider, + chainName?: ChainName, +): AccountInfo | undefined { + const { accounts } = useAccounts(multiProvider); + const protocol = chainName ? multiProvider.getProtocol(chainName) : undefined; + if (!chainName || !protocol) return undefined; + return accounts?.[protocol]; +} + +export function useAccountAddressForChain( + multiProvider: MultiProtocolProvider, + chainName?: ChainName, +): Address | undefined { + const { accounts } = useAccounts(multiProvider); + return getAccountAddressForChain(multiProvider, chainName, accounts); +} + +export function getAccountAddressForChain( + multiProvider: MultiProtocolProvider, + chainName?: ChainName, + accounts?: Record, +): Address | undefined { + if (!chainName || !accounts) return undefined; + const protocol = multiProvider.getProtocol(chainName); + const account = accounts[protocol]; + if (protocol === ProtocolType.Cosmos) { + return account?.addresses.find((a) => a.chainName === chainName)?.address; + } else { + // Use first because only cosmos has the notion of per-chain addresses + return account?.addresses[0]?.address; + } +} + +export function getAccountAddressAndPubKey( + multiProvider: MultiProtocolProvider, + chainName?: ChainName, + accounts?: Record, +): { address?: Address; publicKey?: Promise } { + const address = getAccountAddressForChain(multiProvider, chainName, accounts); + if (!accounts || !chainName || !address) return {}; + const protocol = multiProvider.getProtocol(chainName); + const publicKey = accounts[protocol]?.publicKey; + return { address, publicKey }; +} + +export function useWalletDetails(): Record { + const evmWallet = useEthereumWalletDetails(); + const solWallet = useSolanaWalletDetails(); + const cosmosWallet = useCosmosWalletDetails(); + + return useMemo( + () => ({ + [ProtocolType.Ethereum]: evmWallet, + [ProtocolType.Sealevel]: solWallet, + [ProtocolType.Cosmos]: cosmosWallet, + }), + [evmWallet, solWallet, cosmosWallet], + ); +} + +export function useConnectFns(): Record void> { + const onConnectEthereum = useEthereumConnectFn(); + const onConnectSolana = useSolanaConnectFn(); + const onConnectCosmos = useCosmosConnectFn(); + + return useMemo( + () => ({ + [ProtocolType.Ethereum]: onConnectEthereum, + [ProtocolType.Sealevel]: onConnectSolana, + [ProtocolType.Cosmos]: onConnectCosmos, + }), + [onConnectEthereum, onConnectSolana, onConnectCosmos], + ); +} + +export function useDisconnectFns(): Record Promise> { + const disconnectEvm = useEthereumDisconnectFn(); + const disconnectSol = useSolanaDisconnectFn(); + const disconnectCosmos = useCosmosDisconnectFn(); + + const onClickDisconnect = + (env: ProtocolType, disconnectFn?: () => Promise | void) => + async () => { + try { + if (!disconnectFn) throw new Error('Disconnect function is null'); + await disconnectFn(); + } catch (error) { + logger.error(`Error disconnecting from ${env} wallet`, error); + } + }; + + return useMemo( + () => ({ + [ProtocolType.Ethereum]: onClickDisconnect( + ProtocolType.Ethereum, + disconnectEvm, + ), + [ProtocolType.Sealevel]: onClickDisconnect( + ProtocolType.Sealevel, + disconnectSol, + ), + [ProtocolType.Cosmos]: onClickDisconnect( + ProtocolType.Cosmos, + disconnectCosmos, + ), + }), + [disconnectEvm, disconnectSol, disconnectCosmos], + ); +} + +export function useActiveChains(multiProvider: MultiProtocolProvider): { + chains: Record; + readyChains: Array; +} { + const evmChain = useEthereumActiveChain(multiProvider); + const solChain = useSolanaActiveChain(multiProvider); + const cosmChain = useCosmosActiveChain(multiProvider); + + const readyChains = useMemo( + () => [evmChain, solChain, cosmChain].filter((c) => !!c.chainDisplayName), + [evmChain, solChain, cosmChain], + ); + + return useMemo( + () => ({ + chains: { + [ProtocolType.Ethereum]: evmChain, + [ProtocolType.Sealevel]: solChain, + [ProtocolType.Cosmos]: cosmChain, + }, + readyChains, + }), + [evmChain, solChain, cosmChain, readyChains], + ); +} + +export function useTransactionFns( + multiProvider: MultiProtocolProvider, +): Record { + const { switchNetwork: onSwitchEvmNetwork, sendTransaction: onSendEvmTx } = + useEthereumTransactionFns(multiProvider); + const { switchNetwork: onSwitchSolNetwork, sendTransaction: onSendSolTx } = + useSolanaTransactionFns(multiProvider); + const { switchNetwork: onSwitchCosmNetwork, sendTransaction: onSendCosmTx } = + useCosmosTransactionFns(multiProvider); + + return useMemo( + () => ({ + [ProtocolType.Ethereum]: { + sendTransaction: onSendEvmTx, + switchNetwork: onSwitchEvmNetwork, + }, + [ProtocolType.Sealevel]: { + sendTransaction: onSendSolTx, + switchNetwork: onSwitchSolNetwork, + }, + [ProtocolType.Cosmos]: { + sendTransaction: onSendCosmTx, + switchNetwork: onSwitchCosmNetwork, + }, + }), + [ + onSendEvmTx, + onSendSolTx, + onSwitchEvmNetwork, + onSwitchSolNetwork, + onSendCosmTx, + onSwitchCosmNetwork, + ], + ); +} diff --git a/typescript/widgets/src/walletIntegrations/solana.ts b/typescript/widgets/src/walletIntegrations/solana.ts new file mode 100644 index 0000000000..94874645af --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/solana.ts @@ -0,0 +1,138 @@ +import { useConnection, useWallet } from '@solana/wallet-adapter-react'; +import { useWalletModal } from '@solana/wallet-adapter-react-ui'; +import { Connection } from '@solana/web3.js'; +import { useCallback, useMemo } from 'react'; + +import { + ChainName, + MultiProtocolProvider, + ProviderType, + TypedTransactionReceipt, + WarpTypedTransaction, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { widgetLogger } from '../logger.js'; + +import { + AccountInfo, + ActiveChainInfo, + ChainTransactionFns, + WalletDetails, +} from './types.js'; +import { findChainByRpcUrl } from './utils.js'; + +const logger = widgetLogger.child({ module: 'walletIntegrations/solana' }); + +export function useSolanaAccount( + _multiProvider: MultiProtocolProvider, +): AccountInfo { + const { publicKey, connected, wallet } = useWallet(); + const isReady = !!(publicKey && wallet && connected); + const address = publicKey?.toBase58(); + + return useMemo( + () => ({ + protocol: ProtocolType.Sealevel, + addresses: address ? [{ address: address }] : [], + isReady: isReady, + }), + [address, isReady], + ); +} + +export function useSolanaWalletDetails() { + const { wallet } = useWallet(); + const { name, icon } = wallet?.adapter || {}; + + return useMemo( + () => ({ + name, + logoUrl: icon, + }), + [name, icon], + ); +} + +export function useSolanaConnectFn(): () => void { + const { setVisible } = useWalletModal(); + return useCallback(() => setVisible(true), [setVisible]); +} + +export function useSolanaDisconnectFn(): () => Promise { + const { disconnect } = useWallet(); + return disconnect; +} + +export function useSolanaActiveChain( + multiProvider: MultiProtocolProvider, +): ActiveChainInfo { + const { connection } = useConnection(); + const connectionEndpoint = connection?.rpcEndpoint; + return useMemo(() => { + try { + const hostname = new URL(connectionEndpoint).hostname; + const metadata = findChainByRpcUrl(multiProvider, hostname); + if (!metadata) return {}; + return { + chainDisplayName: metadata.displayName, + chainName: metadata.name, + }; + } catch (error) { + logger.warn('Error finding sol active chain', error); + return {}; + } + }, [connectionEndpoint, multiProvider]); +} + +export function useSolanaTransactionFns( + multiProvider: MultiProtocolProvider, +): ChainTransactionFns { + const { sendTransaction: sendSolTransaction } = useWallet(); + + const onSwitchNetwork = useCallback(async (chainName: ChainName) => { + logger.warn(`Solana wallet must be connected to origin chain ${chainName}`); + }, []); + + const onSendTx = useCallback( + async ({ + tx, + chainName, + activeChainName, + }: { + tx: WarpTypedTransaction; + chainName: ChainName; + activeChainName?: ChainName; + }) => { + if (tx.type !== ProviderType.SolanaWeb3) + throw new Error(`Unsupported tx type: ${tx.type}`); + if (activeChainName && activeChainName !== chainName) + await onSwitchNetwork(chainName); + const rpcUrl = multiProvider.getRpcUrl(chainName); + const connection = new Connection(rpcUrl, 'confirmed'); + const { + context: { slot: minContextSlot }, + value: { blockhash, lastValidBlockHeight }, + } = await connection.getLatestBlockhashAndContext(); + + logger.debug(`Sending tx on chain ${chainName}`); + const signature = await sendSolTransaction(tx.transaction, connection, { + minContextSlot, + }); + + const confirm = (): Promise => + connection + .confirmTransaction({ blockhash, lastValidBlockHeight, signature }) + .then(() => connection.getTransaction(signature)) + .then((r) => ({ + type: ProviderType.SolanaWeb3, + receipt: r!, + })); + + return { hash: signature, confirm }; + }, + [onSwitchNetwork, sendSolTransaction, multiProvider], + ); + + return { sendTransaction: onSendTx, switchNetwork: onSwitchNetwork }; +} diff --git a/typescript/widgets/src/walletIntegrations/types.ts b/typescript/widgets/src/walletIntegrations/types.ts new file mode 100644 index 0000000000..cab39fbdf2 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/types.ts @@ -0,0 +1,48 @@ +import { + ChainName, + TypedTransactionReceipt, + WarpTypedTransaction, +} from '@hyperlane-xyz/sdk'; +import { HexString, ProtocolType } from '@hyperlane-xyz/utils'; + +export interface ChainAddress { + address: string; + chainName?: ChainName; +} + +export interface AccountInfo { + protocol: ProtocolType; + // This needs to be an array instead of a single address b.c. + // Cosmos wallets have different addresses per chain + addresses: Array; + // And another Cosmos exception, public keys are needed + // for tx simulation and gas estimation + publicKey?: Promise; + isReady: boolean; +} + +export interface WalletDetails { + name?: string; + logoUrl?: string; +} + +export interface ActiveChainInfo { + chainDisplayName?: string; + chainName?: ChainName; +} + +export type SendTransactionFn< + TxReq extends WarpTypedTransaction = WarpTypedTransaction, + TxResp extends TypedTransactionReceipt = TypedTransactionReceipt, +> = (params: { + tx: TxReq; + chainName: ChainName; + activeChainName?: ChainName; +}) => Promise<{ hash: string; confirm: () => Promise }>; + +export type SwitchNetworkFn = (chainName: ChainName) => Promise; + +export interface ChainTransactionFns { + sendTransaction: SendTransactionFn; + switchNetwork?: SwitchNetworkFn; +} diff --git a/typescript/widgets/src/walletIntegrations/utils.ts b/typescript/widgets/src/walletIntegrations/utils.ts new file mode 100644 index 0000000000..b0a994f1d8 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/utils.ts @@ -0,0 +1,56 @@ +import { SendTransactionParameters } from '@wagmi/core'; +import { + PopulatedTransaction as Ethers5Transaction, + BigNumber as EthersBN, +} from 'ethers'; + +import { ChainMetadata, MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + +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}`, + nonce: tx.nonce, + chainId: tx.chainId, + gas: tx.gasLimit ? ethersBnToBigInt(tx.gasLimit) : undefined, + gasPrice: tx.gasPrice ? ethersBnToBigInt(tx.gasPrice) : undefined, + maxFeePerGas: tx.maxFeePerGas + ? ethersBnToBigInt(tx.maxFeePerGas) + : undefined, + maxPriorityFeePerGas: tx.maxPriorityFeePerGas + ? ethersBnToBigInt(tx.maxPriorityFeePerGas) + : undefined, + }; +} + +function ethersBnToBigInt(bn: EthersBN): bigint { + return BigInt(bn.toString()); +} + +export function getChainsForProtocol( + multiProvider: MultiProtocolProvider, + protocol: ProtocolType, +): ChainMetadata[] { + return Object.values(multiProvider.metadata).filter( + (c) => c.protocol === protocol, + ); +} + +export function findChainByRpcUrl( + multiProvider: MultiProtocolProvider, + url?: string, +) { + if (!url) return undefined; + const allMetadata = Object.values(multiProvider.metadata); + const searchUrl = url.toLowerCase(); + return allMetadata.find( + (m) => + !!m.rpcUrls.find((rpc) => rpc.http.toLowerCase().includes(searchUrl)), + ); +} diff --git a/typescript/widgets/tailwind.config.cjs b/typescript/widgets/tailwind.config.cjs index f410968ec4..48dedefff0 100644 --- a/typescript/widgets/tailwind.config.cjs +++ b/typescript/widgets/tailwind.config.cjs @@ -12,6 +12,7 @@ module.exports = { mono: ['Courier New', 'monospace'], }, screens: { + all: '1px', xs: '480px', ...defaultTheme.screens, }, diff --git a/yarn.lock b/yarn.lock index 1b37b9b18b..0458dcb8c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,10 +19,17 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@adraffy/ens-normalize@npm:1.10.0": version: 1.10.0 resolution: "@adraffy/ens-normalize@npm:1.10.0" checksum: 10/5cdb5d2a9c9f8c0a71a7bb830967da0069cae1f1235cd41ae11147e4000f368f6958386e622cd4d52bf45c1ed3f8275056b387cba28902b83354e40ff323ecde +======= +"@adraffy/ens-normalize@npm:^1.10.1": + version: 1.11.0 + resolution: "@adraffy/ens-normalize@npm:1.11.0" + checksum: 10/abef75f21470ea43dd6071168e092d2d13e38067e349e76186c78838ae174a46c3e18ca50921d05bea6ec3203074147c9e271f8cb6531d1c2c0e146f3199ddcb +>>>>>>> origin/main languageName: node linkType: hard @@ -3281,6 +3288,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/db2c2122af79d31ca916755331bb4bac96feb2b334cdaca5097a6b467fdd41963b89b14b6836a14f083de7ff887fc78fa1b3c10b14e743d33e12dbfe5ee3d223 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.8, @babel/compat-data@npm:^7.25.0": version: 7.25.0 resolution: "@babel/compat-data@npm:7.25.0" @@ -3388,6 +3406,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" + dependencies: + "@babel/parser": "npm:^7.26.2" + "@babel/types": "npm:^7.26.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10/71ace82b5b07a554846a003624bfab93275ccf73cdb9f1a37a4c1094bf9dc94bb677c67e8b8c939dbd6c5f0eda2e8f268aa2b0d9c3b9511072565660e717e045 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" @@ -3514,6 +3545,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.16.7": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10/e090be5dee94dda6cd769972231b21ddfae988acd76b703a480ac0c96f3334557d70a965bf41245d6ee43891e7571a8b400ccf2b2be5803351375d0f4e5bcf08 + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-module-imports@npm:7.22.15" @@ -3670,6 +3711,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-validator-identifier@npm:7.16.7" @@ -3698,6 +3746,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" @@ -3834,6 +3889,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" + dependencies: + "@babel/types": "npm:^7.26.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/8baee43752a3678ad9f9e360ec845065eeee806f1fdc8e0f348a8a0e13eef0959dabed4a197c978896c493ea205c804d0a1187cc52e4a1ba017c7935bab4983d + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.0" @@ -4961,6 +5027,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.25.0": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10/9f4ea1c1d566c497c052d505587554e782e021e6ccd302c2ad7ae8291c8e16e3f19d4a7726fb64469e057779ea2081c28b7dbefec6d813a22f08a35712c0f699 + languageName: node + linkType: hard + "@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": version: 7.25.0 resolution: "@babel/runtime@npm:7.25.0" @@ -5039,6 +5114,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10/e861180881507210150c1335ad94aff80fd9e9be6202e1efa752059c93224e2d5310186ddcdd4c0f0b0fc658ce48cb47823f15142b5c00c8456dde54f5de80b2 + languageName: node + linkType: hard + "@babel/traverse@npm:7.23.2": version: 7.23.2 resolution: "@babel/traverse@npm:7.23.2" @@ -5090,6 +5176,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" + dependencies: + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10/7431614d76d4a053e429208db82f2846a415833f3d9eb2e11ef72eeb3c64dfd71f4a4d983de1a4a047b36165a1f5a64de8ca2a417534cc472005c740ffcb9c6a + languageName: node + linkType: hard + "@babel/types@npm:7.17.0": version: 7.17.0 resolution: "@babel/types@npm:7.17.0" @@ -5165,6 +5266,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/40780741ecec886ed9edae234b5eb4976968cc70d72b4e5a40d55f83ff2cc457de20f9b0f4fe9d858350e43dab0ea496e7ef62e2b2f08df699481a76df02cd6e + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -5179,6 +5290,62 @@ __metadata: languageName: node linkType: hard +"@chain-registry/client@npm:^1.49.11": + version: 1.53.13 + resolution: "@chain-registry/client@npm:1.53.13" + dependencies: + "@chain-registry/types": "npm:^0.50.13" + "@chain-registry/utils": "npm:^1.51.13" + bfs-path: "npm:^1.0.2" + cross-fetch: "npm:^3.1.5" + checksum: 10/d80b71ad6c607a2577cc4cc96213de192f7d004c7901c52f50d6a2f79570ff5b1bd477d409f7d6ba88aca5c8f555911414805e4dc81a1a58ec3f0b41f79530ea + languageName: node + linkType: hard + +"@chain-registry/keplr@npm:^1.69.13": + version: 1.74.32 + resolution: "@chain-registry/keplr@npm:1.74.32" + dependencies: + "@chain-registry/types": "npm:^0.50.13" + "@keplr-wallet/cosmos": "npm:0.12.28" + "@keplr-wallet/crypto": "npm:0.12.28" + semver: "npm:^7.5.0" + checksum: 10/df93c4253c75ab52b682a166921e826030836bf77a434903472c60290fc7ee477841173931a2d804ec68671014d97bae8c919a32ade12990b6638f282c1644cd + languageName: node + linkType: hard + +"@chain-registry/types@npm:^0.46.11": + version: 0.46.15 + resolution: "@chain-registry/types@npm:0.46.15" + checksum: 10/de63ace15b36ec3f06a401483d8ad8822c794658df3541cff00aa54756499ea5e881f8709b0a7876ae2a0b8b05848e87e41e8baf0fdb46e12e8c68cacbccb5f3 + languageName: node + linkType: hard + +"@chain-registry/types@npm:^0.50.13": + version: 0.50.13 + resolution: "@chain-registry/types@npm:0.50.13" + checksum: 10/de71473b2de9fa2a3deff734496ef3c5839345355bd816f1d87c71a379e01b5740ba286b0203310fe803e69f25349447d11b6c088d80022973d7da7b5145784b + languageName: node + linkType: hard + +"@chain-registry/types@npm:^0.50.14": + version: 0.50.14 + resolution: "@chain-registry/types@npm:0.50.14" + checksum: 10/4a1e6978de66d50f98a804174fb8bfa712e42284473edc9e85e6c308dac3fcf381d1888248579128e7a78cec7539378bf7a149b20654741daa85b1c88b8beb8c + languageName: node + linkType: hard + +"@chain-registry/utils@npm:^1.51.13": + version: 1.51.13 + resolution: "@chain-registry/utils@npm:1.51.13" + dependencies: + "@chain-registry/types": "npm:^0.50.13" + bignumber.js: "npm:9.1.2" + sha.js: "npm:^2.4.11" + checksum: 10/d8b1bf249ae13f794a70bd12d2e916394f44d1d949dedf72c4e7532c08bc0da137dd87abd8f2d78562adf5c8c68fa37ccf0a00eed2ee35367d9975721b9b3a93 + languageName: node + linkType: hard + "@chainlink/ccip-read-server@npm:^0.2.1": version: 0.2.1 resolution: "@chainlink/ccip-read-server@npm:0.2.1" @@ -5236,6 +5403,99 @@ __metadata: languageName: node linkType: hard +"@chakra-ui/anatomy@npm:2.3.5": + version: 2.3.5 + resolution: "@chakra-ui/anatomy@npm:2.3.5" + checksum: 10/14b56dfffb76730ac94760443811f952bb2373939ad7539d56b313505733e840eea8cee45c95f96805cb0ed80bbde95d98227b155a02d86d3c1984747b4466ab + languageName: node + linkType: hard + +"@chakra-ui/hooks@npm:2.4.3": + version: 2.4.3 + resolution: "@chakra-ui/hooks@npm:2.4.3" + dependencies: + "@chakra-ui/utils": "npm:2.2.3" + "@zag-js/element-size": "npm:0.31.1" + copy-to-clipboard: "npm:3.3.3" + framesync: "npm:6.1.2" + peerDependencies: + react: ">=18" + checksum: 10/cf740474d5deba1286df8e61acadd1558e97900c6ca162bd0d0354edebfb38a311c0182c35ed95592d2b5ca7af0781dffb354d2048e5268ed3ae5efb61929e39 + languageName: node + linkType: hard + +"@chakra-ui/react@npm:^2.8.2": + version: 2.10.4 + resolution: "@chakra-ui/react@npm:2.10.4" + dependencies: + "@chakra-ui/hooks": "npm:2.4.3" + "@chakra-ui/styled-system": "npm:2.12.1" + "@chakra-ui/theme": "npm:3.4.7" + "@chakra-ui/utils": "npm:2.2.3" + "@popperjs/core": "npm:^2.11.8" + "@zag-js/focus-visible": "npm:^0.31.1" + aria-hidden: "npm:^1.2.3" + react-fast-compare: "npm:3.2.2" + react-focus-lock: "npm:^2.9.6" + react-remove-scroll: "npm:^2.5.7" + peerDependencies: + "@emotion/react": ">=11" + "@emotion/styled": ">=11" + framer-motion: ">=4.0.0" + react: ">=18" + react-dom: ">=18" + checksum: 10/d56ce89499c4c3b9563e7ce3d6fa981201b5e0bc0d7265d995b7ffccf71cbac0d308b304c9d42a220dba07ee4cac6243d276cf1258370208e71c49d2fcda9310 + languageName: node + linkType: hard + +"@chakra-ui/styled-system@npm:2.12.1": + version: 2.12.1 + resolution: "@chakra-ui/styled-system@npm:2.12.1" + dependencies: + "@chakra-ui/utils": "npm:2.2.3" + csstype: "npm:^3.1.2" + checksum: 10/2abddc5fa5cd6c2d8de555f4fb7ffeda1c3ffd65d4649286af2a58a5cc9560fe3c3f9acab8a1cdc58e16f35deaf5719fe3c9ff3f26dc45a4e5e5c9655085e549 + languageName: node + linkType: hard + +"@chakra-ui/theme-tools@npm:2.2.7": + version: 2.2.7 + resolution: "@chakra-ui/theme-tools@npm:2.2.7" + dependencies: + "@chakra-ui/anatomy": "npm:2.3.5" + "@chakra-ui/utils": "npm:2.2.3" + color2k: "npm:^2.0.2" + peerDependencies: + "@chakra-ui/styled-system": ">=2.0.0" + checksum: 10/0ab73ffe6eac1c7211f8661e323c99c844f1a0e466d39351898a3f08bb0436dd820726a989c3016098bf4c799c99b50cd82c13c6dee27cd4c59a8b78cd911a43 + languageName: node + linkType: hard + +"@chakra-ui/theme@npm:3.4.7": + version: 3.4.7 + resolution: "@chakra-ui/theme@npm:3.4.7" + dependencies: + "@chakra-ui/anatomy": "npm:2.3.5" + "@chakra-ui/theme-tools": "npm:2.2.7" + "@chakra-ui/utils": "npm:2.2.3" + peerDependencies: + "@chakra-ui/styled-system": ">=2.8.0" + checksum: 10/d15a7fe94c4fd8984a6167e67f41e72201bbc860171ddd7d8553c8db4e1327ae1c763ec505b80936b758b9ac524ee5c10905b59506f16b38f237e8966e310b70 + languageName: node + linkType: hard + +"@chakra-ui/utils@npm:2.2.3": + version: 2.2.3 + resolution: "@chakra-ui/utils@npm:2.2.3" + dependencies: + "@types/lodash.mergewith": "npm:4.6.9" + lodash.mergewith: "npm:4.6.2" + peerDependencies: + react: ">=16.8.0" + checksum: 10/0c22261c77b565e9bc44aa6891cc30324b05539de73061d2218c9e8859600eabca930217b11a1b614816d0bef04cdeab0f43d6060607670c5490fc9e8c166298 + languageName: node + linkType: hard + "@changesets/apply-release-plan@npm:^6.1.4": version: 6.1.4 resolution: "@changesets/apply-release-plan@npm:6.1.4" @@ -5550,6 +5810,18 @@ __metadata: languageName: node linkType: hard +"@coinbase/wallet-sdk@npm:4.2.3": + version: 4.2.3 + resolution: "@coinbase/wallet-sdk@npm:4.2.3" + dependencies: + "@noble/hashes": "npm:^1.4.0" + clsx: "npm:^1.2.1" + eventemitter3: "npm:^5.0.1" + preact: "npm:^10.24.2" + checksum: 10/dd16ae6d5f7f81b38dfcd95e7538adbe920380bb52206f494f1fafaa38906f2f97265f3eb3f5fe2e9bfab19618447cc19581935586c113d51945c8bab62c7f9a + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -5567,7 +5839,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/amino@npm:^0.32.4": +"@cosmjs/amino@npm:^0.32.3, @cosmjs/amino@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/amino@npm:0.32.4" dependencies: @@ -5579,7 +5851,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/cosmwasm-stargate@npm:^0.32.4": +"@cosmjs/cosmwasm-stargate@npm:^0.32.3, @cosmjs/cosmwasm-stargate@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/cosmwasm-stargate@npm:0.32.4" dependencies: @@ -5642,7 +5914,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/proto-signing@npm:^0.32.4": +"@cosmjs/proto-signing@npm:^0.32.3, @cosmjs/proto-signing@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/proto-signing@npm:0.32.4" dependencies: @@ -5668,7 +5940,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/stargate@npm:^0.32.4": +"@cosmjs/stargate@npm:^0.32.3, @cosmjs/stargate@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/stargate@npm:0.32.4" dependencies: @@ -5720,6 +5992,62 @@ __metadata: languageName: node linkType: hard +"@cosmos-kit/core@npm:^2.15.0": + version: 2.15.0 + resolution: "@cosmos-kit/core@npm:2.15.0" + dependencies: + "@chain-registry/client": "npm:^1.49.11" + "@chain-registry/keplr": "npm:^1.69.13" + "@chain-registry/types": "npm:^0.46.11" + "@cosmjs/amino": "npm:^0.32.3" + "@cosmjs/cosmwasm-stargate": "npm:^0.32.3" + "@cosmjs/proto-signing": "npm:^0.32.3" + "@cosmjs/stargate": "npm:^0.32.3" + "@dao-dao/cosmiframe": "npm:^0.1.0" + "@walletconnect/types": "npm:2.11.0" + bowser: "npm:2.11.0" + cosmjs-types: "npm:^0.9.0" + events: "npm:3.3.0" + nock: "npm:13.5.4" + uuid: "npm:^9.0.1" + checksum: 10/fe13203a71390cbbcb014454ab28c9440281fdeedb23f8bca0984c0b756c4049d0716e104be7eeae809726ebf55bb1a67fc92cd3159e19b9d864177e0bf83215 + languageName: node + linkType: hard + +"@cosmos-kit/react-lite@npm:^2.15.1": + version: 2.15.1 + resolution: "@cosmos-kit/react-lite@npm:2.15.1" + dependencies: + "@chain-registry/types": "npm:^0.46.11" + "@cosmos-kit/core": "npm:^2.15.0" + "@dao-dao/cosmiframe": "npm:^0.1.0" + peerDependencies: + "@types/react": ">= 17" + "@types/react-dom": ">= 17" + react: ^18 + react-dom: ^18 + checksum: 10/3b3c3b7f9fea92c65d1fbb5585d397b09a06fb0a91089a6e4960259fa43d96fdf85ad4d285512df33373ee35fb85e487dace701700afb846960e505e795d80cb + languageName: node + linkType: hard + +"@cosmos-kit/react@npm:^2.18.0": + version: 2.20.1 + resolution: "@cosmos-kit/react@npm:2.20.1" + dependencies: + "@chain-registry/types": "npm:^0.46.11" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/react-lite": "npm:^2.15.1" + "@react-icons/all-files": "npm:^4.1.0" + peerDependencies: + "@interchain-ui/react": ^1.23.9 + "@types/react": ">= 17" + "@types/react-dom": ">= 17" + react: ^18 + react-dom: ^18 + checksum: 10/dc66aedf2cf485262cac805b128f49cf8466d9e16916c242684e47468b5b9f7dec94d396926ae4be808532446864de48987311578d4fd1343d4abdf4876205d2 + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:0.8.1, @cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -5729,6 +6057,18 @@ __metadata: languageName: node linkType: hard +"@dao-dao/cosmiframe@npm:^0.1.0": + version: 0.1.0 + resolution: "@dao-dao/cosmiframe@npm:0.1.0" + dependencies: + uuid: "npm:^9.0.1" + peerDependencies: + "@cosmjs/amino": "*" + "@cosmjs/proto-signing": "*" + checksum: 10/7a53a9047b3deecf1ad9b9aa80467d7d9e91f7187bfdd97b8fde77cdfaf4e828f9c9a85cacfb8f13ebe9ad30f578d1e652c7afc4dcd13b30f04440ff50c3a1d0 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.3": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -5736,7 +6076,155 @@ __metadata: languageName: node linkType: hard -"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.0": +"@ecies/ciphers@npm:^0.2.1": + version: 0.2.1 + resolution: "@ecies/ciphers@npm:0.2.1" + peerDependencies: + "@noble/ciphers": ^1.0.0 + checksum: 10/4a2012358f79ef842c6a9fdcf3d4e1f7d3d59ad3d025cca52b3e7135f62d5c35d394882cbfe8ad5aa17f707663921bf466707d20712b5027a0af5813a6ad7b08 + languageName: node + linkType: hard + +"@emotion/babel-plugin@npm:^11.12.0": + version: 11.12.0 + resolution: "@emotion/babel-plugin@npm:11.12.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.16.7" + "@babel/runtime": "npm:^7.18.3" + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/serialize": "npm:^1.2.0" + babel-plugin-macros: "npm:^3.1.0" + convert-source-map: "npm:^1.5.0" + escape-string-regexp: "npm:^4.0.0" + find-root: "npm:^1.1.0" + source-map: "npm:^0.5.7" + stylis: "npm:4.2.0" + checksum: 10/fe6f4522ea2b61ef4214dd0b0f3778aad9c18434b47e50ae5091af226526bf305455c313065826a090682520c9462c151d4df62ec128f14671d3125afc05b148 + languageName: node + linkType: hard + +"@emotion/cache@npm:^11.13.0": + version: 11.13.1 + resolution: "@emotion/cache@npm:11.13.1" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + "@emotion/sheet": "npm:^1.4.0" + "@emotion/utils": "npm:^1.4.0" + "@emotion/weak-memoize": "npm:^0.4.0" + stylis: "npm:4.2.0" + checksum: 10/090c8ad2e5b23f1b3a95e94f1f0554a40ed1dcd844c9d31629a68ff824eff40f32d1362f67aefa440ee0aabd5a8cabcc76870fd6d77144d3ff251bdcdf1420b9 + languageName: node + linkType: hard + +"@emotion/hash@npm:^0.9.0, @emotion/hash@npm:^0.9.2": + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 10/379bde2830ccb0328c2617ec009642321c0e009a46aa383dfbe75b679c6aea977ca698c832d225a893901f29d7b3eef0e38cf341f560f6b2b56f1ff23c172387 + languageName: node + linkType: hard + +"@emotion/is-prop-valid@npm:^0.8.2": + version: 0.8.8 + resolution: "@emotion/is-prop-valid@npm:0.8.8" + dependencies: + "@emotion/memoize": "npm:0.7.4" + checksum: 10/e85bdeb9d9d23de422f271e0f5311a0142b15055bb7e610440dbf250f0cdfd049df88af72a49e2c6081954481f1cbeca9172e2116ff536b38229397dfbed8082 + languageName: node + linkType: hard + +"@emotion/is-prop-valid@npm:^1.3.0": + version: 1.3.1 + resolution: "@emotion/is-prop-valid@npm:1.3.1" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + checksum: 10/abbc5c7bf4017415da5b06067fc0b4771d1f22cf94ec37fd54c07b3bd1bcffbda2405ca686e7ee64a9cfc51461262b712f724850e838775347a949f72949ad03 + languageName: node + linkType: hard + +"@emotion/memoize@npm:0.7.4": + version: 0.7.4 + resolution: "@emotion/memoize@npm:0.7.4" + checksum: 10/4e3920d4ec95995657a37beb43d3f4b7d89fed6caa2b173a4c04d10482d089d5c3ea50bbc96618d918b020f26ed6e9c4026bbd45433566576c1f7b056c3271dc + languageName: node + linkType: hard + +"@emotion/memoize@npm:^0.9.0": + version: 0.9.0 + resolution: "@emotion/memoize@npm:0.9.0" + checksum: 10/038132359397348e378c593a773b1148cd0cf0a2285ffd067a0f63447b945f5278860d9de718f906a74c7c940ba1783ac2ca18f1c06a307b01cc0e3944e783b1 + languageName: node + linkType: hard + +"@emotion/react@npm:^11.13.3": + version: 11.13.3 + resolution: "@emotion/react@npm:11.13.3" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.12.0" + "@emotion/cache": "npm:^11.13.0" + "@emotion/serialize": "npm:^1.3.1" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.1.0" + "@emotion/utils": "npm:^1.4.0" + "@emotion/weak-memoize": "npm:^0.4.0" + hoist-non-react-statics: "npm:^3.3.1" + peerDependencies: + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ee70d3afc2e8dd771e6fe176d27dd87a5e21a54e54d871438fd1caa5aa2312d848c6866292fdc65a6ea1c945147c8422bda2d22ed739178af9902dc86d6b298a + languageName: node + linkType: hard + +"@emotion/serialize@npm:^1.2.0, @emotion/serialize@npm:^1.3.0, @emotion/serialize@npm:^1.3.1": + version: 1.3.2 + resolution: "@emotion/serialize@npm:1.3.2" + dependencies: + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/unitless": "npm:^0.10.0" + "@emotion/utils": "npm:^1.4.1" + csstype: "npm:^3.0.2" + checksum: 10/ead557c1ff19d917ef8169c02738ef36f0851fbfdf0bf69a543045bddea3b7281dc8252ee466cc5fb44ed27d1e61280ff943bb60a2c04158751fb07b3457cc93 + languageName: node + linkType: hard + +"@emotion/sheet@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/sheet@npm:1.4.0" + checksum: 10/8ac6e9bf6b373a648f26ae7f1c24041038524f4c72f436f4f8c4761c665e58880c3229d8d89b1f7a4815dd8e5b49634d03e60187cb6f93097d7f7c1859e869d5 + languageName: node + linkType: hard + +"@emotion/styled@npm:^11.13.0": + version: 11.13.0 + resolution: "@emotion/styled@npm:11.13.0" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.12.0" + "@emotion/is-prop-valid": "npm:^1.3.0" + "@emotion/serialize": "npm:^1.3.0" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.1.0" + "@emotion/utils": "npm:^1.4.0" + peerDependencies: + "@emotion/react": ^11.0.0-rc.0 + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5463a0f15fc12a9e20340f52df49461e948c3ae7e2dd763db0ff937b0b96dd4e82eed85cd15e24621efb3b097a095b88b01d60f50cf6f38fe3ab7db6e77f9615 + languageName: node + linkType: hard + +"@emotion/unitless@npm:^0.10.0": + version: 0.10.0 + resolution: "@emotion/unitless@npm:0.10.0" + checksum: 10/6851c16edce01c494305f43b2cad7a26b939a821131b7c354e49b8e3b012c8810024755b0f4a03ef51117750309e55339825a97bd10411fb3687e68904769106 + languageName: node + linkType: hard + +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.0, @emotion/use-insertion-effect-with-fallbacks@npm:^1.1.0": version: 1.1.0 resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.1.0" peerDependencies: @@ -5745,6 +6233,20 @@ __metadata: languageName: node linkType: hard +"@emotion/utils@npm:^1.4.0, @emotion/utils@npm:^1.4.1": + version: 1.4.1 + resolution: "@emotion/utils@npm:1.4.1" + checksum: 10/95e56fc0c9e05cf01a96268f0486ce813f1109a8653d2f575c67df9e8765d9c1b2daf09ad1ada67d933efbb08ca7990228e14b210c713daf90156b4869abe6a7 + languageName: node + linkType: hard + +"@emotion/weak-memoize@npm:^0.4.0": + version: 0.4.0 + resolution: "@emotion/weak-memoize@npm:0.4.0" + checksum: 10/db5da0e89bd752c78b6bd65a1e56231f0abebe2f71c0bd8fc47dff96408f7065b02e214080f99924f6a3bfe7ee15afc48dad999d76df86b39b16e513f7a94f52 + languageName: node + linkType: hard + "@esbuild-plugins/node-globals-polyfill@npm:^0.2.3": version: 0.2.3 resolution: "@esbuild-plugins/node-globals-polyfill@npm:0.2.3" @@ -6812,6 +7314,16 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/common@npm:^3.2.0": + version: 3.2.0 + resolution: "@ethereumjs/common@npm:3.2.0" + dependencies: + "@ethereumjs/util": "npm:^8.1.0" + crc-32: "npm:^1.2.0" + checksum: 10/b3f612406b6bcefaf9117ceb42eff58d311e2b50205e3d55b4c793d803de517efbc84075e058dc0e2ec27a2bff11dfc279dda1fa2b249ed6ab3973be045898f4 + languageName: node + linkType: hard + "@ethereumjs/ethash@npm:^1.1.0": version: 1.1.0 resolution: "@ethereumjs/ethash@npm:1.1.0" @@ -6825,6 +7337,15 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/rlp@npm:^4.0.1": + version: 4.0.1 + resolution: "@ethereumjs/rlp@npm:4.0.1" + bin: + rlp: bin/rlp + checksum: 10/bfdffd634ce72f3b17e3d085d071f2fe7ce9680aebdf10713d74b30afd80ef882d17f19ff7175fcb049431a56e800bd3558d3b028bd0d82341927edb303ab450 + languageName: node + linkType: hard + "@ethereumjs/tx@npm:3.3.2": version: 3.3.2 resolution: "@ethereumjs/tx@npm:3.3.2" @@ -6855,6 +7376,29 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/tx@npm:^4.1.2, @ethereumjs/tx@npm:^4.2.0": + version: 4.2.0 + resolution: "@ethereumjs/tx@npm:4.2.0" + dependencies: + "@ethereumjs/common": "npm:^3.2.0" + "@ethereumjs/rlp": "npm:^4.0.1" + "@ethereumjs/util": "npm:^8.1.0" + ethereum-cryptography: "npm:^2.0.0" + checksum: 10/cbd2ffc3ef76ca5416d58f2f694858d9fcac946e6a107fef44cf3f308a7c9fcc996a6847868609354d72d5b356faee68408e9d5601c4c4f7dad8e18cb2c24a95 + languageName: node + linkType: hard + +"@ethereumjs/util@npm:^8.1.0": + version: 8.1.0 + resolution: "@ethereumjs/util@npm:8.1.0" + dependencies: + "@ethereumjs/rlp": "npm:^4.0.1" + ethereum-cryptography: "npm:^2.0.0" + micro-ftch: "npm:^0.3.1" + checksum: 10/cc35338932e49b15e54ca6e548b32a1f48eed7d7e1d34ee743e4d3600dd616668bd50f70139e86c5c35f55aac35fba3b6cc4e6f679cf650aeba66bf93016200c + languageName: node + linkType: hard + "@ethereumjs/vm@npm:5.6.0": version: 5.6.0 resolution: "@ethereumjs/vm@npm:5.6.0" @@ -6965,7 +7509,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.8, @ethersproject/address@npm:^5.4.0, @ethersproject/address@npm:^5.7.0": +"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.8, @ethersproject/address@npm:^5.4.0, @ethersproject/address@npm:^5.6.0, @ethersproject/address@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/address@npm:5.7.0" dependencies: @@ -7561,6 +8105,15 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.6.7": + version: 1.6.8 + resolution: "@floating-ui/core@npm:1.6.8" + dependencies: + "@floating-ui/utils": "npm:^0.2.8" + checksum: 10/87d52989c3d2cc80373bc153b7a40814db3206ce7d0b2a2bdfb63e2ff39ffb8b999b1b0ccf28e548000ebf863bf16e2bed45eab4c4d287a5dbe974ef22368d82 + languageName: node + linkType: hard + "@floating-ui/dom@npm:^1.0.0": version: 1.6.8 resolution: "@floating-ui/dom@npm:1.6.8" @@ -7581,6 +8134,16 @@ __metadata: languageName: node linkType: hard +"@floating-ui/dom@npm:^1.6.10": + version: 1.6.12 + resolution: "@floating-ui/dom@npm:1.6.12" + dependencies: + "@floating-ui/core": "npm:^1.6.0" + "@floating-ui/utils": "npm:^0.2.8" + checksum: 10/5c8e5fdcd3843140a606ab6dc6c12ad740f44e66b898966ef877393faaede0bbe14586e1049e2c2f08856437da8847e884a2762e78275fefa65a5a9cd71e580d + languageName: node + linkType: hard + "@floating-ui/react-dom@npm:^2.0.0": version: 2.1.1 resolution: "@floating-ui/react-dom@npm:2.1.1" @@ -7593,7 +8156,7 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.1.2": +"@floating-ui/react-dom@npm:^2.1.1, @floating-ui/react-dom@npm:^2.1.2": version: 2.1.2 resolution: "@floating-ui/react-dom@npm:2.1.2" dependencies: @@ -7619,6 +8182,20 @@ __metadata: languageName: node linkType: hard +"@floating-ui/react@npm:^0.26.23": + version: 0.26.27 + resolution: "@floating-ui/react@npm:0.26.27" + dependencies: + "@floating-ui/react-dom": "npm:^2.1.2" + "@floating-ui/utils": "npm:^0.2.8" + tabbable: "npm:^6.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10/ab6d05e5cc2c29272a6830c06dff07e8330f2b90234674f2d74ed8084659ebe3ac9472770a5f0e76007dd2ae89f9da75189d188437aea4b8ac2789afc21bb6b2 + languageName: node + linkType: hard + "@floating-ui/utils@npm:^0.2.5": version: 0.2.5 resolution: "@floating-ui/utils@npm:0.2.5" @@ -7640,6 +8217,63 @@ __metadata: languageName: node linkType: hard +"@formatjs/ecma402-abstract@npm:2.2.3": + version: 2.2.3 + resolution: "@formatjs/ecma402-abstract@npm:2.2.3" + dependencies: + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/intl-localematcher": "npm:0.5.7" + tslib: "npm:2" + checksum: 10/d39e9f0d36c296a635f52aa35e07a67b6aa90383a30a046a0508e5d730676399fd0e67188eff463fe2a4d5febc9f567af45788fdf881e070910be7eb9294dd8c + languageName: node + linkType: hard + +"@formatjs/fast-memoize@npm:2.2.3": + version: 2.2.3 + resolution: "@formatjs/fast-memoize@npm:2.2.3" + dependencies: + tslib: "npm:2" + checksum: 10/a9634acb5e03d051e09881eea5484ab02271f7d6b5f96ae9485674ab3c359aa881bc45fc07a1181ae4b2d6e288dadc169f578d142d698913ebbefa373014cac2 + languageName: node + linkType: hard + +"@formatjs/icu-messageformat-parser@npm:2.9.3": + version: 2.9.3 + resolution: "@formatjs/icu-messageformat-parser@npm:2.9.3" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.3" + "@formatjs/icu-skeleton-parser": "npm:1.8.7" + tslib: "npm:2" + checksum: 10/b24a3db43e4bf612107e981d5b40c077543d2266a08aac5cf01d5f65bf60527d5d16795e2e30063cb180b1d36d401944cd2ffb3a19d79b0cd28fa59751d19b7c + languageName: node + linkType: hard + +"@formatjs/icu-skeleton-parser@npm:1.8.7": + version: 1.8.7 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.7" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.3" + tslib: "npm:2" + checksum: 10/1a39815e5048f3c12a8d6a5b553271437b62e302724fc15c3b6967dc3e24823fcd9b8d3231a064991e163c147e54e588c571a092d557e93e78e738d218c6ef43 + languageName: node + linkType: hard + +"@formatjs/intl-localematcher@npm:0.5.7": + version: 0.5.7 + resolution: "@formatjs/intl-localematcher@npm:0.5.7" + dependencies: + tslib: "npm:2" + checksum: 10/52201f12212e7e9cba1a4f99020da587b13e44e06e03c4ccd4e5ac0829b411e73dfe0904a9039ef81eeabeea04ed8cfae9e727e6791acd0230745b7bd3ad059e + languageName: node + linkType: hard + +"@formkit/auto-animate@npm:^0.8.2": + version: 0.8.2 + resolution: "@formkit/auto-animate@npm:0.8.2" + checksum: 10/4414fbc9d13ddf8f9e39adfa1a96a9d3affca8d5fb3b148bd4bb9149066910a179b8477a9ce0af51d2abb2ee8d126d25d290460845ed8018858c569eed15655f + languageName: node + linkType: hard + "@ganache/ethereum-address@npm:0.1.4": version: 0.1.4 resolution: "@ganache/ethereum-address@npm:0.1.4" @@ -7823,9 +8457,9 @@ __metadata: "@aws-sdk/client-s3": "npm:^3.577.0" "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" - "@hyperlane-xyz/registry": "npm:4.7.0" - "@hyperlane-xyz/sdk": "npm:6.0.0" - "@hyperlane-xyz/utils": "npm:6.0.0" + "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/sdk": "npm:7.1.0" + "@hyperlane-xyz/utils": "npm:7.1.0" "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" "@inquirer/prompts": "npm:^3.0.0" @@ -7860,13 +8494,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:5.7.1, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:5.8.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:6.0.0" + "@hyperlane-xyz/utils": "npm:7.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" @@ -7917,13 +8551,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/helloworld@npm:6.0.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:7.1.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: - "@hyperlane-xyz/core": "npm:5.7.1" - "@hyperlane-xyz/registry": "npm:4.7.0" - "@hyperlane-xyz/sdk": "npm:6.0.0" + "@hyperlane-xyz/core": "npm:5.8.1" + "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/sdk": "npm:7.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -7970,10 +8604,10 @@ __metadata: "@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/providers": "npm:^5.7.2" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:6.0.0" - "@hyperlane-xyz/registry": "npm:4.10.0" - "@hyperlane-xyz/sdk": "npm:6.0.0" - "@hyperlane-xyz/utils": "npm:6.0.0" + "@hyperlane-xyz/helloworld": "npm:7.1.0" + "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/sdk": "npm:7.1.0" + "@hyperlane-xyz/utils": "npm:7.1.0" "@inquirer/prompts": "npm:^5.3.8" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" @@ -8029,36 +8663,27 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/registry@npm:4.10.0": - version: 4.10.0 - resolution: "@hyperlane-xyz/registry@npm:4.10.0" - dependencies: - yaml: "npm:2.4.5" - zod: "npm:^3.21.2" - checksum: 10/22bb18f426cbada8b97db0894fe5d0980dfc08ecbd5174c978b7aeb6d8df9706f93d7e9cf0630644d2455ad05feee714dc2a38ec515a717b0b257184637902fb - languageName: node - linkType: hard - -"@hyperlane-xyz/registry@npm:4.7.0": - version: 4.7.0 - resolution: "@hyperlane-xyz/registry@npm:4.7.0" +"@hyperlane-xyz/registry@npm:6.1.0": + version: 6.1.0 + resolution: "@hyperlane-xyz/registry@npm:6.1.0" dependencies: yaml: "npm:2.4.5" zod: "npm:^3.21.2" - checksum: 10/d5b0090869417c3fc263c379791f439070113aee239990ffc20d9d90d74102b77008f3c630ce955a9b3f1f92f79b1df67d83a097b327cd5db2b01b382bf40f18 + checksum: 10/a0e1ecc02d83604793ddda0a3e00a9ffcaa38b1cddf9883b47cf8f1919b4474abd6cc2ee84846e6a35e1bc7539299b9bec92bfdf06be72beecff6aa44b73d382 languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:6.0.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:7.1.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: "@arbitrum/sdk": "npm:^4.0.0" "@aws-sdk/client-s3": "npm:^3.74.0" + "@chain-registry/types": "npm:^0.50.14" "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" - "@hyperlane-xyz/core": "npm:5.7.1" - "@hyperlane-xyz/utils": "npm:6.0.0" + "@hyperlane-xyz/core": "npm:5.8.1" + "@hyperlane-xyz/utils": "npm:7.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -8074,7 +8699,6 @@ __metadata: "@wagmi/chains": "npm:^1.8.0" bignumber.js: "npm:^9.1.1" chai: "npm:4.5.0" - coingecko-api-v3: "npm:^0.0.29" cosmjs-types: "npm:^0.9.0" cross-fetch: "npm:^3.1.5" dotenv: "npm:^10.0.0" @@ -8089,7 +8713,11 @@ __metadata: ts-node: "npm:^10.8.0" tsx: "npm:^4.7.1" typescript: "npm:5.3.3" +<<<<<<< HEAD viem: "npm:^1.20.0" +======= + viem: "npm:^2.21.45" +>>>>>>> origin/main yaml: "npm:2.4.5" zod: "npm:^3.21.2" peerDependencies: @@ -8098,7 +8726,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/utils@npm:6.0.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:7.1.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: @@ -8125,10 +8753,20 @@ __metadata: version: 0.0.0-use.local resolution: "@hyperlane-xyz/widgets@workspace:typescript/widgets" dependencies: + "@chakra-ui/react": "npm:^2.8.2" + "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" + "@cosmos-kit/react": "npm:^2.18.0" + "@emotion/react": "npm:^11.13.3" + "@emotion/styled": "npm:^11.13.0" "@headlessui/react": "npm:^2.1.8" - "@hyperlane-xyz/registry": "npm:4.7.0" - "@hyperlane-xyz/sdk": "npm:6.0.0" - "@hyperlane-xyz/utils": "npm:6.0.0" + "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/sdk": "npm:7.1.0" + "@hyperlane-xyz/utils": "npm:7.1.0" + "@interchain-ui/react": "npm:^1.23.28" + "@rainbow-me/rainbowkit": "npm:^2.2.0" + "@solana/wallet-adapter-react": "npm:^0.15.32" + "@solana/wallet-adapter-react-ui": "npm:^0.9.31" + "@solana/web3.js": "npm:^1.95.4" "@storybook/addon-essentials": "npm:^7.6.14" "@storybook/addon-interactions": "npm:^7.6.14" "@storybook/addon-links": "npm:^7.6.14" @@ -8137,6 +8775,7 @@ __metadata: "@storybook/react": "npm:^7.6.14" "@storybook/react-vite": "npm:^7.6.14" "@storybook/test": "npm:^7.6.14" + "@tanstack/react-query": "npm:^5.59.20" "@types/node": "npm:^18.11.18" "@types/react": "npm:^18.0.27" "@types/react-dom": "npm:^18.0.10" @@ -8147,7 +8786,10 @@ __metadata: clsx: "npm:^2.1.1" eslint: "npm:^8.57.0" eslint-config-prettier: "npm:^9.1.0" + eslint-plugin-react: "npm:^7.37.2" + eslint-plugin-react-hooks: "npm:^5.0.0" eslint-plugin-storybook: "npm:^0.6.15" + framer-motion: "npm:^10.16.4" postcss: "npm:^8.4.21" prettier: "npm:^2.8.8" react: "npm:^18.2.0" @@ -8157,7 +8799,9 @@ __metadata: tailwindcss: "npm:^3.4.13" ts-node: "npm:^10.8.0" typescript: "npm:5.3.3" + viem: "npm:^2.21.41" vite: "npm:^5.1.1" + wagmi: "npm:^2.12.26" peerDependencies: react: ^18 react-dom: ^18 @@ -8471,6 +9115,80 @@ __metadata: languageName: node linkType: hard +"@interchain-ui/react@npm:^1.23.28": + version: 1.26.1 + resolution: "@interchain-ui/react@npm:1.26.1" + dependencies: + "@floating-ui/core": "npm:^1.6.7" + "@floating-ui/dom": "npm:^1.6.10" + "@floating-ui/react": "npm:^0.26.23" + "@floating-ui/react-dom": "npm:^2.1.1" + "@floating-ui/utils": "npm:^0.2.7" + "@formkit/auto-animate": "npm:^0.8.2" + "@react-aria/listbox": "npm:^3.13.3" + "@react-aria/overlays": "npm:^3.23.2" + "@react-aria/utils": "npm:^3.25.2" + "@tanstack/react-virtual": "npm:^3.10.5" + "@vanilla-extract/css": "npm:^1.15.5" + "@vanilla-extract/css-utils": "npm:^0.1.4" + "@vanilla-extract/dynamic": "npm:^2.1.2" + "@vanilla-extract/private": "npm:^1.0.6" + "@vanilla-extract/recipes": "npm:^0.5.5" + animejs: "npm:^3.2.2" + bignumber.js: "npm:^9.1.2" + client-only: "npm:^0.0.1" + clsx: "npm:^2.1.1" + copy-to-clipboard: "npm:^3.3.3" + immer: "npm:^10.1.1" + lodash: "npm:^4.17.21" + rainbow-sprinkles: "npm:^0.17.3" + react-aria: "npm:^3.34.3" + react-stately: "npm:^3.32.2" + zustand: "npm:^4.5.5" + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 + checksum: 10/30bc0bc47799586f9eb58ed955aa2dc640dce1674653c87603a838462f3bacaaf64ae3202731f86b60aaff7393bf066b472657f51a3e2272e95e3df23b0a878a + languageName: node + linkType: hard + +"@internationalized/date@npm:^3.5.6": + version: 3.5.6 + resolution: "@internationalized/date@npm:3.5.6" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/54734b53ca74a32aae368a8f963324352b1fd5b13029b6e82555307b8f2ff355658c90e82a4f38f154a3edf874387d1efd26fc80f2edd068ce04f48f6467f26c + languageName: node + linkType: hard + +"@internationalized/message@npm:^3.1.5": + version: 3.1.5 + resolution: "@internationalized/message@npm:3.1.5" + dependencies: + "@swc/helpers": "npm:^0.5.0" + intl-messageformat: "npm:^10.1.0" + checksum: 10/210951fd8055af4db70d465e49bcbbdf2545ed223b936af9c1f18b745a51689ecb0ca49cbd5ee2dbfeccce2447808b7fe309bd12ee81f7e09283f20bf04200e9 + languageName: node + linkType: hard + +"@internationalized/number@npm:^3.5.4": + version: 3.5.4 + resolution: "@internationalized/number@npm:3.5.4" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/16641aecb58c075a6322dc6b36a2c6e521845296f81b86a128d015f072d1af998289b71b4d8b9521e7576bdeabfaf8067a3e741b0116c8595d82a4461c1ae03b + languageName: node + linkType: hard + +"@internationalized/string@npm:^3.2.4": + version: 3.2.4 + resolution: "@internationalized/string@npm:3.2.4" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/5fdb7f0bf7fa7055cdf62ded4efd6849d3db9cf0e6d53f349889e2ec9517b9135ad38a6bb8dcf25142c69c381618c0dd1a6a072117dd7cf2867ce17374f0f835 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -8915,6 +9633,91 @@ __metadata: languageName: node linkType: hard +"@keplr-wallet/common@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/common@npm:0.12.28" + dependencies: + "@keplr-wallet/crypto": "npm:0.12.28" + "@keplr-wallet/types": "npm:0.12.28" + buffer: "npm:^6.0.3" + delay: "npm:^4.4.0" + mobx: "npm:^6.1.7" + checksum: 10/32efe4a89290c89aa5a593a0fa4bf635c0c5b8814d61b80ecc3baea837d2733a355db4cb057184227cf1712658795978cd66e7797574d639e6ba9dbcb7fde3d2 + languageName: node + linkType: hard + +"@keplr-wallet/cosmos@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/cosmos@npm:0.12.28" + dependencies: + "@ethersproject/address": "npm:^5.6.0" + "@keplr-wallet/common": "npm:0.12.28" + "@keplr-wallet/crypto": "npm:0.12.28" + "@keplr-wallet/proto-types": "npm:0.12.28" + "@keplr-wallet/simple-fetch": "npm:0.12.28" + "@keplr-wallet/types": "npm:0.12.28" + "@keplr-wallet/unit": "npm:0.12.28" + bech32: "npm:^1.1.4" + buffer: "npm:^6.0.3" + long: "npm:^4.0.0" + protobufjs: "npm:^6.11.2" + checksum: 10/685e84369f9fa0fd0e292e8c5031b8aa7ee2998285727eb31436b1f7a862e97c6731de6f84fd66ef4a20f0731c013f2f46296f57b7bf52ace6a874c8540004b8 + languageName: node + linkType: hard + +"@keplr-wallet/crypto@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/crypto@npm:0.12.28" + dependencies: + "@ethersproject/keccak256": "npm:^5.5.0" + bip32: "npm:^2.0.6" + bip39: "npm:^3.0.3" + bs58check: "npm:^2.1.2" + buffer: "npm:^6.0.3" + crypto-js: "npm:^4.0.0" + elliptic: "npm:^6.5.3" + sha.js: "npm:^2.4.11" + checksum: 10/76e5cf1c60b5108b9fb5bb5b8a841e6e51cbca76e0707198bef16bf6073cf574baee020216ead8acea8e5e60ee4f7386ee2c290bacfbe333ec1dfc849d942347 + languageName: node + linkType: hard + +"@keplr-wallet/proto-types@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/proto-types@npm:0.12.28" + dependencies: + long: "npm:^4.0.0" + protobufjs: "npm:^6.11.2" + checksum: 10/0537db803ce9a295443c206180220e932798f2769aaa8b552a3d99cbfa3f052ddace0dd50d09eb28bdd32c7d1ca3e10dcd2012c1611575da42650f478b162d5d + languageName: node + linkType: hard + +"@keplr-wallet/simple-fetch@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/simple-fetch@npm:0.12.28" + checksum: 10/36f8d769098b309a5069b992ffc3ed562e97d4e2553d04a97c0f55c423b80435d3b8c38f4ed57b5255c2342bf1675e2eb5cb64f158a6499e753b7e96ca90ef18 + languageName: node + linkType: hard + +"@keplr-wallet/types@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/types@npm:0.12.28" + dependencies: + long: "npm:^4.0.0" + checksum: 10/17ee47aac5690b89feb2109fb901a9af81ad7f94b743ba5de0203b051f7977941a78d3da70ef4ae5c2d82af0afd2de8de156f027c95c05d4f1a1fed39ea2df7d + languageName: node + linkType: hard + +"@keplr-wallet/unit@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/unit@npm:0.12.28" + dependencies: + "@keplr-wallet/types": "npm:0.12.28" + big-integer: "npm:^1.6.48" + utility-types: "npm:^3.10.0" + checksum: 10/f18361c2bdc2b59c0b7c3340466cab50d12634056ed89aee8363414e65eb314b570e43d019107c8ae6ee67e533b1b5e5bfa3beaec313763e68297bb9a3d6a3e8 + languageName: node + linkType: hard + "@layerzerolabs/lz-evm-messagelib-v2@npm:^2.0.2": version: 2.0.6 resolution: "@layerzerolabs/lz-evm-messagelib-v2@npm:2.0.6" @@ -9092,6 +9895,22 @@ __metadata: languageName: node linkType: hard +"@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": + version: 1.2.1 + resolution: "@lit-labs/ssr-dom-shim@npm:1.2.1" + checksum: 10/48e28c1f132eb1d5b385454dd23db2837bf913d108a0908e73816ceb594b1b09db34e05ccb86a18fb9c02fc100d62bbab350b6ec88e2c175f2c21c5f0220bfdd + languageName: node + linkType: hard + +"@lit/reactive-element@npm:^1.3.0, @lit/reactive-element@npm:^1.6.0": + version: 1.6.3 + resolution: "@lit/reactive-element@npm:1.6.3" + dependencies: + "@lit-labs/ssr-dom-shim": "npm:^1.0.0" + checksum: 10/664c899bb0b144590dc4faf83b358b1504810eac107778c3aeb384affc65a7ef4eda754944bcc34a57237db03dff145332406345ac24da19ca37cf4b3cb343d3 + languageName: node + linkType: hard + "@manypkg/find-root@npm:^1.1.0": version: 1.1.0 resolution: "@manypkg/find-root@npm:1.1.0" @@ -9130,6 +9949,17 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-json-rpc-provider@npm:^1.0.0": + version: 1.0.1 + resolution: "@metamask/eth-json-rpc-provider@npm:1.0.1" + dependencies: + "@metamask/json-rpc-engine": "npm:^7.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" + checksum: 10/4ed1a96afc32eb46f585ff54e16cb2aee2e7027dcf6a142d875b9c6248f15c9a00dd1df43035f2e64efbf01a96954040699d9d97e3b483c958f5b1d6c0fa6f50 + languageName: node + linkType: hard + "@metamask/eth-sig-util@npm:^4.0.0": version: 4.0.1 resolution: "@metamask/eth-sig-util@npm:4.0.1" @@ -9143,6 +9973,318 @@ __metadata: languageName: node linkType: hard +"@metamask/json-rpc-engine@npm:^7.0.0": + version: 7.3.3 + resolution: "@metamask/json-rpc-engine@npm:7.3.3" + dependencies: + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + checksum: 10/116664c974c522d280335d9a02cba731e4f08562c2980415f7535513cd308c7e612e52618086996e5ac2b67db7f1e6ac1bd8201aba7825163db17a25f2874cc9 + languageName: node + linkType: hard + +"@metamask/json-rpc-engine@npm:^8.0.1, @metamask/json-rpc-engine@npm:^8.0.2": + version: 8.0.2 + resolution: "@metamask/json-rpc-engine@npm:8.0.2" + dependencies: + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + checksum: 10/f088f4b648b9b55875b56e8237853e7282f13302a9db6a1f9bba06314dfd6cd0a23b3d27f8fde05a157b97ebb03b67bc2699ba455c99553dfb2ecccd73ab3474 + languageName: node + linkType: hard + +"@metamask/json-rpc-middleware-stream@npm:^7.0.1": + version: 7.0.2 + resolution: "@metamask/json-rpc-middleware-stream@npm:7.0.2" + dependencies: + "@metamask/json-rpc-engine": "npm:^8.0.2" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + readable-stream: "npm:^3.6.2" + checksum: 10/850a857418fc6b8c73fb4f978b76d2cdc0372ccb2f0f7e6f0229117882a4687d716fc37638483c9ac1338f7957b3f8207bc6be8a3d4c0708339fe9dfc3510fe0 + languageName: node + linkType: hard + +"@metamask/object-multiplex@npm:^2.0.0": + version: 2.1.0 + resolution: "@metamask/object-multiplex@npm:2.1.0" + dependencies: + once: "npm:^1.4.0" + readable-stream: "npm:^3.6.2" + checksum: 10/e119f695e89eb20c3174f8ac6d74587498d85cff92c37e83e167cb758b3d3147d5b5e1a997d6198d430ebcf2cede6265bf5d4513fe96dbb2d82bbc6167752caa + languageName: node + linkType: hard + +"@metamask/onboarding@npm:^1.0.1": + version: 1.0.1 + resolution: "@metamask/onboarding@npm:1.0.1" + dependencies: + bowser: "npm:^2.9.0" + checksum: 10/2aa288e58fc34cb4708e311fc08abd33a0d9bc67671610955a2bd8d43a16330261f1159174c365611e249751ec984da9a9cb963bb0a87b3a6945d7caa6cc8799 + languageName: node + linkType: hard + +"@metamask/providers@npm:16.1.0": + version: 16.1.0 + resolution: "@metamask/providers@npm:16.1.0" + dependencies: + "@metamask/json-rpc-engine": "npm:^8.0.1" + "@metamask/json-rpc-middleware-stream": "npm:^7.0.1" + "@metamask/object-multiplex": "npm:^2.0.0" + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/safe-event-emitter": "npm:^3.1.1" + "@metamask/utils": "npm:^8.3.0" + detect-browser: "npm:^5.2.0" + extension-port-stream: "npm:^3.0.0" + fast-deep-equal: "npm:^3.1.3" + is-stream: "npm:^2.0.0" + readable-stream: "npm:^3.6.2" + webextension-polyfill: "npm:^0.10.0" + checksum: 10/596bcc0206355e5698cc41458b07caa748f589790e1a3210f1a32d21103a3318902d953a641d4583b8179d653659ba29c42e65fba019a98533bdcf68316bf915 + languageName: node + linkType: hard + +"@metamask/rpc-errors@npm:^6.2.1": + version: 6.4.0 + resolution: "@metamask/rpc-errors@npm:6.4.0" + dependencies: + "@metamask/utils": "npm:^9.0.0" + fast-safe-stringify: "npm:^2.0.6" + checksum: 10/9a17525aa8ce9ac142a94c04000dba7f0635e8e155c6c045f57eca36cc78c255318cca2fad4571719a427dfd2df64b70bc6442989523a8de555480668d666ad5 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^2.0.0": + version: 2.0.0 + resolution: "@metamask/safe-event-emitter@npm:2.0.0" + checksum: 10/3e4f00c64aa1ddf9b9ae5c2337fb8cee359b6c481ded0ec21ef70610960c51cdcc4a9b569de334dcd7cb1fe445cafd298360907c1e211e244c5990b55246f350 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^3.0.0, @metamask/safe-event-emitter@npm:^3.1.1": + version: 3.1.2 + resolution: "@metamask/safe-event-emitter@npm:3.1.2" + checksum: 10/8ef7579f9317eb5c94ecf3e6abb8d13b119af274b678805eac76abe4c0667bfdf539f385e552bb973e96333b71b77aa7c787cb3fce9cd5fb4b00f1dbbabf880d + languageName: node + linkType: hard + +"@metamask/sdk-communication-layer@npm:0.30.0": + version: 0.30.0 + resolution: "@metamask/sdk-communication-layer@npm:0.30.0" + dependencies: + bufferutil: "npm:^4.0.8" + date-fns: "npm:^2.29.3" + debug: "npm:^4.3.4" + utf-8-validate: "npm:^5.0.2" + uuid: "npm:^8.3.2" + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: ^0.3.16 + eventemitter2: ^6.4.7 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + checksum: 10/a68f67abbff258f89d3179869f85f7353e36ea26d2ba1e226a43959701207dff1015c5c2536a2a7afd72c8414131e451c84df9b926079f8b930c299328342b92 + languageName: node + linkType: hard + +"@metamask/sdk-install-modal-web@npm:0.30.0": + version: 0.30.0 + resolution: "@metamask/sdk-install-modal-web@npm:0.30.0" + dependencies: + qr-code-styling: "npm:^1.6.0-rc.1" + peerDependencies: + i18next: 23.11.5 + react: ^18.2.0 + react-dom: ^18.2.0 + react-native: "*" + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + react-native: + optional: true + checksum: 10/b1ea701706fcbb734c6e780bb3a28e4fe2cea99b8e03faf4330b0fe2682b0ec31d35c79fab4bd007584937d32602f4eb0f09ae1c1dd0fdec927de229014e1c6d + languageName: node + linkType: hard + +"@metamask/sdk@npm:0.30.1": + version: 0.30.1 + resolution: "@metamask/sdk@npm:0.30.1" + dependencies: + "@metamask/onboarding": "npm:^1.0.1" + "@metamask/providers": "npm:16.1.0" + "@metamask/sdk-communication-layer": "npm:0.30.0" + "@metamask/sdk-install-modal-web": "npm:0.30.0" + bowser: "npm:^2.9.0" + cross-fetch: "npm:^4.0.0" + debug: "npm:^4.3.4" + eciesjs: "npm:^0.4.8" + eth-rpc-errors: "npm:^4.0.3" + eventemitter2: "npm:^6.4.7" + i18next: "npm:23.11.5" + i18next-browser-languagedetector: "npm:7.1.0" + obj-multiplex: "npm:^1.0.0" + pump: "npm:^3.0.0" + qrcode-terminal-nooctal: "npm:^0.12.1" + react-native-webview: "npm:^11.26.0" + readable-stream: "npm:^3.6.2" + socket.io-client: "npm:^4.5.1" + util: "npm:^0.12.4" + uuid: "npm:^8.3.2" + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 10/a30e975de75493daefcd34eebf37ebbe13a9aa811cf5acb82f727742f86fdef3a051f9abd209478e0f9c65efa0d4ea5010d4efcdb0d5701c05e317172ac30dfc + languageName: node + linkType: hard + +"@metamask/superstruct@npm:^3.0.0, @metamask/superstruct@npm:^3.1.0": + version: 3.1.0 + resolution: "@metamask/superstruct@npm:3.1.0" + checksum: 10/5066fe228d5f11da387606d7f9545de2b473ab5a9e0f1bb8aea2f52d3e2c9d25e427151acde61f4a2de80a07a9871fe9505ad06abca6a61b7c3b54ed5c403b01 + languageName: node + linkType: hard + +"@metamask/utils@npm:^5.0.1": + version: 5.0.2 + resolution: "@metamask/utils@npm:5.0.2" + dependencies: + "@ethereumjs/tx": "npm:^4.1.2" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + semver: "npm:^7.3.8" + superstruct: "npm:^1.0.3" + checksum: 10/c0d3ee4c3144b557936ab01c1a64950c0f99782bd0cf5596c0fabe8fd224dba48ed3483c0ea954791fe2ee81064a445adb489df50c776bbbeb67b5b96e930115 + languageName: node + linkType: hard + +"@metamask/utils@npm:^8.3.0": + version: 8.5.0 + resolution: "@metamask/utils@npm:8.5.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.0.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/68a42a55f7dc750b75467fb7c05a496c20dac073a2753e0f4d9642c4d8dcb3f9ddf51a09d30337e11637f1777f3dfe22e15b5159dbafb0fdb7bd8c9236056153 + languageName: node + linkType: hard + +"@metamask/utils@npm:^9.0.0": + version: 9.3.0 + resolution: "@metamask/utils@npm:9.3.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/ed6648cd973bbf3b4eb0e862903b795a99d27784c820e19f62f0bc0ddf353e98c2858d7e9aaebc0249a586391b344e35b9249d13c08e3ea0c74b23dc1c6b1558 + languageName: node + linkType: hard + +"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/animation@npm:10.18.0" + dependencies: + "@motionone/easing": "npm:^10.18.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" + tslib: "npm:^2.3.1" + checksum: 10/c7fc04dd10d6cade3d3b63d26f2532a2b2731233afc0454722e55ad8061fb3923d926db9cc09f1bcedb39f504fcee1e80adaab270523846998aad3017364a583 + languageName: node + linkType: hard + +"@motionone/dom@npm:^10.16.2, @motionone/dom@npm:^10.16.4": + version: 10.18.0 + resolution: "@motionone/dom@npm:10.18.0" + dependencies: + "@motionone/animation": "npm:^10.18.0" + "@motionone/generators": "npm:^10.18.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" + hey-listen: "npm:^1.0.8" + tslib: "npm:^2.3.1" + checksum: 10/18abb5c174a84c90b2e59459fa3a9f8b655d063c259f2f3be5b6740e660285d2f66a8b25437dd963c3b9cdeae9fa5984ee8d217881088ea4d392cf39f8493a84 + languageName: node + linkType: hard + +"@motionone/easing@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/easing@npm:10.18.0" + dependencies: + "@motionone/utils": "npm:^10.18.0" + tslib: "npm:^2.3.1" + checksum: 10/a455a06ccee907ce9da7b1dfe392060a473132733e3f92bbee3a99c36af7baa333cf3c6e38c6d44ad0f9878fdafca3c3f4bcfe55aaeb2a633e45d8e0429f8fa5 + languageName: node + linkType: hard + +"@motionone/generators@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/generators@npm:10.18.0" + dependencies: + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" + tslib: "npm:^2.3.1" + checksum: 10/149720881e8db6a1ff38cea98349c3a00f72e5318b645459b68a2aeddb1f2be63ad2ae8978f6c4a63e2414f39e65f06de13a43fd35cf24dc3fb3e3c7f87526bc + languageName: node + linkType: hard + +"@motionone/svelte@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/svelte@npm:10.16.4" + dependencies: + "@motionone/dom": "npm:^10.16.4" + tslib: "npm:^2.3.1" + checksum: 10/5ad532d4d9bb16a9f311487e6409fa7e1a66ec12f82e3c36434ab6dfe3cedc61b35dae6314cee4fba8dca463b8a259cafb83801a932b7ad5f4a6e45baaa581f4 + languageName: node + linkType: hard + +"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.1": + version: 10.17.1 + resolution: "@motionone/types@npm:10.17.1" + checksum: 10/21d92d733ba30f810b72609fe04f2ef86125ba0160b826974605cc4cc5fbb6ab7bbf1640cbc64fd6298eb8d36fb920ad3ca646c76adf0e2c47a4920200616952 + languageName: node + linkType: hard + +"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/utils@npm:10.18.0" + dependencies: + "@motionone/types": "npm:^10.17.1" + hey-listen: "npm:^1.0.8" + tslib: "npm:^2.3.1" + checksum: 10/0fa9232d132383880d6004522ded763d60f490946584e02bca7f64df98fae07421071f3a85de06aa6ecb52632a47a7586b4143e824e459a87cc852fab657e549 + languageName: node + linkType: hard + +"@motionone/vue@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/vue@npm:10.16.4" + dependencies: + "@motionone/dom": "npm:^10.16.4" + tslib: "npm:^2.3.1" + checksum: 10/2400d31bbf5c3e02bc68f4b88d96d9c0672ba646bca0b6566e555cd7e8f14849a645f558f574e658fd90574a0b548b61712ae5edcee055c60288fd9382d711ea + languageName: node + linkType: hard + "@ndelangen/get-tarball@npm:^3.0.7": version: 3.0.9 resolution: "@ndelangen/get-tarball@npm:3.0.9" @@ -9154,9 +10296,31 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": version: 1.2.0 resolution: "@noble/curves@npm:1.2.0" +======= +"@noble/ciphers@npm:^1.0.0": + version: 1.0.0 + resolution: "@noble/ciphers@npm:1.0.0" + checksum: 10/0a03d2bfac316f6f235ae4cdbeeba372f8d32997239c27cb56d55cbd3d42e0f867e8d7c8d76716f5f645bb7d5d73f05ba1f2d2e7d8391e86936e3b97021bfcf6 + languageName: node + linkType: hard + +"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": + version: 1.4.2 + resolution: "@noble/curves@npm:1.4.2" + dependencies: + "@noble/hashes": "npm:1.4.0" + checksum: 10/f433a2e8811ae345109388eadfa18ef2b0004c1f79417553241db4f0ad0d59550be6298a4f43d989c627e9f7551ffae6e402a4edf0173981e6da95fc7cab5123 + languageName: node + linkType: hard + +"@noble/curves@npm:1.6.0, @noble/curves@npm:^1.1.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:^1.4.2, @noble/curves@npm:^1.6.0, @noble/curves@npm:~1.6.0": + version: 1.6.0 + resolution: "@noble/curves@npm:1.6.0" +>>>>>>> origin/main dependencies: "@noble/hashes": "npm:1.3.2" checksum: 10/94e02e9571a9fd42a3263362451849d2f54405cb3ce9fa7c45bc6b9b36dcd7d1d20e2e1e14cfded24937a13d82f1e60eefc4d7a14982ce0bc219a9fc0f51d1f9 @@ -9186,7 +10350,25 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@noble/hashes@npm:1.3.2, @noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0, @noble/hashes@npm:^1.3.1": +======= +"@noble/hashes@npm:1.4.0, @noble/hashes@npm:~1.4.0": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 10/e156e65794c473794c52fa9d06baf1eb20903d0d96719530f523cc4450f6c721a957c544796e6efd0197b2296e7cd70efeb312f861465e17940a3e3c7e0febc6 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.5.0, @noble/hashes@npm:^1.2.0, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:~1.5.0": + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 10/da7fc7af52af7afcf59810a7eea6155075464ff462ffda2572dc6d57d53e2669b1ea2ec774e814f6273f1697e567f28d36823776c9bf7068cba2a2855140f26e + languageName: node + linkType: hard + +"@noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0, @noble/hashes@npm:^1.3.1": +>>>>>>> origin/main version: 1.3.2 resolution: "@noble/hashes@npm:1.3.2" checksum: 10/685f59d2d44d88e738114b71011d343a9f7dce9dfb0a121f1489132f9247baa60bc985e5ec6f3213d114fbd1e1168e7294644e46cbd0ce2eba37994f28eeb51b @@ -9875,6 +11057,161 @@ __metadata: languageName: node linkType: hard +"@parcel/watcher-android-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-android-arm64@npm:2.5.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-wasm@npm:^2.4.1": + version: 2.5.0 + resolution: "@parcel/watcher-wasm@npm:2.5.0" + dependencies: + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + napi-wasm: "npm:^1.1.0" + checksum: 10/2e17915320267b6d6305406a4b59cb0b0e88eb93ba6acc61c5382c517421a9132992fb8d1468a0030ee9945a1d6216ee6112452e78b30089590cd206c49d98a0 + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-x64@npm:2.5.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.1": + version: 2.5.0 + resolution: "@parcel/watcher@npm:2.5.0" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-x64": "npm:2.5.0" + "@parcel/watcher-freebsd-x64": "npm:2.5.0" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm-musl": "npm:2.5.0" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-x64-musl": "npm:2.5.0" + "@parcel/watcher-win32-arm64": "npm:2.5.0" + "@parcel/watcher-win32-ia32": "npm:2.5.0" + "@parcel/watcher-win32-x64": "npm:2.5.0" + detect-libc: "npm:^1.0.3" + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm-musl": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 10/1e28b1aa9a63456ebfa7af3e41297d088bd31d9e32548604f4f26ed96c5808f4330cd515062e879c24a9eaab7894066c8a3951ee30b59e7cbe6786ab2c790dae + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -9909,6 +11246,13 @@ __metadata: languageName: node linkType: hard +"@popperjs/core@npm:^2.11.8": + version: 2.11.8 + resolution: "@popperjs/core@npm:2.11.8" + checksum: 10/ddd16090cde777aaf102940f05d0274602079a95ad9805bd20bc55dcc7c3a2ba1b99dd5c73e5cc2753c3d31250ca52a67d58059459d7d27debb983a9f552936c + languageName: node + linkType: hard + "@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": version: 1.1.2 resolution: "@protobufjs/aspromise@npm:1.1.2" @@ -10703,6 +12047,219 @@ __metadata: languageName: node linkType: hard +"@rainbow-me/rainbowkit@npm:^2.2.0": + version: 2.2.0 + resolution: "@rainbow-me/rainbowkit@npm:2.2.0" + dependencies: + "@vanilla-extract/css": "npm:1.15.5" + "@vanilla-extract/dynamic": "npm:2.1.2" + "@vanilla-extract/sprinkles": "npm:1.6.3" + clsx: "npm:2.1.1" + qrcode: "npm:1.5.4" + react-remove-scroll: "npm:2.6.0" + ua-parser-js: "npm:^1.0.37" + peerDependencies: + "@tanstack/react-query": ">=5.0.0" + react: ">=18" + react-dom: ">=18" + viem: 2.x + wagmi: ^2.9.0 + checksum: 10/5848d39c2b34b533481ed636e44de2cde9d25cbe3fc5bebd77ce1e60ebddcb5cbfc3bfc3ecbc93a74c0fc8ddff4a4b098e2174b6a35a45231a0351e54ccd3ed4 + languageName: node + linkType: hard + +"@react-aria/breadcrumbs@npm:^3.5.18": + version: 3.5.18 + resolution: "@react-aria/breadcrumbs@npm:3.5.18" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/link": "npm:^3.7.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/breadcrumbs": "npm:^3.7.8" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4f4eaa50606a725bc00e95cc2123bed3db32c03c4a93067aeac12ea1d577cde34f2b4021f0eaace3a4e35dd77a0d36ad057449e7f50dbff1964d2de82f3aa9a0 + languageName: node + linkType: hard + +"@react-aria/button@npm:^3.10.1": + version: 3.10.1 + resolution: "@react-aria/button@npm:3.10.1" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/da59869337fb810adf4fef3f10a8b687604193533deec347e1f67ce48b04a2a07b4b83ef463f5b03fa6134e254fad0afc3a94e63cbda59022fbb09e3b99f7f5b + languageName: node + linkType: hard + +"@react-aria/calendar@npm:^3.5.13": + version: 3.5.13 + resolution: "@react-aria/calendar@npm:3.5.13" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/calendar": "npm:^3.5.5" + "@react-types/button": "npm:^3.10.0" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8e5d5a556d9b94e0f98452944f409d189cab20111ea87ef1151c27763236cd778dc836d63a49832d792279ab2a6dc5cffb01fa099073986b1dac58f0d41af7ee + languageName: node + linkType: hard + +"@react-aria/checkbox@npm:^3.14.8": + version: 3.14.8 + resolution: "@react-aria/checkbox@npm:3.14.8" + dependencies: + "@react-aria/form": "npm:^3.0.10" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/toggle": "npm:^3.10.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/checkbox": "npm:^3.6.9" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4389f9650da1a58c027ac63ce7973c6886ba0d9b3c19d2267e2e0c08f64aa0f97070c2a67d74b2d1758f9b50ca009ed2f2a5999dca5a6f392c163b7e0c4a9b23 + languageName: node + linkType: hard + +"@react-aria/color@npm:^3.0.1": + version: 3.0.1 + resolution: "@react-aria/color@npm:3.0.1" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/numberfield": "npm:^3.11.8" + "@react-aria/slider": "npm:^3.7.13" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/color": "npm:^3.8.0" + "@react-stately/form": "npm:^3.0.6" + "@react-types/color": "npm:^3.0.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5a805e173fe48db2ef5e550fee96829891d527be190d6af2c7d6ce66db6a04c6a3524148576f6e86d99dff43b8475493a428f81a07676a0d954611f45fe304ef + languageName: node + linkType: hard + +"@react-aria/combobox@npm:^3.10.5": + version: 3.10.5 + resolution: "@react-aria/combobox@npm:3.10.5" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/combobox": "npm:^3.10.0" + "@react-stately/form": "npm:^3.0.6" + "@react-types/button": "npm:^3.10.0" + "@react-types/combobox": "npm:^3.13.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8267d6dc11fdaef68cbabce8d17f4d9f4943e3eb7de8cad93e316a4f3fd0d68334b68e01a9e9bc3ed6f4f09b2e5c6f6c497d49b2544a15242dec64ee8a7b84e5 + languageName: node + linkType: hard + +"@react-aria/datepicker@npm:^3.11.4": + version: 3.11.4 + resolution: "@react-aria/datepicker@npm:3.11.4" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/datepicker": "npm:^3.10.3" + "@react-stately/form": "npm:^3.0.6" + "@react-types/button": "npm:^3.10.0" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/datepicker": "npm:^3.8.3" + "@react-types/dialog": "npm:^3.5.13" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/11a6f8249139ca902bad9ec5b52a252ed08635afbcebd4a5516359e6b79487b70a42d000b0cf11c40cf4b4c3cb2e5a34aae9b702c67f0b20420086ac6b6b4233 + languageName: node + linkType: hard + +"@react-aria/dialog@npm:^3.5.19": + version: 3.5.19 + resolution: "@react-aria/dialog@npm:3.5.19" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/dialog": "npm:^3.5.13" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/44eba70f927cbdb003da37021ee6dde363abfa3c179437d83e19c72931c0fab12db20dbd603578d372df534ddce119e22b6908935544ce7a696523aa71b72e2e + languageName: node + linkType: hard + +"@react-aria/dnd@npm:^3.7.4": + version: 3.7.4 + resolution: "@react-aria/dnd@npm:3.7.4" + dependencies: + "@internationalized/string": "npm:^3.2.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/dnd": "npm:^3.4.3" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/02ea56a553a79bc9669e1ed1fbfec5d073e0627262112a215f9c8789c069cb8393f3ee761860e369601939a2f7f15a1462ca1e5ada1a8373bd29a21517e2dfae + languageName: node + linkType: hard + "@react-aria/focus@npm:^3.17.1": version: 3.18.2 resolution: "@react-aria/focus@npm:3.18.2" @@ -10718,6 +12275,100 @@ __metadata: languageName: node linkType: hard +"@react-aria/focus@npm:^3.18.4": + version: 3.18.4 + resolution: "@react-aria/focus@npm:3.18.4" + dependencies: + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + clsx: "npm:^2.0.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/912cd8a98cbe978240991bec8077c7956ca03ee78cb10152c7a1131a53fb622a5c9b87a4047909f032a7550c37ed9ec50488437a17c761c5c852b721cbaa0bd2 + languageName: node + linkType: hard + +"@react-aria/form@npm:^3.0.10": + version: 3.0.10 + resolution: "@react-aria/form@npm:3.0.10" + dependencies: + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/339b75055b9332e6f082dccf3b3d8c5fb2b5f72ab65a2b1f2e17ac2d2140dde543f18b36501378e7ee4703e4dee49a1dc324ddea2f42614f6c11a827c72856c8 + languageName: node + linkType: hard + +"@react-aria/grid@npm:^3.10.5": + version: 3.10.5 + resolution: "@react-aria/grid@npm:3.10.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/grid": "npm:^3.9.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/bbfccebfdc0aafb53d21f5bdc0b3e96ecd2e7d197c277938e6d373fdc560496cd633358aeb03ec3c2b020d2f7a2ddddb2bc3ab2c7fbc4d95a4403fee0dca1a2b + languageName: node + linkType: hard + +"@react-aria/gridlist@npm:^3.9.5": + version: 3.9.5 + resolution: "@react-aria/gridlist@npm:3.9.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/grid": "npm:^3.10.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a36d1028bf1affa6d628326ce1af303dbc2691d14e02f154563fe4177bfae3116fbef69282898a1bfeaf8d1c6c0f04e28ab2335e0cd09506a64a9b1a084987e7 + languageName: node + linkType: hard + +"@react-aria/i18n@npm:^3.12.3": + version: 3.12.3 + resolution: "@react-aria/i18n@npm:3.12.3" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/message": "npm:^3.1.5" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/54f111d9a9da68edcb8b821f7c8ead92f0c4d85307dbabee78bc5c89f5a19cdfa406b1e40b7c6f9dc26f7cedce4c9c5a10f8dcdae289e5a404c07b6fdda98aba + languageName: node + linkType: hard + "@react-aria/interactions@npm:^3.21.3, @react-aria/interactions@npm:^3.22.2": version: 3.22.2 resolution: "@react-aria/interactions@npm:3.22.2" @@ -10732,6 +12383,306 @@ __metadata: languageName: node linkType: hard +"@react-aria/interactions@npm:^3.22.4": + version: 3.22.4 + resolution: "@react-aria/interactions@npm:3.22.4" + dependencies: + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/095d084bd642b47a5cc2a846fa50e0953682ddcad694cc78df344b1f235e292945746692f84d27f465f7ff0117b485c3f5b69f050be196df0c3e7343d3239551 + languageName: node + linkType: hard + +"@react-aria/label@npm:^3.7.12": + version: 3.7.12 + resolution: "@react-aria/label@npm:3.7.12" + dependencies: + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f93475462e0b962e9447f4c13c6d6ed0862e56c02747f87a81c986f6abaa1226fd215d5a32844e94b0a032cba36f80b3b6e05eed2926553cd30ab631a791bb64 + languageName: node + linkType: hard + +"@react-aria/link@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-aria/link@npm:3.7.6" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/link": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c14fb2abbd5c6b3f539fce11c244aa36f698ba6cb8dd591a0a79b2aedd499d81b1c2c6af03fa29a1531509bb9194483805c30773f17be015fbc9ccbac47b5023 + languageName: node + linkType: hard + +"@react-aria/listbox@npm:^3.13.3, @react-aria/listbox@npm:^3.13.5": + version: 3.13.5 + resolution: "@react-aria/listbox@npm:3.13.5" + dependencies: + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/list": "npm:^3.11.0" + "@react-types/listbox": "npm:^3.5.2" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/631ec625e0c3e9db0fa2701bd288f093128e4b49558129467d34dee0748eb6ac371bf63f716ef62fbdff9e4f5d4a33e0ca1b45aae1213c7f624f799b2f0ec4b6 + languageName: node + linkType: hard + +"@react-aria/live-announcer@npm:^3.4.0": + version: 3.4.0 + resolution: "@react-aria/live-announcer@npm:3.4.0" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/d5fdd048eaaf2d048881d5b8fec369e558c039a4461908b10a28f2d7dc39b94b3b7b1eb385f9e577f7cf6e5f8e0e233facfbed0da98df3abffb1d74b3c8beb89 + languageName: node + linkType: hard + +"@react-aria/menu@npm:^3.15.5": + version: 3.15.5 + resolution: "@react-aria/menu@npm:3.15.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/menu": "npm:^3.8.3" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/button": "npm:^3.10.0" + "@react-types/menu": "npm:^3.9.12" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/6714b959f34497e6377732103b83dabb6011cb95df61fa6a415a9737d8fad70a8e419b60ab4f4f553b5f034fba9f07104b0e6f7756c5cec64048e7d9ef743ac0 + languageName: node + linkType: hard + +"@react-aria/meter@npm:^3.4.17": + version: 3.4.17 + resolution: "@react-aria/meter@npm:3.4.17" + dependencies: + "@react-aria/progress": "npm:^3.4.17" + "@react-types/meter": "npm:^3.4.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4d485940733dfb2f2a3fc77ef3c98ec78a37fcbd258cc343444616591998c72ef473dfbc3f3111b845de41f9cfc211a2636c579b122844226f39dca0072c5f73 + languageName: node + linkType: hard + +"@react-aria/numberfield@npm:^3.11.8": + version: 3.11.8 + resolution: "@react-aria/numberfield@npm:3.11.8" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-types/button": "npm:^3.10.0" + "@react-types/numberfield": "npm:^3.8.6" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2709e946298ee4a3be1802fddc87921e96be23c058c1fd50564a7c13e96779507de0ad005a3b51aefe41bcf0abf115ebb15f3be69887db4151bf2bcf7efec0eb + languageName: node + linkType: hard + +"@react-aria/overlays@npm:^3.23.2, @react-aria/overlays@npm:^3.23.4": + version: 3.23.4 + resolution: "@react-aria/overlays@npm:3.23.4" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/button": "npm:^3.10.0" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/6f641a1f7c1976758dd062c4345d2e8882575e2b645a4e4693f051699bae48c48979db3539e77c387aee64600d7a555b94687cd01449094cf875ce80ec6aa2ed + languageName: node + linkType: hard + +"@react-aria/progress@npm:^3.4.17": + version: 3.4.17 + resolution: "@react-aria/progress@npm:3.4.17" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/progress": "npm:^3.5.7" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/72c97dcd5b0fbbf5bde0d4282887d6621f7ad31f1895c93f77528ad54c673122a93aeea555ef517eb58dd3ae5e57310d15d5cd722870b4797a97673ebd449c95 + languageName: node + linkType: hard + +"@react-aria/radio@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-aria/radio@npm:3.10.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/radio": "npm:^3.10.8" + "@react-types/radio": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5254109a582d97eb9505c98b256de9b45ef019fb8a0e397def279be05ed539b69ea3c0e7842896df1574d576600a5168ae6e5a1178d8ee3ea0ba600be33ec143 + languageName: node + linkType: hard + +"@react-aria/searchfield@npm:^3.7.10": + version: 3.7.10 + resolution: "@react-aria/searchfield@npm:3.7.10" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/searchfield": "npm:^3.5.7" + "@react-types/button": "npm:^3.10.0" + "@react-types/searchfield": "npm:^3.5.9" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1ec6fc47c85b7ca8677683bcc54a88c471314931a876040425ec16e1f92293e635f55ee638f885592927b4c2d7f7fb797c6272511cca526d3fcfbb0c64660ba0 + languageName: node + linkType: hard + +"@react-aria/select@npm:^3.14.11": + version: 3.14.11 + resolution: "@react-aria/select@npm:3.14.11" + dependencies: + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/select": "npm:^3.6.8" + "@react-types/button": "npm:^3.10.0" + "@react-types/select": "npm:^3.9.7" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/580a72f0d5738d30fbf31c6f4e56b69f5a0f1c5ef56d5da069c128540740ecc88b2ef285829ad3bedf7a2fed76255250fd54c94d46e705667ccc8f6d045e0553 + languageName: node + linkType: hard + +"@react-aria/selection@npm:^3.20.1": + version: 3.20.1 + resolution: "@react-aria/selection@npm:3.20.1" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/38693581ab743fb4e23a7d16a370330b5462c42119ae38862623a7ace2466f74f080dee50df9f3d1ab4d83c58a3ac17a5197061e5a31b70d6f14993109c468e8 + languageName: node + linkType: hard + +"@react-aria/separator@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-aria/separator@npm:3.4.3" + dependencies: + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c30b4386283dd7658377952a708b27c103c8c1f9077bdca3f67e4458be6dd327d8884f2036442ef8cebc698a4444be248bcc0ace202db9a2c30d44ce1b3ee5db + languageName: node + linkType: hard + +"@react-aria/slider@npm:^3.7.13": + version: 3.7.13 + resolution: "@react-aria/slider@npm:3.7.13" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/slider": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/48f666cd6171daa5c6913409a0ef9ee94fdb5471af5b03f9960fd659308e586dafc821251c7b861595e44d5b9222796ddb7783e239ddc039f9d7f944309f454f + languageName: node + linkType: hard + +"@react-aria/spinbutton@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-aria/spinbutton@npm:3.6.9" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/98ed79bfd2b502a91833f5546e665c514aec3367d9cc902d32c7c6a18be4b332e905322f9916e39e64aea2cbf08da368faee6916991a861c6719ad4b7b58951f + languageName: node + linkType: hard + "@react-aria/ssr@npm:^3.9.5": version: 3.9.5 resolution: "@react-aria/ssr@npm:3.9.5" @@ -10743,6 +12694,151 @@ __metadata: languageName: node linkType: hard +"@react-aria/ssr@npm:^3.9.6": + version: 3.9.6 + resolution: "@react-aria/ssr@npm:3.9.6" + dependencies: + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ea6b290346ce1e119ed9233fc0e34693d52ab9dc2509f07ab10710409b89484a544b7f26c1438802e97f3fb634844ae54638850cdd95caca0d1f5571781bf982 + languageName: node + linkType: hard + +"@react-aria/switch@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-aria/switch@npm:3.6.9" + dependencies: + "@react-aria/toggle": "npm:^3.10.9" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/shared": "npm:^3.25.0" + "@react-types/switch": "npm:^3.5.6" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ce627d19e48db97fbf7f5201e0d8c8108aa5f59714ca44e852902a1e6483e5f0b929e6523534ca9d5fdefbbf3c36414cb9c52a914ce13e8bd44d2f818bd4c853 + languageName: node + linkType: hard + +"@react-aria/table@npm:^3.15.5": + version: 3.15.5 + resolution: "@react-aria/table@npm:3.15.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/grid": "npm:^3.10.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/flags": "npm:^3.0.4" + "@react-stately/table": "npm:^3.12.3" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@react-types/table": "npm:^3.10.2" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ef229d6d6319c8cfa135c56a7eeb6915e72a3f9d05dc49f51222cf79990976fdb18529b3bf3038aca82ac71d75058b0b09507d70dbfa0fd4166afa3671e5f19a + languageName: node + linkType: hard + +"@react-aria/tabs@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-aria/tabs@npm:3.9.7" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/tabs": "npm:^3.6.10" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tabs": "npm:^3.3.10" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/17837148337d68cb1b2468b76967b809a3c085c19da1dab3e7d701e585499e66d926f9ebec410de2c6a925b37d232871412b36c657fa54c4e48048b63ef4ad74 + languageName: node + linkType: hard + +"@react-aria/tag@npm:^3.4.7": + version: 3.4.7 + resolution: "@react-aria/tag@npm:3.4.7" + dependencies: + "@react-aria/gridlist": "npm:^3.9.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/list": "npm:^3.11.0" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1624d1b6f44bf350dc46e0ee8a1550123ce73c4a2508e325e2eee4603bc5cb13d8f8d8a997be12c34756b47154d4a1e60281d572615a97507198bcd65d80b870 + languageName: node + linkType: hard + +"@react-aria/textfield@npm:^3.14.10": + version: 3.14.10 + resolution: "@react-aria/textfield@npm:3.14.10" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@react-types/textfield": "npm:^3.9.7" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/bac8bb98030ff889bee1d57abbfd073b31a23b275e6aea0a0f27b829e37eb041c836873daa507d4def8abc233a24bf56bf9aad6bdfb9a21412e4a3e7b47e1a34 + languageName: node + linkType: hard + +"@react-aria/toggle@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-aria/toggle@npm:3.10.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/51adc665376a36cf0ccf2250d7ef1c5c4c97073c5e9dc987b7e0710a1c3c7916e668d2fca6e84fff60a16b586206260b6fc27e3267e65ae4fd670b4ca70643d1 + languageName: node + linkType: hard + +"@react-aria/tooltip@npm:^3.7.9": + version: 3.7.9 + resolution: "@react-aria/tooltip@npm:3.7.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/tooltip": "npm:^3.4.13" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tooltip": "npm:^3.4.12" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2e043bc87a8aa4e95e16c8d0ec98812cedd6b6e32099700b1fd2acdea74cf357c1476e1f5bf17c3b1bd45642089b2a09a0f1fb245544023146226df665fae594 + languageName: node + linkType: hard + "@react-aria/utils@npm:^3.25.2": version: 3.25.2 resolution: "@react-aria/utils@npm:3.25.2" @@ -10758,6 +12854,418 @@ __metadata: languageName: node linkType: hard +"@react-aria/utils@npm:^3.25.3": + version: 3.25.3 + resolution: "@react-aria/utils@npm:3.25.3" + dependencies: + "@react-aria/ssr": "npm:^3.9.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + clsx: "npm:^2.0.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/86aed35da5cb0d48d949e40bf8226d5a6d6c92a8cdc60e3e12d524d1f3cc91ab6b54c5e1642823773cbb889fb61af7da22e89488b704b56fc5f4d8d59da7519b + languageName: node + linkType: hard + +"@react-aria/visually-hidden@npm:^3.8.17": + version: 3.8.17 + resolution: "@react-aria/visually-hidden@npm:3.8.17" + dependencies: + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/d9cdc97d80e750f4582cc3f2bcc0bde12b6c70fbd408ca9ebba2ef654ab27b0181cdd072a8b30ae36f14d9ec16a79c2d38d7cbe834c96fad693daebc7be41616 + languageName: node + linkType: hard + +"@react-icons/all-files@npm:^4.1.0": + version: 4.1.0 + resolution: "@react-icons/all-files@npm:4.1.0" + peerDependencies: + react: "*" + checksum: 10/56252b205bd5960e605e9de9a9eacd4b2a5cf9f2e6156f4a1803eee502a7d1749e479a56d68dfc5514decc06cf4ffdf11e36c71359a984892c54cfc4a4604bc8 + languageName: node + linkType: hard + +"@react-native-async-storage/async-storage@npm:^1.17.7": + version: 1.24.0 + resolution: "@react-native-async-storage/async-storage@npm:1.24.0" + dependencies: + merge-options: "npm:^3.0.4" + peerDependencies: + react-native: ^0.0.0-0 || >=0.60 <1.0 + checksum: 10/5a6b7ac8bd7a9e537a53a3f2301530c284fd885a45ce4a4e0014859bc0f7c89bee5c4b5a6b3740b8d83751561159b237474d18f32fad75ea7d56d4ddb2180d91 + languageName: node + linkType: hard + +"@react-stately/calendar@npm:^3.5.5": + version: 3.5.5 + resolution: "@react-stately/calendar@npm:3.5.5" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/97d436bcedfff4975c74da301ad71fd63b329da5cf2ffe4ed80c71539decaa47000e24f11de2e6bf78378cfa68501aa4320448f686cdde6f7b1d7d6ecddc7b97 + languageName: node + linkType: hard + +"@react-stately/checkbox@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-stately/checkbox@npm:3.6.9" + dependencies: + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/45fe2277fc40ab457d374de150376f3093868153aeb144c3d7810ca2cfab15f5edb2adba7ed213eb3ee4e038cacb0607ce1f67e5066eaf9cd69b8b59577c8339 + languageName: node + linkType: hard + +"@react-stately/collections@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/collections@npm:3.11.0" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/241bedc27fb6f156d21642ab6a5ecc67b000569c6da58b93e693c1d2c57b27eaf58e71aabab8b5041e023d67ea8cbdf771e8a5bea43b86f1904ff1f4682a49da + languageName: node + linkType: hard + +"@react-stately/color@npm:^3.8.0": + version: 3.8.0 + resolution: "@react-stately/color@npm:3.8.0" + dependencies: + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-stately/slider": "npm:^3.5.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/color": "npm:^3.0.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/9049c3222707e3699fb2a22ee6d6be89e5b9c4b784a46fb9d4b9d22c9e09974905902d37a228bc344efed8147d40dd5bbc59875cc54ccb92d6d2d4827e89281e + languageName: node + linkType: hard + +"@react-stately/combobox@npm:^3.10.0": + version: 3.10.0 + resolution: "@react-stately/combobox@npm:3.10.0" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/select": "npm:^3.6.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/combobox": "npm:^3.13.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8897052576e311c522db246f11f950e62f19d41f4739c4992c9485f1c4ee0e1d7675421c6f0d982f3a5ae5c7de874d2050749ed44e08a316405a5fa960e993ac + languageName: node + linkType: hard + +"@react-stately/data@npm:^3.11.7": + version: 3.11.7 + resolution: "@react-stately/data@npm:3.11.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/31ba0cb0d1363370c7b22c3bb152e4556ff93e72dca2a4cb042e4750c32a835a15c42d262bde4e0ab4e9ddee6c0c5e501a0ebcb032d476db16fd63407f9504b8 + languageName: node + linkType: hard + +"@react-stately/datepicker@npm:^3.10.3": + version: 3.10.3 + resolution: "@react-stately/datepicker@npm:3.10.3" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/string": "npm:^3.2.4" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/datepicker": "npm:^3.8.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f3435997c14dc8466ecac63171412296021323c2b935795b067bddb165afcccb06ef85f425315aa3b0d2073b9b26549d33cc0e97d7416368c45b955ecc4228ef + languageName: node + linkType: hard + +"@react-stately/dnd@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-stately/dnd@npm:3.4.3" + dependencies: + "@react-stately/selection": "npm:^3.17.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ecfadefa4be8e914af040a376c64e1a2945f3a53f9374d4446615c5a33e81e0f1a2732c177a4fac37fec44ee6acb66338757f7ebbb2d6c20d643fdcc92e6366a + languageName: node + linkType: hard + +"@react-stately/flags@npm:^3.0.4": + version: 3.0.4 + resolution: "@react-stately/flags@npm:3.0.4" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/de1004c2e670a4876d4cb7beae9058e1e1ded410c4b51b11d076ad66feb83b0461321617fce488143330d17c0ab468641ddbd3e9883ed4371ed4578d61834bdf + languageName: node + linkType: hard + +"@react-stately/form@npm:^3.0.6": + version: 3.0.6 + resolution: "@react-stately/form@npm:3.0.6" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/9bd911e7d23ae334a025a0000f9b4faa4e86384c26f07534acfc86e467d2d9507b89f6bf54f54f3aad661cf97d86398ef2bc5b0bd69f2a8602b42b7f5bded78c + languageName: node + linkType: hard + +"@react-stately/grid@npm:^3.9.3": + version: 3.9.3 + resolution: "@react-stately/grid@npm:3.9.3" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c2dcd9cda30c4bc6ae7da0f612c9d288734e5ab58be674f1e4983d6dd5e0def0cac4be3a759b4974a49b97476d9119c92b79fba8b40576696f370fc30b7b684f + languageName: node + linkType: hard + +"@react-stately/list@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/list@npm:3.11.0" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1ba76430c5c112311fc07a6861fd7046562a60d25676d2a14dfb76cb9a00d0673b241ef11093551f819276b3dc7261d2fd7ffaf2b61c8fd634b03672c4443861 + languageName: node + linkType: hard + +"@react-stately/menu@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-stately/menu@npm:3.8.3" + dependencies: + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/menu": "npm:^3.9.12" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/67c73ca6adfaa24a836a148a7b57cbe348aac5b865cd58525d1fc41f2abd17da0540565ffba509c216de1008d8b24ae87a198aa8057b34825a0668090e2d0d27 + languageName: node + linkType: hard + +"@react-stately/numberfield@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-stately/numberfield@npm:3.9.7" + dependencies: + "@internationalized/number": "npm:^3.5.4" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/numberfield": "npm:^3.8.6" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/da4d0493d5a8e76af9a4d66ec477999fd9e26acc07dfc025494425ccdf3c5d72b104cfa9933b549e5c47b389dc7dfdc00ba34703d4d88da3e2171ddc44508385 + languageName: node + linkType: hard + +"@react-stately/overlays@npm:^3.6.11": + version: 3.6.11 + resolution: "@react-stately/overlays@npm:3.6.11" + dependencies: + "@react-stately/utils": "npm:^3.10.4" + "@react-types/overlays": "npm:^3.8.10" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/98190b4b0ced5c94d924cf97b5d43a6e28f68aa44de7bb789c20354f30f00309c86089fb6948b5ec9d09f01605b5a412fb246545b7ee9bc34e3183e7261a2805 + languageName: node + linkType: hard + +"@react-stately/radio@npm:^3.10.8": + version: 3.10.8 + resolution: "@react-stately/radio@npm:3.10.8" + dependencies: + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/radio": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a750896af85433719281814d394378b612465d3078488b8b541812260a795933699b1d0ca3e71fbb68003aff203916670370ef0de6895cc0cce0b9d8c6e85b84 + languageName: node + linkType: hard + +"@react-stately/searchfield@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-stately/searchfield@npm:3.5.7" + dependencies: + "@react-stately/utils": "npm:^3.10.4" + "@react-types/searchfield": "npm:^3.5.9" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/bcd6f7fcb644bf0202c365f6017faf0e0cea1320a81b7e44d1c4faa49e541a8911d027da695bb6870718cbfb70a6028bd870d69eb6cc91178bccb8232d25741e + languageName: node + linkType: hard + +"@react-stately/select@npm:^3.6.8": + version: 3.6.8 + resolution: "@react-stately/select@npm:3.6.8" + dependencies: + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/select": "npm:^3.9.7" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/fe79ed549db5ef5fbccf4312a90cd7a43e62e2a6ba7c183cb2b3c11dd6f17ba81c7c3f44eac42be67e7ebdf4eecf7a33513d5ef2badb9c13b22552da55b43df7 + languageName: node + linkType: hard + +"@react-stately/selection@npm:^3.17.0": + version: 3.17.0 + resolution: "@react-stately/selection@npm:3.17.0" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5ecb13294b85c0b6fa1fda1665fd81105601ca3976672a5faae95a67ab484a2538b913be68cb924ca0be0b010c9eb7bba139c34da7c61e3f581d2054029b9978 + languageName: node + linkType: hard + +"@react-stately/slider@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-stately/slider@npm:3.5.8" + dependencies: + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c7c51f7d153b70d785b5ced5e918fd0f72278a4f288bb78c62da51a3ef0277db50f365803a1c7d9b57071cb99315a17fc9796b8aca608682711adb288c888dc6 + languageName: node + linkType: hard + +"@react-stately/table@npm:^3.12.3": + version: 3.12.3 + resolution: "@react-stately/table@npm:3.12.3" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/flags": "npm:^3.0.4" + "@react-stately/grid": "npm:^3.9.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@react-types/table": "npm:^3.10.2" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c82b4153c9205101b63e7974c72238997d05345b6c8cd15c4bb5484174df56f85128c3b4fe731734e0720e4ad98a3e8f1c933831c1cf7b5e24ed20c97229cd1b + languageName: node + linkType: hard + +"@react-stately/tabs@npm:^3.6.10": + version: 3.6.10 + resolution: "@react-stately/tabs@npm:3.6.10" + dependencies: + "@react-stately/list": "npm:^3.11.0" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tabs": "npm:^3.3.10" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b5b2c78300fdaa6bd5a94964bd9e44e2aad39070170ac7202f4c78d327e174b8c1c4e051c7edc794c729e0430ab57e76a1e510942efe1adcf7477f2ecd40004c + languageName: node + linkType: hard + +"@react-stately/toggle@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-stately/toggle@npm:3.7.8" + dependencies: + "@react-stately/utils": "npm:^3.10.4" + "@react-types/checkbox": "npm:^3.8.4" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/65c662eab8a57e09228864399e46cbca3fdab1e7fea8c994431441bfc87a6d40c6897473ec48145cb9220067a7bf058d22d0f5257f2d49bfc6bc981b59a3b3ef + languageName: node + linkType: hard + +"@react-stately/tooltip@npm:^3.4.13": + version: 3.4.13 + resolution: "@react-stately/tooltip@npm:3.4.13" + dependencies: + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/tooltip": "npm:^3.4.12" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8c2a44b20dad82bb10e7b8eb26c5844dd842468ac8e39e17c511e4122e1ee9a8ba63b66adc14a643330a0f08f6407b0e4a3896a05d4c71b170624006d67b55ac + languageName: node + linkType: hard + +"@react-stately/tree@npm:^3.8.5": + version: 3.8.5 + resolution: "@react-stately/tree@npm:3.8.5" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a853a272b53b6159c98118171cff2088ab5b262860106d4f0867d38c13c1ca7ab3f4b2c6c335b79cb07e045ffa9ac81c3061e46914150a460839e2b1dbd695ea + languageName: node + linkType: hard + "@react-stately/utils@npm:^3.10.3": version: 3.10.3 resolution: "@react-stately/utils@npm:3.10.3" @@ -10769,6 +13277,235 @@ __metadata: languageName: node linkType: hard +"@react-stately/utils@npm:^3.10.4": + version: 3.10.4 + resolution: "@react-stately/utils@npm:3.10.4" + dependencies: + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8a56b4d0cf8d5a7a692d6f94ffff63feac2d7078fbc5642b94b0afcaaf7c8f7f4682cfe546f98265034c52576c198be5502cff3f9b145137884e50eb9ffb96d5 + languageName: node + linkType: hard + +"@react-types/breadcrumbs@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-types/breadcrumbs@npm:3.7.8" + dependencies: + "@react-types/link": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5a085a3e6fa8486ce39451c9698c1fc9d1d33526db78e06cdf8e38a02e6c9765c232ea8b7bdb2a5462d2917ccef62b570dc04cb825204747c29d43af30af776c + languageName: node + linkType: hard + +"@react-types/button@npm:^3.10.0": + version: 3.10.0 + resolution: "@react-types/button@npm:3.10.0" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/13973108d935e81a9e852bdc3a530a26a4cacc4a7ec37f1dde48202be0545066a71f4d7c476806d7911e91b2b9193c79f4e89dc616280b74db37cec3dd749fea + languageName: node + linkType: hard + +"@react-types/calendar@npm:^3.4.10": + version: 3.4.10 + resolution: "@react-types/calendar@npm:3.4.10" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0f90aa3394d160b09e93ce0acb66a226c1d4211e818f69b5ac0d9faf01a6729085d1fcad83566ddf425d18308c05f70e56007429ef2060f0bf4f595d3c28f066 + languageName: node + linkType: hard + +"@react-types/checkbox@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-types/checkbox@npm:3.8.4" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/15eb9951dc7ab24cb9f95b500df09d17e1c675f33121b589f778508f8c803f6f29bf6744441c48c1dc5e6d7755feda83e9464832b6771b1662757b564bfb80dd + languageName: node + linkType: hard + +"@react-types/color@npm:^3.0.0": + version: 3.0.0 + resolution: "@react-types/color@npm:3.0.0" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ca56d14fbb70e43b67aa696abeeb1aba4df44b09081227b49bc476342119b5b374be4bf25f753799f28cb994f0dffc2abecea16f9c940fa091007416e485c81b + languageName: node + linkType: hard + +"@react-types/combobox@npm:^3.13.0": + version: 3.13.0 + resolution: "@react-types/combobox@npm:3.13.0" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/e69ae7389ff7b38aca0e6cee6c854b2f343c9a18cbec03a3773d59f2e148a97b3948abd49ed1f79c8d62e36f9f067dbd08c42c1e871090cab4dc2c421c3b6fc9 + languageName: node + linkType: hard + +"@react-types/datepicker@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-types/datepicker@npm:3.8.3" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/15e4c21569f69be8de94ea3831c4fc7e1c62d7b704cfa4970da32677a152e20c13dd47dd4bd969e5598a9e100c572031159445100c4d08b7dcf92dcb932228db + languageName: node + linkType: hard + +"@react-types/dialog@npm:^3.5.13": + version: 3.5.13 + resolution: "@react-types/dialog@npm:3.5.13" + dependencies: + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c7ee923c326b7377660400ec794ef98330388250aa32df23f5c22a63e483bcad221283de26181bf2a5cab2c20d517f528bf351c9786ac9fece3e3726e4ae07c3 + languageName: node + linkType: hard + +"@react-types/grid@npm:^3.2.9": + version: 3.2.9 + resolution: "@react-types/grid@npm:3.2.9" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/db85cb813a662de2673d14119036aa437c60358436bb9099c46706485fad47d1f7aa9df69131ec7ce122f78a684f9082a2aa03ac37d0370069ffd1bec1c11c3e + languageName: node + linkType: hard + +"@react-types/link@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-types/link@npm:3.5.8" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3e20323be7cebfcd10cde779a884e1bea3cd5068cbd6eff60f62cb03718fb88cb024c14d0f79c86fe41fd790e10849d405b0115a68a08ffcc9715f303cc4563d + languageName: node + linkType: hard + +"@react-types/listbox@npm:^3.5.2": + version: 3.5.2 + resolution: "@react-types/listbox@npm:3.5.2" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5aadf4665538613c8fc60dab1fe58ff02eff9f9b653fc6df772c94df17170cc7b31dd869e9293bdd437fccf168124d165162080084d32c2c01cd51f64ec2e3fd + languageName: node + linkType: hard + +"@react-types/menu@npm:^3.9.12": + version: 3.9.12 + resolution: "@react-types/menu@npm:3.9.12" + dependencies: + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a6276115c5da08c63b9641b985c366435e69847af680ace5fef32ce2ca6eab9669db5cc8f5a20e01377a54f17392a95864ee40831b13b2258ed6d43bcc1398f5 + languageName: node + linkType: hard + +"@react-types/meter@npm:^3.4.4": + version: 3.4.4 + resolution: "@react-types/meter@npm:3.4.4" + dependencies: + "@react-types/progress": "npm:^3.5.7" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/cd05949d2ff361dedc576369d7a38688ac8be62b237881c8cf0314825bae5d923814c81dc83922b76d54c46936571ad7da186d6dcfeb37fb5425c119f77d8f21 + languageName: node + linkType: hard + +"@react-types/numberfield@npm:^3.8.6": + version: 3.8.6 + resolution: "@react-types/numberfield@npm:3.8.6" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/47ca14f31d970bad272ff9a2d06ee722d5ca7d5d5d60e47277040f9bbf0cb6b9835c234387e29446148c28df0a0d747c4ddb56d8a53c510b63a91547f808cf51 + languageName: node + linkType: hard + +"@react-types/overlays@npm:^3.8.10": + version: 3.8.10 + resolution: "@react-types/overlays@npm:3.8.10" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2e8edf37f75df2884a280cbd25a3798d24b93669b8b2b606cadacaf40f605f63e437749cea28861fabecd78293302ac39108f4e65cedd412c474e92be9895561 + languageName: node + linkType: hard + +"@react-types/progress@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-types/progress@npm:3.5.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/610cfd88946e566dd3cfe745a4b4f90b6216b6df6c55d19aab9e1c0c099e062baa7cf221c79e7fd1f46a7d4604df71bcd8914d8ec5e79b2694e9e605a0115dcc + languageName: node + linkType: hard + +"@react-types/radio@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-types/radio@npm:3.8.4" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b00f2a97ef56b4860b2bb196433d78a068031427b4f99d2350f45ee444f49de7cad646220dae53ed1126555fe715050deefc67f9728e264a27b910b274f4a6b3 + languageName: node + linkType: hard + +"@react-types/searchfield@npm:^3.5.9": + version: 3.5.9 + resolution: "@react-types/searchfield@npm:3.5.9" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@react-types/textfield": "npm:^3.9.7" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b5d53113f7cd6d55c69350345e042412fcd31fbd69ea9eff3a0b74e9575b9a50b6e3b9f6443e760bfce73c6950c513a6b0c43a6b5cbffa9b0d5f8a29236ee56d + languageName: node + linkType: hard + +"@react-types/select@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-types/select@npm:3.9.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c53a9408e22cc7c622955a11a80339c412564720d08d621bbd5a28953731eb8afda8d0bb56b5242f8f94e99c3264b913f1228ec9454c3b637f4e8d2374e00f99 + languageName: node + linkType: hard + "@react-types/shared@npm:^3.24.1": version: 3.24.1 resolution: "@react-types/shared@npm:3.24.1" @@ -10778,6 +13515,83 @@ __metadata: languageName: node linkType: hard +"@react-types/shared@npm:^3.25.0": + version: 3.25.0 + resolution: "@react-types/shared@npm:3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/fa31eb6153c223210c2eee46934a63b922917bcde0ee583f2cfe59675db122c10e1cbae6549b1fea4284391fdbeca6888b36e9dc797231ad4a76def01490aea5 + languageName: node + linkType: hard + +"@react-types/slider@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-types/slider@npm:3.7.6" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/01d15d8f946188cc45ddf63f3300c21aebaea015c88bd8883d64e740ead54873407fdbfb3dcc8b3c5198a40355c5c0027c006d41123220189783d1ac2193eee6 + languageName: node + linkType: hard + +"@react-types/switch@npm:^3.5.6": + version: 3.5.6 + resolution: "@react-types/switch@npm:3.5.6" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1741c5c98686847a3a9c2f07bb47f409c0f35d32c3b8759c418ddee24a2e02e8f9a7f49690f8dfe304e811af191ea3d97bb68a0dd9355bfb85e95140dd8433c8 + languageName: node + linkType: hard + +"@react-types/table@npm:^3.10.2": + version: 3.10.2 + resolution: "@react-types/table@npm:3.10.2" + dependencies: + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0fb7b38c56809500e0cc7a958965b54fb2d5172da3df28b994f24630c3aa931fef0993f15d3ec1c2716b910435aeb90c210abd27badec2de1f77ecdf6d03ab16 + languageName: node + linkType: hard + +"@react-types/tabs@npm:^3.3.10": + version: 3.3.10 + resolution: "@react-types/tabs@npm:3.3.10" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4b2fd7d6f978067a7a603c83ed7292ff12c47b89a9c556da2cdc10c8a185868311318d4f6f7703e4cf4234a5cd2cb882ec48e4771fb61b2dfa00f47c0474949f + languageName: node + linkType: hard + +"@react-types/textfield@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-types/textfield@npm:3.9.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/73fc23fd7a83f0a44add2bdb1c10e1361a3aa4ee1d5e1dfb6b63f661140b58052d8dce735e79c0a2c9c66db596dfe9c312ee70ebcd100d2c8b102fbe6b8199ad + languageName: node + linkType: hard + +"@react-types/tooltip@npm:^3.4.12": + version: 3.4.12 + resolution: "@react-types/tooltip@npm:3.4.12" + dependencies: + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3321d0c938a46343f2961b53d9533ab62ea5fc1c4b199e7e1740dab2ba59765bc87ed04903819596f61bdaa07e2a1c8c29d6f6b34e3d495c0f43d656a7ac8d18 + languageName: node + linkType: hard + "@resolver-engine/core@npm:^0.3.3": version: 0.3.3 resolution: "@resolver-engine/core@npm:0.3.3" @@ -11092,6 +13906,26 @@ __metadata: languageName: node linkType: hard +"@safe-global/safe-apps-provider@npm:0.18.4": + version: 0.18.4 + resolution: "@safe-global/safe-apps-provider@npm:0.18.4" + dependencies: + "@safe-global/safe-apps-sdk": "npm:^9.1.0" + events: "npm:^3.3.0" + checksum: 10/252ccad3416f73e9fa5e7bdd074955ca6b81c55be89c3cd3e25a7cab9b01922cb9f9a02d2766dff15003908c7cccc47bc22f58dd2d4a65b504fd7870eabda41b + languageName: node + linkType: hard + +"@safe-global/safe-apps-sdk@npm:9.1.0, @safe-global/safe-apps-sdk@npm:^9.1.0": + version: 9.1.0 + resolution: "@safe-global/safe-apps-sdk@npm:9.1.0" + dependencies: + "@safe-global/safe-gateway-typescript-sdk": "npm:^3.5.3" + viem: "npm:^2.1.1" + checksum: 10/b81e1a554509fc41f5b8ec3bcccaf477fd55824010774699dd2c00dee8431cfd351bf13893ff6acb1450028ce4de31a1316548a0e77a66d801ff9e0b4e08b9ff + languageName: node + linkType: hard + "@safe-global/safe-core-sdk-types@npm:2.3.0": version: 2.3.0 resolution: "@safe-global/safe-core-sdk-types@npm:2.3.0" @@ -11136,6 +13970,20 @@ __metadata: languageName: node linkType: hard +"@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": + version: 3.22.2 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.22.2" + checksum: 10/7f2b3cab4a1673647c8f7fd927be280f891dc74dba733f302862dee135fedd9d8e1875b1790c75b84c54164b517727bfe08a6dcaf7411659db13eeaefd1407fd + languageName: node + linkType: hard + +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.6, @scure/base@npm:~1.1.7, @scure/base@npm:~1.1.8": + version: 1.1.9 + resolution: "@scure/base@npm:1.1.9" + checksum: 10/f0ab7f687bbcdee2a01377fe3cd808bf63977999672751295b6a92625d5322f4754a96d40f6bd579bc367aad48ecf8a4e6d0390e70296e6ded1076f52adb16bb + languageName: node + linkType: hard + "@scure/base@npm:~1.0.0": version: 1.0.0 resolution: "@scure/base@npm:1.0.0" @@ -11143,6 +13991,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@scure/base@npm:~1.1.0": version: 1.1.1 resolution: "@scure/base@npm:1.1.1" @@ -11157,6 +14006,8 @@ __metadata: languageName: node linkType: hard +======= +>>>>>>> origin/main "@scure/bip32@npm:1.0.1": version: 1.0.1 resolution: "@scure/bip32@npm:1.0.1" @@ -11168,9 +14019,26 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@scure/bip32@npm:1.3.2": version: 1.3.2 resolution: "@scure/bip32@npm:1.3.2" +======= +"@scure/bip32@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip32@npm:1.4.0" + dependencies: + "@noble/curves": "npm:~1.4.0" + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 10/6cd5062d902564d9e970597ec8b1adacb415b2eadfbb95aee1a1a0480a52eb0de4d294d3753aa8b48548064c9795ed108d348a31a8ce3fc88785377bb12c63b9 + languageName: node + linkType: hard + +"@scure/bip32@npm:1.5.0, @scure/bip32@npm:^1.5.0": + version: 1.5.0 + resolution: "@scure/bip32@npm:1.5.0" +>>>>>>> origin/main dependencies: "@noble/curves": "npm:~1.2.0" "@noble/hashes": "npm:~1.3.2" @@ -11189,9 +14057,25 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@scure/bip39@npm:1.2.1": version: 1.2.1 resolution: "@scure/bip39@npm:1.2.1" +======= +"@scure/bip39@npm:1.3.0": + version: 1.3.0 + resolution: "@scure/bip39@npm:1.3.0" + dependencies: + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 10/7d71fd58153de22fe8cd65b525f6958a80487bc9d0fbc32c71c328aeafe41fa259f989d2f1e0fa4fdfeaf83b8fcf9310d52ed9862987e46c2f2bfb9dd8cf9fc1 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.4.0, @scure/bip39@npm:^1.4.0": + version: 1.4.0 + resolution: "@scure/bip39@npm:1.4.0" +>>>>>>> origin/main dependencies: "@noble/hashes": "npm:~1.3.0" "@scure/base": "npm:~1.1.0" @@ -11920,6 +14804,60 @@ __metadata: languageName: node linkType: hard +"@socket.io/component-emitter@npm:~3.1.0": + version: 3.1.2 + resolution: "@socket.io/component-emitter@npm:3.1.2" + checksum: 10/89888f00699eb34e3070624eb7b8161fa29f064aeb1389a48f02195d55dd7c52a504e52160016859f6d6dffddd54324623cdd47fd34b3d46f9ed96c18c456edc + languageName: node + linkType: hard + +"@solana-mobile/mobile-wallet-adapter-protocol-web3js@npm:^2.1.4": + version: 2.1.4 + resolution: "@solana-mobile/mobile-wallet-adapter-protocol-web3js@npm:2.1.4" + dependencies: + "@solana-mobile/mobile-wallet-adapter-protocol": "npm:^2.1.4" + bs58: "npm:^5.0.0" + js-base64: "npm:^3.7.5" + peerDependencies: + "@solana/web3.js": ^1.58.0 + checksum: 10/477ccde5bfa9bb9f108dac4a3ae515b4c37489d9314076951cc467f9c0212780a03f10356c1d57d34197a384cb1aeaba90a1f743ee3cb7733373e6b1ff7d4f19 + languageName: node + linkType: hard + +"@solana-mobile/mobile-wallet-adapter-protocol@npm:^2.1.4": + version: 2.1.4 + resolution: "@solana-mobile/mobile-wallet-adapter-protocol@npm:2.1.4" + dependencies: + "@solana/wallet-standard": "npm:^1.1.2" + "@solana/wallet-standard-util": "npm:^1.1.1" + "@wallet-standard/core": "npm:^1.0.3" + js-base64: "npm:^3.7.5" + peerDependencies: + "@solana/web3.js": ^1.58.0 + react-native: ">0.69" + checksum: 10/48270b536251f601b635a0c6ecb46da332bf3f1f419b83affbb609a15242f199fda896babbea4a647a747af57e62f0aa8abf0e5d7b2047d260576c17e883528d + languageName: node + linkType: hard + +"@solana-mobile/wallet-adapter-mobile@npm:^2.0.0": + version: 2.1.4 + resolution: "@solana-mobile/wallet-adapter-mobile@npm:2.1.4" + dependencies: + "@react-native-async-storage/async-storage": "npm:^1.17.7" + "@solana-mobile/mobile-wallet-adapter-protocol-web3js": "npm:^2.1.4" + "@solana/wallet-adapter-base": "npm:^0.9.23" + "@solana/wallet-standard-features": "npm:^1.2.0" + js-base64: "npm:^3.7.5" + qrcode: "npm:^1.5.4" + peerDependencies: + "@solana/web3.js": ^1.58.0 + dependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + checksum: 10/9dfc46a6b030f2b9dd8ae80c3bb6173a6cd9b0024b89894f14618fb7eb7b90c6041966a2265b71dcde5445ccf91eb2b8d2b1e2f3e73c7e13ea496717fcbbe632 + languageName: node + linkType: hard + "@solana/buffer-layout-utils@npm:^0.2.0": version: 0.2.0 resolution: "@solana/buffer-layout-utils@npm:0.2.0" @@ -11954,6 +14892,155 @@ __metadata: languageName: node linkType: hard +"@solana/wallet-adapter-base-ui@npm:^0.1.2": + version: 0.1.2 + resolution: "@solana/wallet-adapter-base-ui@npm:0.1.2" + dependencies: + "@solana/wallet-adapter-react": "npm:^0.15.35" + peerDependencies: + "@solana/web3.js": ^1.77.3 + react: "*" + checksum: 10/5f4045defe8caedfbd777c7e46590b320a5e8526291aba83c2b1c2666b9bdfa97f46ee1820d2beb1d2cfe62a09c134018a40679023e54e9d583826d2333981d0 + languageName: node + linkType: hard + +"@solana/wallet-adapter-base@npm:^0.9.23": + version: 0.9.23 + resolution: "@solana/wallet-adapter-base@npm:0.9.23" + dependencies: + "@solana/wallet-standard-features": "npm:^1.1.0" + "@wallet-standard/base": "npm:^1.0.1" + "@wallet-standard/features": "npm:^1.0.3" + eventemitter3: "npm:^4.0.7" + peerDependencies: + "@solana/web3.js": ^1.77.3 + checksum: 10/7b0ab2a3b33bf4796c9e544d13b3ac2b6628cdbff9e839772eb2b2ab34355708fe662cc8971b68748febffdcc2ced79725f6c1ff7832d0c1660558ad0052b372 + languageName: node + linkType: hard + +"@solana/wallet-adapter-react-ui@npm:^0.9.31": + version: 0.9.35 + resolution: "@solana/wallet-adapter-react-ui@npm:0.9.35" + dependencies: + "@solana/wallet-adapter-base": "npm:^0.9.23" + "@solana/wallet-adapter-base-ui": "npm:^0.1.2" + "@solana/wallet-adapter-react": "npm:^0.15.35" + peerDependencies: + "@solana/web3.js": ^1.77.3 + react: "*" + react-dom: "*" + checksum: 10/4c1dccec09bf2197bb757952d4229cdf272ea0b1c1b06e0f09aea55482c0754b96495ffdcf67391ff6a5df6a3f5bd144b501bb90946bd0038dec302ec6fbfb20 + languageName: node + linkType: hard + +"@solana/wallet-adapter-react@npm:^0.15.32, @solana/wallet-adapter-react@npm:^0.15.35": + version: 0.15.35 + resolution: "@solana/wallet-adapter-react@npm:0.15.35" + dependencies: + "@solana-mobile/wallet-adapter-mobile": "npm:^2.0.0" + "@solana/wallet-adapter-base": "npm:^0.9.23" + "@solana/wallet-standard-wallet-adapter-react": "npm:^1.1.0" + peerDependencies: + "@solana/web3.js": ^1.77.3 + react: "*" + checksum: 10/52e009d8a49fb92e2fac90e9427fa790644e3f4b387ef39a1bb30047f8ae394a6367d3e9a9a97785d8e3fd90141800e7268f492aee0b9de0b88e113f565dd071 + languageName: node + linkType: hard + +"@solana/wallet-standard-chains@npm:^1.1.0": + version: 1.1.0 + resolution: "@solana/wallet-standard-chains@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.0.1" + checksum: 10/c87141660a01b1e4cb394c12bfa1b779e2c231dfe098518273b90c80afa0a4185bc4aeadca801452af7f8396eecec81c7e9f820d478cd4495d5918924a8bfaf3 + languageName: node + linkType: hard + +"@solana/wallet-standard-core@npm:^1.1.1": + version: 1.1.1 + resolution: "@solana/wallet-standard-core@npm:1.1.1" + dependencies: + "@solana/wallet-standard-chains": "npm:^1.1.0" + "@solana/wallet-standard-features": "npm:^1.2.0" + "@solana/wallet-standard-util": "npm:^1.1.1" + checksum: 10/3c4f8aca67856cea12928a5cf99f2cb022a787263765f879024c69ef3d89a090777301b4ec68e534de2d1df33feee34ec530bf755488dd49415c131521d06b6c + languageName: node + linkType: hard + +"@solana/wallet-standard-features@npm:^1.1.0, @solana/wallet-standard-features@npm:^1.2.0": + version: 1.2.0 + resolution: "@solana/wallet-standard-features@npm:1.2.0" + dependencies: + "@wallet-standard/base": "npm:^1.0.1" + "@wallet-standard/features": "npm:^1.0.3" + checksum: 10/6a638783b282078f7c38ba0d2a69f302293d0c3226ea257d1cafd16d7b7332631d284e738d53d443dac984900a3b6d5fa34a1c92a51200901a43966048d4475c + languageName: node + linkType: hard + +"@solana/wallet-standard-util@npm:^1.1.1": + version: 1.1.1 + resolution: "@solana/wallet-standard-util@npm:1.1.1" + dependencies: + "@noble/curves": "npm:^1.1.0" + "@solana/wallet-standard-chains": "npm:^1.1.0" + "@solana/wallet-standard-features": "npm:^1.2.0" + checksum: 10/be04a8905d1cb2bfe7b10119be374a3e51787375c3435563a935133ff3e6a4bcb482a65ba18024400fe2a2781e7900bce867fd4789de86731a7f15dd0d7978b2 + languageName: node + linkType: hard + +"@solana/wallet-standard-wallet-adapter-base@npm:^1.1.2": + version: 1.1.2 + resolution: "@solana/wallet-standard-wallet-adapter-base@npm:1.1.2" + dependencies: + "@solana/wallet-adapter-base": "npm:^0.9.23" + "@solana/wallet-standard-chains": "npm:^1.1.0" + "@solana/wallet-standard-features": "npm:^1.2.0" + "@solana/wallet-standard-util": "npm:^1.1.1" + "@wallet-standard/app": "npm:^1.0.1" + "@wallet-standard/base": "npm:^1.0.1" + "@wallet-standard/features": "npm:^1.0.3" + "@wallet-standard/wallet": "npm:^1.0.1" + peerDependencies: + "@solana/web3.js": ^1.58.0 + bs58: ^4.0.1 + checksum: 10/458269e1ca5205be4b3fe758a5bda528a03a6f65199a87968d008498901b221428690c0b4e75fd63344470a0a84206a28ab27868489b445428001cee7f770f68 + languageName: node + linkType: hard + +"@solana/wallet-standard-wallet-adapter-react@npm:^1.1.0, @solana/wallet-standard-wallet-adapter-react@npm:^1.1.2": + version: 1.1.2 + resolution: "@solana/wallet-standard-wallet-adapter-react@npm:1.1.2" + dependencies: + "@solana/wallet-standard-wallet-adapter-base": "npm:^1.1.2" + "@wallet-standard/app": "npm:^1.0.1" + "@wallet-standard/base": "npm:^1.0.1" + peerDependencies: + "@solana/wallet-adapter-base": "*" + react: "*" + checksum: 10/1e64f9ee7be8371b16ba51dfb01a6cea499bf0157c333bbc759f6e8c113a7930d6e47cf44ab25a497296be9a83a36caabc53f8ce0837091f38391f08b4a45539 + languageName: node + linkType: hard + +"@solana/wallet-standard-wallet-adapter@npm:^1.1.2": + version: 1.1.2 + resolution: "@solana/wallet-standard-wallet-adapter@npm:1.1.2" + dependencies: + "@solana/wallet-standard-wallet-adapter-base": "npm:^1.1.2" + "@solana/wallet-standard-wallet-adapter-react": "npm:^1.1.2" + checksum: 10/01571705e747129099006c45d2272117248d7f1be55190e519b78cfcfee9ce5f3307a65c32f50d6a4d388e56cb5a0be4dd028419c842d70680c665180f50dbf6 + languageName: node + linkType: hard + +"@solana/wallet-standard@npm:^1.1.2": + version: 1.1.2 + resolution: "@solana/wallet-standard@npm:1.1.2" + dependencies: + "@solana/wallet-standard-core": "npm:^1.1.1" + "@solana/wallet-standard-wallet-adapter": "npm:^1.1.2" + checksum: 10/3c17b9cafde0d796c50242916ac3fe07edbd1655dfe8a34d4e44dfbe8a82e5cbc389e867c48b802914785354c2310e237edb4ce7b9d22977ab2430f3cf52557f + languageName: node + linkType: hard + "@solana/web3.js@npm:^1.32.0": version: 1.78.5 resolution: "@solana/web3.js@npm:1.78.5" @@ -12025,6 +15112,176 @@ __metadata: languageName: node linkType: hard +"@stablelib/aead@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/aead@npm:1.0.1" + checksum: 10/1a6f68d138f105d17dd65349751515bd252ab0498c77255b8555478d28415600dde493f909eb718245047a993f838dfae546071e1687566ffb7b8c3e10c918d9 + languageName: node + linkType: hard + +"@stablelib/binary@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/binary@npm:1.0.1" + dependencies: + "@stablelib/int": "npm:^1.0.1" + checksum: 10/c5ed769e2b5d607a5cdb72d325fcf98db437627862fade839daad934bd9ccf02a6f6e34f9de8cb3b18d72fce2ba6cc019a5d22398187d7d69d2607165f27f8bf + languageName: node + linkType: hard + +"@stablelib/bytes@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/bytes@npm:1.0.1" + checksum: 10/23d4d632a8a15ca91be1dc56da92eefed695d9b66068d1ab27a5655d0233dc2ac0b8668f875af542ca4ed526893c65dd53e777c72c8056f3648115aac98823ee + languageName: node + linkType: hard + +"@stablelib/chacha20poly1305@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha20poly1305@npm:1.0.1" + dependencies: + "@stablelib/aead": "npm:^1.0.1" + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/chacha": "npm:^1.0.1" + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/poly1305": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/2a4df136b078b7c09acb3c6fe029613d4c9f70a0ce8bec65551a4a5016930a4f9091d3b83ed1cfc9c2e7bd6ec7f5ee93a7dc729b784b3900dcb97f3c7f5da84a + languageName: node + linkType: hard + +"@stablelib/chacha@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/38cd8095d94eda29a9bb8a742b1c945dba7f9ec91fc07ab351c826680d03976641ac6366c3d004a00a72d746fcd838215fe1263ef4b0660c453c5de18a0a4295 + languageName: node + linkType: hard + +"@stablelib/constant-time@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/constant-time@npm:1.0.1" + checksum: 10/dba4f4bf508de2ff15f7f0cbd875e70391aa3ba3698290fe1ed2feb151c243ba08a90fc6fb390ec2230e30fcc622318c591a7c0e35dcb8150afb50c797eac3d7 + languageName: node + linkType: hard + +"@stablelib/ed25519@npm:^1.0.2": + version: 1.0.3 + resolution: "@stablelib/ed25519@npm:1.0.3" + dependencies: + "@stablelib/random": "npm:^1.0.2" + "@stablelib/sha512": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/52e861e4fbd9d3d0a1a370d9ad96de8e2e15f133249bbbc32da66b8993e843db598054a3af17a746beb3fd5043b7529613a5dda7f2e79de6613eb3ebe5ffe3dd + languageName: node + linkType: hard + +"@stablelib/hash@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hash@npm:1.0.1" + checksum: 10/3ff1f12d1a4082aaf4b6cdf40c2010aabe5c4209d3b40b97b5bbb0d9abc0ee94abdc545e57de0614afaea807ca0212ac870e247ec8f66cdce91ec39ce82948cf + languageName: node + linkType: hard + +"@stablelib/hkdf@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/hkdf@npm:1.0.1" + dependencies: + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/hmac": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/9d45e303715a1835c8612b78e6c1b9d2b7463699b484241d8681fb5c17e0f2bbde5ce211c882134b64616a402e09177baeba80426995ff227b3654a155ab225d + languageName: node + linkType: hard + +"@stablelib/hmac@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hmac@npm:1.0.1" + dependencies: + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/d3ac9e2fea2b4972a5d874ee9d96c94f8c8207452e2d243a2668b1325a7b20bd9a1541df32387789a0e9bfef82c3fe021a785f46eb3442c782443863faf75205 + languageName: node + linkType: hard + +"@stablelib/int@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/int@npm:1.0.1" + checksum: 10/65bfbf50a382eea70c68e05366bf379cfceff8fbc076f1c267ef2f2411d7aed64fd140c415cb6c29f19a3910d3b8b7805d4b32ad5721a5007a8e744a808c7ae3 + languageName: node + linkType: hard + +"@stablelib/keyagreement@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/keyagreement@npm:1.0.1" + dependencies: + "@stablelib/bytes": "npm:^1.0.1" + checksum: 10/3c8ec904dd50f72f3162f5447a0fa8f1d9ca6e24cd272d3dbe84971267f3b47f9bd5dc4e4eeedf3fbac2fe01f2d9277053e57c8e60db8c5544bfb35c62d290dd + languageName: node + linkType: hard + +"@stablelib/poly1305@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/poly1305@npm:1.0.1" + dependencies: + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/b01d4b532a42e5260f7f263e3a670924849c7ba51569abd8ece8279a448e625cbe4049bff1d50ad0d3a9d5f268c1b52fc611808640a6e684550edd7589a0a581 + languageName: node + linkType: hard + +"@stablelib/random@npm:1.0.2, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": + version: 1.0.2 + resolution: "@stablelib/random@npm:1.0.2" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/f5ace0a588dc4c21f01cb85837892d4c872e994ae77a58a8eb7dd61aa0b26fb1e9b46b0445e71af57d963ef7d9f5965c64258fc0d04df7b2947bc48f2d3560c5 + languageName: node + linkType: hard + +"@stablelib/sha256@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha256@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/4d55f6c676e2cc0dd2a32be0cfa96837f3e15ae48dc50a340e56db2b201f1341a9ecabb429a3a44a5bf31adee0a8151467a8e7cc15346c561c914faad415d4d4 + languageName: node + linkType: hard + +"@stablelib/sha512@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha512@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/35d188cd62f20d27e1d61ea07984022e9a78815a023c8f7c747d92456a60823f0683138591e87158a47cd72e73cf24ecf97f8936aa6fba8b3bef6fcb138e723d + languageName: node + linkType: hard + +"@stablelib/wipe@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/wipe@npm:1.0.1" + checksum: 10/287802eb146810a46ba72af70b82022caf83a8aeebde23605f5ee0decf64fe2b97a60c856e43b6617b5801287c30cfa863cfb0469e7fcde6f02d143cf0c6cbf4 + languageName: node + linkType: hard + +"@stablelib/x25519@npm:1.0.3": + version: 1.0.3 + resolution: "@stablelib/x25519@npm:1.0.3" + dependencies: + "@stablelib/keyagreement": "npm:^1.0.1" + "@stablelib/random": "npm:^1.0.2" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/fb5469e390ee2515d926633e3e179038894ac4f5e8c8cd2c2fc912022e34a051112eab0fe80c4dbc6e59129679844182562a036abff89444e5c4a05dd42ed329 + languageName: node + linkType: hard + "@storybook/addon-actions@npm:7.6.20": version: 7.6.20 resolution: "@storybook/addon-actions@npm:7.6.20" @@ -12837,6 +16094,36 @@ __metadata: languageName: node linkType: hard +"@tanstack/query-core@npm:5.60.5": + version: 5.60.5 + resolution: "@tanstack/query-core@npm:5.60.5" + checksum: 10/2c85ed3a26db31ea9fb2e44f94afee4564c8a5e47fc2c9f4e7a3b477e90642d1330ecdbc48f3b503205401772cedd94545eff23e628badd2bff5509b1da62e94 + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^5.59.20": + version: 5.60.5 + resolution: "@tanstack/react-query@npm:5.60.5" + dependencies: + "@tanstack/query-core": "npm:5.60.5" + peerDependencies: + react: ^18 || ^19 + checksum: 10/00a5ef74ceb50f6bbacec2545392de65d3d9e6dc6de2a7107943460a83d1988eb66740f40b8682c8de0e9a1faff76256ab1584a816c70dd4ff9205dedc209f0a + languageName: node + linkType: hard + +"@tanstack/react-virtual@npm:^3.10.5": + version: 3.10.9 + resolution: "@tanstack/react-virtual@npm:3.10.9" + dependencies: + "@tanstack/virtual-core": "npm:3.10.9" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/a6c90118d0b084aedf0a2b02bc718df5cc1e594fb60d1dededf8a393d3e519e574e2ba67bb7adcaf8b4d6b206f6a10b37166f006bc7e50ad566475323d545b8c + languageName: node + linkType: hard + "@tanstack/react-virtual@npm:^3.8.1": version: 3.10.8 resolution: "@tanstack/react-virtual@npm:3.10.8" @@ -12856,6 +16143,13 @@ __metadata: languageName: node linkType: hard +"@tanstack/virtual-core@npm:3.10.9": + version: 3.10.9 + resolution: "@tanstack/virtual-core@npm:3.10.9" + checksum: 10/15140fc41c728ed08486eba4c9caadbdb3c594f02d3b55fddca63813bc32e8cde64faf6ca6385f9815aeeedbc441dd8c9590aca4319c16a91f39b1937ef4eac7 + languageName: node + linkType: hard + "@testing-library/dom@npm:^9.3.1": version: 9.3.4 resolution: "@testing-library/dom@npm:9.3.4" @@ -13195,6 +16489,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.1.7": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "npm:*" + checksum: 10/47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 + languageName: node + linkType: hard + "@types/detect-port@npm:^1.3.0": version: 1.3.5 resolution: "@types/detect-port@npm:1.3.5" @@ -13434,6 +16737,15 @@ __metadata: languageName: node linkType: hard +"@types/lodash.mergewith@npm:4.6.9": + version: 4.6.9 + resolution: "@types/lodash.mergewith@npm:4.6.9" + dependencies: + "@types/lodash": "npm:*" + checksum: 10/c5a67e83040103decfd37090127118f5758773d0ce2a1756d442b371721737c7752f48f62544cc970f44abec8471f260cc4c844e1a4fdef8b76cb96bdec8a595 + languageName: node + linkType: hard + "@types/lodash@npm:*, @types/lodash@npm:^4.14.167": version: 4.17.7 resolution: "@types/lodash@npm:4.17.7" @@ -13506,6 +16818,13 @@ __metadata: languageName: node linkType: hard +"@types/ms@npm:*": + version: 0.7.34 + resolution: "@types/ms@npm:0.7.34" + checksum: 10/f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a + languageName: node + linkType: hard + "@types/mute-stream@npm:^0.0.1": version: 0.0.1 resolution: "@types/mute-stream@npm:0.0.1" @@ -13560,6 +16879,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:10.12.18": + version: 10.12.18 + resolution: "@types/node@npm:10.12.18" + checksum: 10/cfa39e797eed0f9eb2070315c66a5be3839ba91c57ace4eff63203f2e8c871127dd45fa5a3bd2ee6d7760608ea13f30b4fbd9a7b0b6a71b478162b2eb23d07b6 + languageName: node + linkType: hard + "@types/node@npm:11.11.6": version: 11.11.6 resolution: "@types/node@npm:11.11.6" @@ -13652,6 +16978,13 @@ __metadata: languageName: node linkType: hard +"@types/parse-json@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 10/5bf62eec37c332ad10059252fc0dab7e7da730764869c980b0714777ad3d065e490627be9f40fc52f238ffa3ac4199b19de4127196910576c2fe34dd47c7a470 + languageName: node + linkType: hard + "@types/pbkdf2@npm:^3.0.0": version: 3.1.0 resolution: "@types/pbkdf2@npm:3.1.0" @@ -13883,6 +17216,13 @@ __metadata: languageName: node linkType: hard +"@types/trusted-types@npm:^2.0.2": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 10/8e4202766a65877efcf5d5a41b7dd458480b36195e580a3b1085ad21e948bc417d55d6f8af1fd2a7ad008015d4117d5fdfe432731157da3c68678487174e4ba3 + languageName: node + linkType: hard + "@types/unist@npm:^2.0.0": version: 2.0.10 resolution: "@types/unist@npm:2.0.10" @@ -14212,6 +17552,87 @@ __metadata: languageName: node linkType: hard +"@vanilla-extract/css-utils@npm:^0.1.4": + version: 0.1.4 + resolution: "@vanilla-extract/css-utils@npm:0.1.4" + checksum: 10/37edf1f8a6dae124bc84bc0ed1260b866f563a9e4487cca6888b4eaf8d74c2f07c92566f7290e435deb38c6cba6e4c6b8fb7c22c62917afb22a9491e5d7e4c2c + languageName: node + linkType: hard + +"@vanilla-extract/css@npm:1.15.5": + version: 1.15.5 + resolution: "@vanilla-extract/css@npm:1.15.5" + dependencies: + "@emotion/hash": "npm:^0.9.0" + "@vanilla-extract/private": "npm:^1.0.6" + css-what: "npm:^6.1.0" + cssesc: "npm:^3.0.0" + csstype: "npm:^3.0.7" + dedent: "npm:^1.5.3" + deep-object-diff: "npm:^1.1.9" + deepmerge: "npm:^4.2.2" + lru-cache: "npm:^10.4.3" + media-query-parser: "npm:^2.0.2" + modern-ahocorasick: "npm:^1.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/4820caea8f7d63d5e691c72d3d324a09707040afa6b0abaaf0fea7d9ee1c133a19e5f3a383fd903453680cd0d698de0428ad2a7316e0c5e9771ffd79d813ddf6 + languageName: node + linkType: hard + +"@vanilla-extract/css@npm:^1.15.5": + version: 1.16.0 + resolution: "@vanilla-extract/css@npm:1.16.0" + dependencies: + "@emotion/hash": "npm:^0.9.0" + "@vanilla-extract/private": "npm:^1.0.6" + css-what: "npm:^6.1.0" + cssesc: "npm:^3.0.0" + csstype: "npm:^3.0.7" + dedent: "npm:^1.5.3" + deep-object-diff: "npm:^1.1.9" + deepmerge: "npm:^4.2.2" + lru-cache: "npm:^10.4.3" + media-query-parser: "npm:^2.0.2" + modern-ahocorasick: "npm:^1.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/101471e44239ca38ce2d2261a35ecf5457fb53ae346fc73fb4f1dbe545b7bc5e82fea3e0ea9c07409d53c80507410fb41260c32fcf6a5afa3be5f7cab9fab93d + languageName: node + linkType: hard + +"@vanilla-extract/dynamic@npm:2.1.2, @vanilla-extract/dynamic@npm:^2.1.2": + version: 2.1.2 + resolution: "@vanilla-extract/dynamic@npm:2.1.2" + dependencies: + "@vanilla-extract/private": "npm:^1.0.6" + checksum: 10/576b22e3f1a61abad2bc758d95f6f9eae9418f1bb6c8366211e82da7eed97ac8cf9b69fea3239832ccba280dab93d5b1def4290f64943b295f146fca78049d2d + languageName: node + linkType: hard + +"@vanilla-extract/private@npm:^1.0.6": + version: 1.0.6 + resolution: "@vanilla-extract/private@npm:1.0.6" + checksum: 10/50463610da0fc9069b3e2b33b6222ea2f005487432db9110ea430e474e29b3b756bcd1fffd47b87536358829d47bce6510398f050b5f6de07ee1e4e92eeade5a + languageName: node + linkType: hard + +"@vanilla-extract/recipes@npm:^0.5.5": + version: 0.5.5 + resolution: "@vanilla-extract/recipes@npm:0.5.5" + peerDependencies: + "@vanilla-extract/css": ^1.0.0 + checksum: 10/8d2b4f8163369424226ec9a47e754002b8a095bcf86c1a60a91b2183f59508519bd31ed41baefc950ad7ca225d75b3184c3b84d3c741c5c60d91618dd70452aa + languageName: node + linkType: hard + +"@vanilla-extract/sprinkles@npm:1.6.3": + version: 1.6.3 + resolution: "@vanilla-extract/sprinkles@npm:1.6.3" + peerDependencies: + "@vanilla-extract/css": ^1.0.0 + checksum: 10/74f8e2b189c0d48e279f1b85b5fedebf1f615ab31839964cf3861f2c5cf574567c0caeddf9c8b11327d81213f81d195efc79f136b725e6013b6d645d238d5c2b + languageName: node + linkType: hard + "@vitejs/plugin-react@npm:^3.0.1": version: 3.1.0 resolution: "@vitejs/plugin-react@npm:3.1.0" @@ -14312,6 +17733,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@wagmi/chains@npm:^1.8.0": version: 1.8.0 resolution: "@wagmi/chains@npm:1.8.0" @@ -14321,6 +17743,457 @@ __metadata: typescript: optional: true checksum: 10/8248419554a90c0d514acfc46f3a6f2090a282ff546b2488705e81fcdfaf197590e67a1fc62539383b4dd22ccafe9f16018cadad27acee098dc9d87b82f173e4 +======= +"@wagmi/connectors@npm:5.3.10": + version: 5.3.10 + resolution: "@wagmi/connectors@npm:5.3.10" + dependencies: + "@coinbase/wallet-sdk": "npm:4.2.3" + "@metamask/sdk": "npm:0.30.1" + "@safe-global/safe-apps-provider": "npm:0.18.4" + "@safe-global/safe-apps-sdk": "npm:9.1.0" + "@walletconnect/ethereum-provider": "npm:2.17.0" + cbw-sdk: "npm:@coinbase/wallet-sdk@3.9.3" + peerDependencies: + "@wagmi/core": 2.14.6 + typescript: ">=5.0.4" + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/2fa9852552d555d4dfbf45ede11ec22afd614f2b244a0bba5cd3e59196b13510d87d85b4f6677ed1949b746ab701ea47345bea3b49aa2a23441c974f5a9fe0fd + languageName: node + linkType: hard + +"@wagmi/core@npm:2.14.6": + version: 2.14.6 + resolution: "@wagmi/core@npm:2.14.6" + dependencies: + eventemitter3: "npm:5.0.1" + mipd: "npm:0.0.7" + zustand: "npm:5.0.0" + peerDependencies: + "@tanstack/query-core": ">=5.0.0" + typescript: ">=5.0.4" + viem: 2.x + peerDependenciesMeta: + "@tanstack/query-core": + optional: true + typescript: + optional: true + checksum: 10/3862660a83179e612bd357967b29b85ecd16f29030cb192eb5380f8fc7fd19ed49852b3315a012e9c2506b746dd1af870d07e9de322a3774dad2189775d3970e + languageName: node + linkType: hard + +"@wallet-standard/app@npm:^1.0.1, @wallet-standard/app@npm:^1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/app@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.1.0" + checksum: 10/d233cc79fbd857689c8c14a60875df9d8ad120fa1c9d59aeeef7303489cdecd60a12bbc2f3794720aadf6ef369cf09d1409c26c0801273561bcdb12a07b08e19 + languageName: node + linkType: hard + +"@wallet-standard/base@npm:^1.0.1, @wallet-standard/base@npm:^1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/base@npm:1.1.0" + checksum: 10/11dbb8ed80566265916ab193ad5eab1585d55996781a88039d2bc4480428b1e778901b2dcff3e688dcac7de45e8a9272026f37f07f1e75168caff581906c5079 + languageName: node + linkType: hard + +"@wallet-standard/core@npm:^1.0.3": + version: 1.1.0 + resolution: "@wallet-standard/core@npm:1.1.0" + dependencies: + "@wallet-standard/app": "npm:^1.1.0" + "@wallet-standard/base": "npm:^1.1.0" + "@wallet-standard/errors": "npm:^0.1.0" + "@wallet-standard/features": "npm:^1.1.0" + "@wallet-standard/wallet": "npm:^1.1.0" + checksum: 10/0f6a0045c3faa826dd64bea4245c287acb87f111396c261a199d3fa48344bf0b89f3e2bec874be8e32c215da728e7a19a9fe7365d008e8a969d980010a417c18 + languageName: node + linkType: hard + +"@wallet-standard/errors@npm:^0.1.0": + version: 0.1.0 + resolution: "@wallet-standard/errors@npm:0.1.0" + dependencies: + chalk: "npm:^5.3.0" + commander: "npm:^12.1.0" + bin: + errors: bin/cli.mjs + checksum: 10/5d00d0ddf5cb77cc1c9804ef7ef11fd8c7a5281c9642e9bc040a3bb01b809ef4caee7c784b695fbe61ed93bcf2c8c4d624c8b2c91050c94b0f356b124942951d + languageName: node + linkType: hard + +"@wallet-standard/features@npm:^1.0.3, @wallet-standard/features@npm:^1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/features@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.1.0" + checksum: 10/e046f813ec4bfea172aeb6c11358a962afe8f9a6961453e621d624f89d8b5fc8a44404dacfe18d33be815df6e9117bbf914009f5a9f9ea91ff90a136043fcac8 + languageName: node + linkType: hard + +"@wallet-standard/wallet@npm:^1.0.1, @wallet-standard/wallet@npm:^1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/wallet@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.1.0" + checksum: 10/b56846709c43b1dee6b44f7a9e15d89a00e4408d3d967eb438f415b42c5c52c4cf33a7b3126d0cf0dc0d78f244755e3d084a05824c1397ce58be169426c5337b + languageName: node + linkType: hard + +"@walletconnect/core@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/core@npm:2.17.0" + dependencies: + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/jsonrpc-ws-connection": "npm:1.0.14" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/utils": "npm:2.17.0" + events: "npm:3.3.0" + lodash.isequal: "npm:4.5.0" + uint8arrays: "npm:3.1.0" + checksum: 10/a37eff1a9b479fe1d51b4173128adecc0b9afd4897d912b396d19e5c2df6a928caa0fdb487f47ca26fae7f3ca59f263754f21b1861a178cfc11b4b2a783e50c4 + languageName: node + linkType: hard + +"@walletconnect/environment@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/environment@npm:1.0.1" + dependencies: + tslib: "npm:1.14.1" + checksum: 10/f6a1e3456e50cc7cfa58d99fd513ecac75573d0b8bcbbedcb1d7ec04ca9108df16b471afd40761b2a5cb4f66d8e33b7ba25f02c62c8365d68b1bd1ef52c1813e + languageName: node + linkType: hard + +"@walletconnect/ethereum-provider@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/ethereum-provider@npm:2.17.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/modal": "npm:2.7.0" + "@walletconnect/sign-client": "npm:2.17.0" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/universal-provider": "npm:2.17.0" + "@walletconnect/utils": "npm:2.17.0" + events: "npm:3.3.0" + checksum: 10/7f86efca38e6a1a59623de090296f5beff3886af50757ea024c6c0d3237e7dd7e3719be979770d4257dfae3708b1c33a242fb061b9f981fe298d666522a2610f + languageName: node + linkType: hard + +"@walletconnect/events@npm:1.0.1, @walletconnect/events@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/events@npm:1.0.1" + dependencies: + keyvaluestorage-interface: "npm:^1.0.0" + tslib: "npm:1.14.1" + checksum: 10/b5a105e9ac4d7d0a500085afd77b71e71a8ab78fd38b033e4ce91f8626fd8c254b1ba49a59c8c0ed8a00a7e8b93995163f414eda73c58694f8f830e453a902b6 + languageName: node + linkType: hard + +"@walletconnect/heartbeat@npm:1.2.1": + version: 1.2.1 + resolution: "@walletconnect/heartbeat@npm:1.2.1" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + tslib: "npm:1.14.1" + checksum: 10/a68d7efe4e69c9749dd7c3a9e351dd22adccbb925447dd7f2b2978a4cd730695cc0b4e717a08bad0d0c60e0177b77618a53f3bfb4347659f3ccfe72d412c27fb + languageName: node + linkType: hard + +"@walletconnect/heartbeat@npm:1.2.2": + version: 1.2.2 + resolution: "@walletconnect/heartbeat@npm:1.2.2" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + events: "npm:^3.3.0" + checksum: 10/f3a1c3c255ac9bd374b25e1ef65a61b1f623b9118d48471acaac1f9ee4ee1438d8d8cbc77733cdd980809b468443c046328fe5ac4084e01e0892f8c699cf44e7 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-http-connection@npm:1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.8" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.6" + "@walletconnect/safe-json": "npm:^1.0.1" + cross-fetch: "npm:^3.1.4" + events: "npm:^3.3.0" + checksum: 10/c545906243df27fdbde3c8e9005217069dd22ce0f496c59f55843ca8fcb0c1a90d2c0ac6ecb16fa110ed85c36e5486f5a74621a5ca6230667d77ee3b0ae36cc6 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-provider@npm:1.0.14": + version: 1.0.14 + resolution: "@walletconnect/jsonrpc-provider@npm:1.0.14" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.8" + "@walletconnect/safe-json": "npm:^1.0.2" + events: "npm:^3.3.0" + checksum: 10/c3c78f00148043b70213f5174d537b210f1fb231d96103cbf7d0101626578d3c13fe99ac080df7a0056c7128ce488b0523eda0e3d1deed75754672848b4909a5 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.3": + version: 1.0.3 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" + dependencies: + keyvaluestorage-interface: "npm:^1.0.0" + tslib: "npm:1.14.1" + checksum: 10/7b1209c2e6ff476e45b0d828bd4d7773873c4cff41e5ed235ff8014b4e8ff09ec704817347702fe3b8ca1c1b7920abfd0af94e0cdf582a92d8a0192d8c42dce8 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.4, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.4 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.4" + dependencies: + events: "npm:^3.3.0" + keyvaluestorage-interface: "npm:^1.0.0" + checksum: 10/8cdc9f7b5e3ae0d702a44a6fc4c388a2b627188df758ffd103ba9aac6596a787d2f319aa8f6928a03d990c71c17d9b876028f36b8e0c37bd5c9026231ed9ba45 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" + dependencies: + "@walletconnect/environment": "npm:^1.0.1" + "@walletconnect/jsonrpc-types": "npm:^1.0.3" + tslib: "npm:1.14.1" + checksum: 10/4687b4582a5c33883d94e87ca8bb22d129a2a47b6e1d9e2c3210b74f02d9677723b3bf2283d2f0fa69866b0a66a80cdfada9a2f1c204d485fbd10d2baed1f0a6 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-ws-connection@npm:1.0.14": + version: 1.0.14 + resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.14" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.6" + "@walletconnect/safe-json": "npm:^1.0.2" + events: "npm:^3.3.0" + ws: "npm:^7.5.1" + checksum: 10/2ad66217b62fb57a43c8edd33c27da0c9ba09cfec79f4d43e5d30bcb8224a48c1d1f0d6273be0371f2c7e33d8138a6fe03afa499b429ab7829d719677cd48f4d + languageName: node + linkType: hard + +"@walletconnect/keyvaluestorage@npm:1.1.1, @walletconnect/keyvaluestorage@npm:^1.1.1": + version: 1.1.1 + resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" + dependencies: + "@walletconnect/safe-json": "npm:^1.0.1" + idb-keyval: "npm:^6.2.1" + unstorage: "npm:^1.9.0" + peerDependencies: + "@react-native-async-storage/async-storage": 1.x + peerDependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + checksum: 10/fd9c275b3249d8e9f722866703b5c040eb35d0670c92a297428ffb700ac36c6b9978242beac5d2cfe97eb522ae01307cacd9c79ecf95640878804fce0f13c5e7 + languageName: node + linkType: hard + +"@walletconnect/logger@npm:2.1.2, @walletconnect/logger@npm:^2.0.1": + version: 2.1.2 + resolution: "@walletconnect/logger@npm:2.1.2" + dependencies: + "@walletconnect/safe-json": "npm:^1.0.2" + pino: "npm:7.11.0" + checksum: 10/2e6d438bd352595fff6691712c83953e3ad6b2b9ab298c5a8b670a024f53a3f744b165e5aa081a79261ee4801b93b6c60698a39947d613d49a8f6e6215ecd4c2 + languageName: node + linkType: hard + +"@walletconnect/modal-core@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal-core@npm:2.7.0" + dependencies: + valtio: "npm:1.11.2" + checksum: 10/1549f9ba5c98dfed2f97fbfccfcd2e342550c7ba7a85970bff224258dd397bad0a29721b90fef408dcc6cdfa65c52253476a04c16fece9b4d48792f03c3a4b4f + languageName: node + linkType: hard + +"@walletconnect/modal-ui@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal-ui@npm:2.7.0" + dependencies: + "@walletconnect/modal-core": "npm:2.7.0" + lit: "npm:2.8.0" + motion: "npm:10.16.2" + qrcode: "npm:1.5.3" + checksum: 10/00d17001bde7646def34eaffef81c4a580f09fdf10902a7a938cd2a3738f8f1cbb10520c229989b64e147df9f4df8ca31bd1d904f9019acc63327b495fb5b3ed + languageName: node + linkType: hard + +"@walletconnect/modal@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal@npm:2.7.0" + dependencies: + "@walletconnect/modal-core": "npm:2.7.0" + "@walletconnect/modal-ui": "npm:2.7.0" + checksum: 10/a6b78cc06479e0aa98516784ff1f81b24839777f0ec38d2f9cc85b4dc932ad6e823187bbb699f80f898e7d4b09d1232134f348eb9d12697e74e742eeaec189f2 + languageName: node + linkType: hard + +"@walletconnect/relay-api@npm:1.0.11": + version: 1.0.11 + resolution: "@walletconnect/relay-api@npm:1.0.11" + dependencies: + "@walletconnect/jsonrpc-types": "npm:^1.0.2" + checksum: 10/d85f88b9744917ee5b36d2df23bf4012819b14b73229f9bdca942bee11dd3b3428808c7528c2b1f6b3d91fa1d34a22b1e20b46533e402301318cbd4ab59b9c17 + languageName: node + linkType: hard + +"@walletconnect/relay-auth@npm:1.0.4": + version: 1.0.4 + resolution: "@walletconnect/relay-auth@npm:1.0.4" + dependencies: + "@stablelib/ed25519": "npm:^1.0.2" + "@stablelib/random": "npm:^1.0.1" + "@walletconnect/safe-json": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + tslib: "npm:1.14.1" + uint8arrays: "npm:^3.0.0" + checksum: 10/d9128b2a25f38ebf2f49f8c184dad5c997ad6343513bddd7941459c2f2757e6acfbcdd36dc9c12d0491f55723d5e2c5c0ee2e9cf381b3247274b920e95d4db0e + languageName: node + linkType: hard + +"@walletconnect/safe-json@npm:1.0.2, @walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/safe-json@npm:1.0.2" + dependencies: + tslib: "npm:1.14.1" + checksum: 10/b9d031dab3916d20fa5241d7ad2be425368ae489995ba3ba18d6ad88e81ad3ed093b8e867b8a4fc44759099896aeb5afee5635858cb80c4819ebc7ebb71ed5a6 + languageName: node + linkType: hard + +"@walletconnect/sign-client@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/sign-client@npm:2.17.0" + dependencies: + "@walletconnect/core": "npm:2.17.0" + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/utils": "npm:2.17.0" + events: "npm:3.3.0" + checksum: 10/e3eb391b4f01ae353e7c5f3580971ac7e5b9bd5a6bdb77783d8954e9c0243bb32945de230cfd09fddb2a589f28a9359de8ca313e83eae2b2e396753957d87b4c + languageName: node + linkType: hard + +"@walletconnect/time@npm:1.0.2, @walletconnect/time@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/time@npm:1.0.2" + dependencies: + tslib: "npm:1.14.1" + checksum: 10/ea84d0850e63306837f98a228e08a59f6945da38ba5553b1f158abeaa8ec4dc8a0025a0f0cfc843ddf05ce2947da95c02ac1e8cedce7092bbe1c2d46ca816dd9 + languageName: node + linkType: hard + +"@walletconnect/types@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/types@npm:2.11.0" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/heartbeat": "npm:1.2.1" + "@walletconnect/jsonrpc-types": "npm:1.0.3" + "@walletconnect/keyvaluestorage": "npm:^1.1.1" + "@walletconnect/logger": "npm:^2.0.1" + events: "npm:^3.3.0" + checksum: 10/72602e3a38dbc8db789467cbf40fad5500c2fdf736277dde11990b8d11d989c3c075cb3ab8a6e88dc7f1a6b559cd791a2aa5da843239c34a0ee726d1f73fd723 + languageName: node + linkType: hard + +"@walletconnect/types@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/types@npm:2.17.0" + dependencies: + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:2.1.2" + events: "npm:3.3.0" + checksum: 10/a0ac222a0ef92c88c159178e643752345978c69109522adea6bebb217c29a182337b2698cb16864151a0c79a457ea1b8659602af1f00dd45e1bd5308c89585cf + languageName: node + linkType: hard + +"@walletconnect/universal-provider@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/universal-provider@npm:2.17.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/sign-client": "npm:2.17.0" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/utils": "npm:2.17.0" + events: "npm:3.3.0" + checksum: 10/d03d5178677864c996460eb48072e7f9ca290fe2a1f660f4b9ec8c52e3d574af483fdbca8a95206cbe41cbc89a21b75b2ad13c55ababd3cad2e9a6e3567d2a0a + languageName: node + linkType: hard + +"@walletconnect/utils@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/utils@npm:2.17.0" + dependencies: + "@stablelib/chacha20poly1305": "npm:1.0.1" + "@stablelib/hkdf": "npm:1.0.1" + "@stablelib/random": "npm:1.0.2" + "@stablelib/sha256": "npm:1.0.1" + "@stablelib/x25519": "npm:1.0.3" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/window-getters": "npm:1.0.1" + "@walletconnect/window-metadata": "npm:1.0.1" + detect-browser: "npm:5.3.0" + elliptic: "npm:^6.5.7" + query-string: "npm:7.1.3" + uint8arrays: "npm:3.1.0" + checksum: 10/b460aeb0eb0c8e9d50677596f5fd04f940a922027b4d348e53b026e4290cb67a08941bfc6dc0fad8ae55d7434554fbe07907741658845f710a1befa39e47698c + languageName: node + linkType: hard + +"@walletconnect/window-getters@npm:1.0.1, @walletconnect/window-getters@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-getters@npm:1.0.1" + dependencies: + tslib: "npm:1.14.1" + checksum: 10/8d3fcb134fbbe903ba4a63f1fa5a7849fd443874bf45488260afc2fe3b1cbe211f86da1d76ee844be7c0e8618ae67402f94c213432fd80b04715eaf72e2e00e3 + languageName: node + linkType: hard + +"@walletconnect/window-metadata@npm:1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-metadata@npm:1.0.1" + dependencies: + "@walletconnect/window-getters": "npm:^1.0.1" + tslib: "npm:1.14.1" + checksum: 10/cf322e0860c4448cefcd81f34bc6d49d1a235a81e74a6146baefb74e47cf6c3c8050b65e534a3dc13f8d2aed3fc59732ccf48d5a01b5b23e08e1847fcffa950c +>>>>>>> origin/main languageName: node linkType: hard @@ -14362,6 +18235,29 @@ __metadata: languageName: node linkType: hard +"@zag-js/dom-query@npm:0.31.1": + version: 0.31.1 + resolution: "@zag-js/dom-query@npm:0.31.1" + checksum: 10/61f7c28e7bccf1568eb4bbf7b74a9ba41f991be792098f9c512359fae70b460895c3e48f46f86738174b079dbeab58d6771fd2565927cfe2f6c05cb50bfa812f + languageName: node + linkType: hard + +"@zag-js/element-size@npm:0.31.1": + version: 0.31.1 + resolution: "@zag-js/element-size@npm:0.31.1" + checksum: 10/a0bd5937cacce2da7705912dd79d49b162a28f9bb3f14171bc1d11aca07be9754a555d5af661c45d102833dc4558fb07ccb3aa89b9922339871bf03c7b8fa9d1 + languageName: node + linkType: hard + +"@zag-js/focus-visible@npm:^0.31.1": + version: 0.31.1 + resolution: "@zag-js/focus-visible@npm:0.31.1" + dependencies: + "@zag-js/dom-query": "npm:0.31.1" + checksum: 10/da879cf88d28a4c2da4d3f7e17797ef43dbdd9e00d6eafc72d6728be32785015bafcbc60736146fa819b33ae48bde5d8f1c9f4afff646b0dc7a7f4701b2dcd6d + languageName: node + linkType: hard + "JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -14388,9 +18284,15 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "abitype@npm:0.9.8": version: 0.9.8 resolution: "abitype@npm:0.9.8" +======= +"abitype@npm:1.0.6, abitype@npm:^1.0.6": + version: 1.0.6 + resolution: "abitype@npm:1.0.6" +>>>>>>> origin/main peerDependencies: typescript: ">=5.0.4" zod: ^3 >=3.19.1 @@ -14672,6 +18574,13 @@ __metadata: languageName: node linkType: hard +"animejs@npm:^3.2.2": + version: 3.2.2 + resolution: "animejs@npm:3.2.2" + checksum: 10/7abdb56f415c666ba02f4e64fdbb10d457fed7e3711b0f006f97e48e5650097013397d890e8ceb31e9e06b73bf6dfd9202309d0dae0fc0b5190aa7c4e0ab7054 + languageName: node + linkType: hard + "ansi-align@npm:^3.0.0": version: 3.0.1 resolution: "ansi-align@npm:3.0.1" @@ -14826,7 +18735,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3": +"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -14917,7 +18826,7 @@ __metadata: languageName: node linkType: hard -"aria-hidden@npm:^1.1.1": +"aria-hidden@npm:^1.1.1, aria-hidden@npm:^1.2.3": version: 1.2.4 resolution: "aria-hidden@npm:1.2.4" dependencies: @@ -14968,6 +18877,16 @@ __metadata: languageName: node linkType: hard +"array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.4" + checksum: 10/53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e + languageName: node + linkType: hard + "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -14975,6 +18894,20 @@ __metadata: languageName: node linkType: hard +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + is-string: "npm:^1.0.7" + checksum: 10/290b206c9451f181fb2b1f79a3bf1c0b66bb259791290ffbada760c79b284eef6f5ae2aeb4bcff450ebc9690edd25732c4c73a3c2b340fcc0f4563aed83bf488 + languageName: node + linkType: hard + "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -15002,7 +18935,21 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.3": +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/7dffcc665aa965718ad6de7e17ac50df0c5e38798c0a5bf9340cf24feb8594df6ec6f3fcbe714c1577728a1b18b5704b15669474b27bceeca91ef06ce2a23c31 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.3.1": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -15014,6 +18961,18 @@ __metadata: languageName: node linkType: hard +"array.prototype.flatmap@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flatmap@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: 10/33f20006686e0cbe844fde7fd290971e8366c6c5e3380681c2df15738b1df766dd02c7784034aeeb3b037f65c496ee54de665388288edb323a2008bb550f77ea + languageName: node + linkType: hard + "array.prototype.reduce@npm:^1.0.4": version: 1.0.4 resolution: "array.prototype.reduce@npm:1.0.4" @@ -15027,6 +18986,19 @@ __metadata: languageName: node linkType: hard +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/874694e5d50e138894ff5b853e639c29b0aa42bbd355acda8e8e9cd337f1c80565f21edc15e8c727fa4c0877fd9d8783c575809e440cc4d2d19acaa048bf967d + languageName: node + linkType: hard + "arraybuffer.prototype.slice@npm:^1.0.2": version: 1.0.2 resolution: "arraybuffer.prototype.slice@npm:1.0.2" @@ -15042,6 +19014,22 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.3" + is-array-buffer: "npm:^3.0.4" + is-shared-array-buffer: "npm:^1.0.2" + checksum: 10/0221f16c1e3ec7b67da870ee0e1f12b825b5f9189835392b59a22990f715827561a4f4cd5330dc7507de272d8df821be6cd4b0cb569babf5ea4be70e365a2f3d + languageName: node + linkType: hard + "arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" @@ -15163,6 +19151,15 @@ __metadata: languageName: node linkType: hard +"async-mutex@npm:^0.2.6": + version: 0.2.6 + resolution: "async-mutex@npm:0.2.6" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10/3cf676fc48b4686abf534cc02d4784bab3f35d7836a0a7476c96e57c3f6607dd3d94cc0989b29d33ce5ae5cde8be8e1a96f3e769ba3b0e1ba4a244f873aa5623 + languageName: node + linkType: hard + "async-mutex@npm:^0.4.0": version: 0.4.1 resolution: "async-mutex@npm:0.4.1" @@ -15218,6 +19215,15 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10/6c9da3a66caddd83c875010a1ca8ef11eac02ba15fb592dc9418b2b5e7b77b645fa7729380a92d9835c2f05f2ca1b6251f39b993e0feb3f1517c74fa1af02cab + languageName: node + linkType: hard + "aws-kms-ethers-signer@npm:^0.1.3": version: 0.1.3 resolution: "aws-kms-ethers-signer@npm:0.1.3" @@ -15362,6 +19368,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-macros@npm:^3.1.0": + version: 3.1.0 + resolution: "babel-plugin-macros@npm:3.1.0" + dependencies: + "@babel/runtime": "npm:^7.12.5" + cosmiconfig: "npm:^7.0.0" + resolve: "npm:^1.19.0" + checksum: 10/30be6ca45e9a124c58ca00af9a0753e5410ec0b79a737714fc4722bbbeb693e55d9258f05c437145ef4a867c2d1603e06a1c292d66c243ce1227458c8ea2ca8c + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.10": version: 0.4.11 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" @@ -15448,6 +19465,13 @@ __metadata: languageName: node linkType: hard +"base-x@npm:^4.0.0": + version: 4.0.0 + resolution: "base-x@npm:4.0.0" + checksum: 10/b25db9e07eb1998472a20557c7f00c797dc0595f79df95155ab74274e7fa98b9f2659b3ee547ac8773666b7f69540656793aeb97ad2b1ceccdb6fa5faaf69ac0 + languageName: node + linkType: hard + "base64-js@npm:^1.0.2, base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -15489,7 +19513,14 @@ __metadata: languageName: node linkType: hard -"big-integer@npm:^1.6.44": +"bfs-path@npm:^1.0.2": + version: 1.0.2 + resolution: "bfs-path@npm:1.0.2" + checksum: 10/0c629521b925864315ed8c73b05aff561bac9819abc872180aace924b35b337a98ffd430a1b1f580896003c7e991527f761d2a4d4161edcad844a2f122cb9489 + languageName: node + linkType: hard + +"big-integer@npm:^1.6.44, big-integer@npm:^1.6.48": version: 1.6.52 resolution: "big-integer@npm:1.6.52" checksum: 10/4bc6ae152a96edc9f95020f5fc66b13d26a9ad9a021225a9f0213f7e3dc44269f423aa8c42e19d6ac4a63bb2b22140b95d10be8f9ca7a6d9aa1b22b330d1f514 @@ -15529,6 +19560,13 @@ __metadata: languageName: node linkType: hard +"bignumber.js@npm:9.1.2, bignumber.js@npm:^9.1.2": + version: 9.1.2 + resolution: "bignumber.js@npm:9.1.2" + checksum: 10/d89b8800a987225d2c00dcbf8a69dc08e92aa0880157c851c287b307d31ceb2fc2acb0c62c3e3a3d42b6c5fcae9b004035f13eb4386e56d529d7edac18d5c9d8 + languageName: node + linkType: hard + "bignumber.js@npm:^9.0.0, bignumber.js@npm:^9.0.1": version: 9.0.2 resolution: "bignumber.js@npm:9.0.2" @@ -15566,6 +19604,21 @@ __metadata: languageName: node linkType: hard +"bip32@npm:^2.0.6": + version: 2.0.6 + resolution: "bip32@npm:2.0.6" + dependencies: + "@types/node": "npm:10.12.18" + bs58check: "npm:^2.1.1" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + tiny-secp256k1: "npm:^1.1.3" + typeforce: "npm:^1.11.5" + wif: "npm:^2.0.6" + checksum: 10/9d71a946722c302b080771ab22dc83a0d7337a29845f80715c9d258cddaf42bb42b35ab49c3498e5cc60b27c1864397d6bdac713c9726ecf72c04f07b4cb5d40 + languageName: node + linkType: hard + "bip39@npm:3.0.4": version: 3.0.4 resolution: "bip39@npm:3.0.4" @@ -15578,6 +19631,15 @@ __metadata: languageName: node linkType: hard +"bip39@npm:^3.0.3": + version: 3.1.0 + resolution: "bip39@npm:3.1.0" + dependencies: + "@noble/hashes": "npm:^1.2.0" + checksum: 10/406c0b5bdab0d43df2ff8916c5b57bb7f65cd36a115cbd7620a75b972638f8511840bfc27bfc68946027086fd33ed3050d8cd304e85fd527503b23d857a8486e + languageName: node + linkType: hard + "birpc@npm:0.2.14": version: 0.2.14 resolution: "birpc@npm:0.2.14" @@ -15709,7 +19771,7 @@ __metadata: languageName: node linkType: hard -"bowser@npm:^2.11.0": +"bowser@npm:2.11.0, bowser@npm:^2.11.0, bowser@npm:^2.9.0": version: 2.11.0 resolution: "bowser@npm:2.11.0" checksum: 10/ef46500eafe35072455e7c3ae771244e97827e0626686a9a3601c436d16eb272dad7ccbd49e2130b599b617ca9daa67027de827ffc4c220e02f63c84b69a8751 @@ -15880,7 +19942,16 @@ __metadata: languageName: node linkType: hard -"bs58check@npm:^2.1.2": +"bs58@npm:^5.0.0": + version: 5.0.0 + resolution: "bs58@npm:5.0.0" + dependencies: + base-x: "npm:^4.0.0" + checksum: 10/2475cb0684e07077521aac718e604a13e0f891d58cff923d437a2f7e9e28703ab39fce9f84c7c703ab369815a675f11e3bd394d38643bfe8969fbe42e6833d45 + languageName: node + linkType: hard + +"bs58check@npm:<3.0.0, bs58check@npm:^2.1.1, bs58check@npm:^2.1.2": version: 2.1.2 resolution: "bs58check@npm:2.1.2" dependencies: @@ -16002,6 +20073,16 @@ __metadata: languageName: node linkType: hard +"bufferutil@npm:^4.0.8": + version: 4.0.8 + resolution: "bufferutil@npm:4.0.8" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.3.0" + checksum: 10/d9337badc960a19d5a031db5de47159d7d8a11b6bab399bdfbf464ffa9ecd2972fef19bb61a7d2827e0c55f912c20713e12343386b86cb013f2b99c2324ab6a3 + languageName: node + linkType: hard + "bufio@npm:^1.0.7": version: 1.2.0 resolution: "bufio@npm:1.2.0" @@ -16130,7 +20211,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.7": +"call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": version: 1.0.7 resolution: "call-bind@npm:1.0.7" dependencies: @@ -16246,6 +20327,23 @@ __metadata: languageName: node linkType: hard +"cbw-sdk@npm:@coinbase/wallet-sdk@3.9.3": + version: 3.9.3 + resolution: "@coinbase/wallet-sdk@npm:3.9.3" + dependencies: + bn.js: "npm:^5.2.1" + buffer: "npm:^6.0.3" + clsx: "npm:^1.2.1" + eth-block-tracker: "npm:^7.1.0" + eth-json-rpc-filters: "npm:^6.0.0" + eventemitter3: "npm:^5.0.1" + keccak: "npm:^3.0.3" + preact: "npm:^10.16.0" + sha.js: "npm:^2.4.11" + checksum: 10/3bc3f0edad8ea46cb7a127993373093d95b6fef03d2a6a40bae7983a1d9a20a114faa8e7bf1230efd380ffb67b42dae405c6617cd6fad6d278bf9b9e021a0280 + languageName: node + linkType: hard + "chai-as-promised@npm:^8.0.0": version: 8.0.0 resolution: "chai-as-promised@npm:8.0.0" @@ -16492,7 +20590,7 @@ __metadata: languageName: node linkType: hard -"citty@npm:^0.1.6": +"citty@npm:^0.1.5, citty@npm:^0.1.6": version: 0.1.6 resolution: "citty@npm:0.1.6" dependencies: @@ -16654,6 +20752,24 @@ __metadata: languageName: node linkType: hard +"client-only@npm:^0.0.1": + version: 0.0.1 + resolution: "client-only@npm:0.0.1" + checksum: 10/0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 + languageName: node + linkType: hard + +"clipboardy@npm:^4.0.0": + version: 4.0.0 + resolution: "clipboardy@npm:4.0.0" + dependencies: + execa: "npm:^8.0.1" + is-wsl: "npm:^3.1.0" + is64bit: "npm:^2.0.0" + checksum: 10/ec4ebe7e5c81d9c9cb994637e7b0e068c1c8fc272167ecd5519f967427271ec66e0e64da7268a2630b860eff42933aeabe25ba5e42bb80dbf1fae6362df059ed + languageName: node + linkType: hard + "cliui@npm:^5.0.0": version: 5.0.0 resolution: "cliui@npm:5.0.0" @@ -16725,13 +20841,20 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^2.0.0, clsx@npm:^2.1.1": +"clsx@npm:2.1.1, clsx@npm:^2.0.0, clsx@npm:^2.1.1": version: 2.1.1 resolution: "clsx@npm:2.1.1" checksum: 10/cdfb57fa6c7649bbff98d9028c2f0de2f91c86f551179541cf784b1cfdc1562dcb951955f46d54d930a3879931a980e32a46b598acaea274728dbe068deca919 languageName: node linkType: hard +"clsx@npm:^1.2.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 10/5ded6f61f15f1fa0350e691ccec43a28b12fb8e64c8e94715f2a937bc3722d4c3ed41d6e945c971fc4dcc2a7213a43323beaf2e1c28654af63ba70c9968a8643 + languageName: node + linkType: hard + "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -16746,15 +20869,6 @@ __metadata: languageName: node linkType: hard -"coingecko-api-v3@npm:^0.0.29": - version: 0.0.29 - resolution: "coingecko-api-v3@npm:0.0.29" - dependencies: - https: "npm:^1.0.0" - checksum: 10/e60a0996472419232a144ec77028c060bd9c289f799dd40d46dbb7229cff3d868a3e35bf88724059dc25767b8136d794789e4dd31711592fa73a7be1ca2fcbc7 - languageName: node - linkType: hard - "collect-v8-coverage@npm:^1.0.0": version: 1.0.2 resolution: "collect-v8-coverage@npm:1.0.2" @@ -16803,6 +20917,13 @@ __metadata: languageName: node linkType: hard +"color2k@npm:^2.0.2": + version: 2.0.3 + resolution: "color2k@npm:2.0.3" + checksum: 10/63385b3c43749a96a4edfd5f4d30103f850e5a4ab01ad39ec70bebd940a237ab79cbd2d7b2bf4eede6ef6122a1b904877f628500fdc5521310e39d3572370d6c + languageName: node + linkType: hard + "colorette@npm:^2.0.16": version: 2.0.17 resolution: "colorette@npm:2.0.17" @@ -17028,6 +21149,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^1.5.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 10/dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -17035,6 +21163,13 @@ __metadata: languageName: node linkType: hard +"cookie-es@npm:^1.2.2": + version: 1.2.2 + resolution: "cookie-es@npm:1.2.2" + checksum: 10/0fd742c11caa185928e450543f84df62d4b2c1fc7b5041196b57b7db04e1c6ac6585fb40e4f579a2819efefd2d6a9cbb4d17f71240d05f4dcd8f74ae81341a20 + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -17063,6 +21198,15 @@ __metadata: languageName: node linkType: hard +"copy-to-clipboard@npm:3.3.3, copy-to-clipboard@npm:^3.3.3": + version: 3.3.3 + resolution: "copy-to-clipboard@npm:3.3.3" + dependencies: + toggle-selection: "npm:^1.0.6" + checksum: 10/e0a325e39b7615108e6c1c8ac110ae7b829cdc4ee3278b1df6a0e4228c490442cc86444cd643e2da344fbc424b3aab8909e2fec82f8bc75e7e5b190b7c24eecf + languageName: node + linkType: hard + "core-js-compat@npm:^3.36.1, core-js-compat@npm:^3.37.1": version: 3.37.1 resolution: "core-js-compat@npm:3.37.1" @@ -17103,6 +21247,19 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^7.0.0": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.2.1" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.10.0" + checksum: 10/03600bb3870c80ed151b7b706b99a1f6d78df8f4bdad9c95485072ea13358ef294b13dd99f9e7bf4cc0b43bcd3599d40df7e648750d21c2f6817ca2cd687e071 + languageName: node + linkType: hard + "cosmiconfig@npm:^8.0.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" @@ -17196,6 +21353,15 @@ __metadata: languageName: node linkType: hard +"cross-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "cross-fetch@npm:4.0.0" + dependencies: + node-fetch: "npm:^2.6.12" + checksum: 10/e231a71926644ef122d334a3a4e73d9ba3ba4b480a8a277fb9badc434c1ba905b3d60c8034e18b348361a09afbec40ba9371036801ba2b675a7b84588f9f55d8 + languageName: node + linkType: hard + "cross-spawn@npm:^5.1.0": version: 5.1.0 resolution: "cross-spawn@npm:5.1.0" @@ -17231,6 +21397,15 @@ __metadata: languageName: node linkType: hard +"crossws@npm:>=0.2.0 <0.4.0": + version: 0.3.1 + resolution: "crossws@npm:0.3.1" + dependencies: + uncrypto: "npm:^0.1.3" + checksum: 10/d358a58b364b3314a0e42ee66b1432c01d416128e53eda983eb121abdad5ff39831a1f1ea3e90e80157ceaa0fc925f5193c151b156aa62af9e0c9bcb2fb2a15a + languageName: node + linkType: hard + "crypt@npm:>= 0.0.1": version: 0.0.2 resolution: "crypt@npm:0.0.2" @@ -17238,7 +21413,7 @@ __metadata: languageName: node linkType: hard -"crypto-js@npm:^4.2.0": +"crypto-js@npm:^4.0.0, crypto-js@npm:^4.2.0": version: 4.2.0 resolution: "crypto-js@npm:4.2.0" checksum: 10/c7bcc56a6e01c3c397e95aa4a74e4241321f04677f9a618a8f48a63b5781617248afb9adb0629824792e7ec20ca0d4241a49b6b2938ae6f973ec4efc5c53c924 @@ -17252,6 +21427,13 @@ __metadata: languageName: node linkType: hard +"css-what@npm:^6.1.0": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: 10/c67a3a2d0d81843af87f8bf0a4d0845b0f952377714abbb2884e48942409d57a2110eabee003609d02ee487b054614bdfcfc59ee265728ff105bd5aa221c1d0e + languageName: node + linkType: hard + "css.escape@npm:^1.5.1": version: 1.5.1 resolution: "css.escape@npm:1.5.1" @@ -17268,7 +21450,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": +"csstype@npm:^3.0.2, csstype@npm:^3.0.7, csstype@npm:^3.1.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" checksum: 10/f593cce41ff5ade23f44e77521e3a1bcc2c64107041e1bf6c3c32adc5187d0d60983292fda326154d20b01079e24931aa5b08e4467cc488b60bb1e7f6d478ade @@ -17334,6 +21516,48 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/5919a39a18ee919573336158fd162fdf8ada1bc23a139f28543fd45fac48e0ea4a3ad3bfde91de124d4106e65c4a7525f6a84c20ba0797ec890a77a96d13a82a + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-length@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/f33c65e58d8d0432ad79761f2e8a579818d724b5dc6dc4e700489b762d963ab30873c0f1c37d8f2ed12ef51c706d1195f64422856d25f067457aeec50cc40aac + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "data-view-byte-offset@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/96f34f151bf02affb7b9f98762fb7aca1dd5f4553cb57b80bce750ca609c15d33ca659568ef1d422f7e35680736cbccb893a3d4b012760c758c1446bbdc4c6db + languageName: node + linkType: hard + +"date-fns@npm:^2.29.3": + version: 2.30.0 + resolution: "date-fns@npm:2.30.0" + dependencies: + "@babel/runtime": "npm:^7.21.0" + checksum: 10/70b3e8ea7aaaaeaa2cd80bd889622a4bcb5d8028b4de9162cbcda359db06e16ff6e9309e54eead5341e71031818497f19aaf9839c87d1aba1e27bb4796e758a9 + languageName: node + linkType: hard + "date-fns@npm:^3.6.0": version: 3.6.0 resolution: "date-fns@npm:3.6.0" @@ -17387,6 +21611,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:~4.3.1, debug@npm:~4.3.2": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a + languageName: node + linkType: hard + "decamelize-keys@npm:^1.1.0": version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" @@ -17418,6 +21654,13 @@ __metadata: languageName: node linkType: hard +"decode-uri-component@npm:^0.2.2": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 10/17a0e5fa400bf9ea84432226e252aa7b5e72793e16bf80b907c99b46a799aeacc139ec20ea57121e50c7bd875a1a4365928f884e92abf02e21a5a13790a0f33e + languageName: node + linkType: hard + "decompress-response@npm:^3.2.0, decompress-response@npm:^3.3.0": version: 3.3.0 resolution: "decompress-response@npm:3.3.0" @@ -17457,6 +21700,18 @@ __metadata: languageName: node linkType: hard +"dedent@npm:^1.5.3": + version: 1.5.3 + resolution: "dedent@npm:1.5.3" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10/e5277f6268f288649503125b781a7b7a2c9b22d011139688c0b3619fe40121e600eb1f077c891938d4b2428bdb6326cc3c77a763e4b1cc681bd9666ab1bad2a1 + languageName: node + linkType: hard + "deep-eql@npm:^3.0.1": version: 3.0.1 resolution: "deep-eql@npm:3.0.1" @@ -17638,6 +21893,13 @@ __metadata: languageName: node linkType: hard +"delay@npm:^4.4.0": + version: 4.4.1 + resolution: "delay@npm:4.4.1" + checksum: 10/97b001126a3979a398b6c5f33e437d78acda3b19731d9e6f991a05e2e09e7a410d655b8fdcaedc05743928bb533c0ac9401826cccb2af71c81d2cab50e199351 + languageName: node + linkType: hard + "delay@npm:^5.0.0": version: 5.0.0 resolution: "delay@npm:5.0.0" @@ -17680,6 +21942,13 @@ __metadata: languageName: node linkType: hard +"destr@npm:^2.0.3": + version: 2.0.3 + resolution: "destr@npm:2.0.3" + checksum: 10/dbb756baa876810ec0ca4bcb702d86cc3b480ed14f36bf5747718ed211f96bca5520b63a4109eb181ad940ee2a645677d9a63d4a0ed11a7510619dae97317201 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -17687,6 +21956,13 @@ __metadata: languageName: node linkType: hard +"detect-browser@npm:5.3.0, detect-browser@npm:^5.2.0": + version: 5.3.0 + resolution: "detect-browser@npm:5.3.0" + checksum: 10/4a8551e1f5170633c9aa976f16c57f81f1044d071b2eb853c572bd817bf9cd0cc90c9c520d950edb5accd31b1b0c8ddb7a96e82040b0b5579f9f09c77446a117 + languageName: node + linkType: hard + "detect-indent@npm:^6.0.0, detect-indent@npm:^6.1.0": version: 6.1.0 resolution: "detect-indent@npm:6.1.0" @@ -17797,6 +22073,13 @@ __metadata: languageName: node linkType: hard +"dijkstrajs@npm:^1.0.1": + version: 1.0.3 + resolution: "dijkstrajs@npm:1.0.3" + checksum: 10/0d8429699a6d5897ed371de494ef3c7072e8052b42abbd978e686a9b8689e70af005fa3e93e93263ee3653673ff5f89c36db830a57ae7c2e088cb9c496307507 + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -17813,6 +22096,15 @@ __metadata: languageName: node linkType: hard +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10/555684f77e791b17173ea86e2eea45ef26c22219cb64670669c4f4bebd26dbc95cd90ec1f4159e9349a6bb9eb892ce4dde8cd0139e77bedd8bf4518238618474 + languageName: node + linkType: hard + "doctrine@npm:^3.0.0": version: 3.0.0 resolution: "doctrine@npm:3.0.0" @@ -17899,7 +22191,7 @@ __metadata: languageName: node linkType: hard -"duplexify@npm:^4.0.0": +"duplexify@npm:^4.0.0, duplexify@npm:^4.1.2": version: 4.1.3 resolution: "duplexify@npm:4.1.3" dependencies: @@ -17937,6 +22229,18 @@ __metadata: languageName: node linkType: hard +"eciesjs@npm:^0.4.8": + version: 0.4.11 + resolution: "eciesjs@npm:0.4.11" + dependencies: + "@ecies/ciphers": "npm:^0.2.1" + "@noble/ciphers": "npm:^1.0.0" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + checksum: 10/3906d6286c4cde8dd93f5b8e1ad085aa0fdfd9a272c77a382062a782693247d19b6a99d749aff77d037777cfc49c02a8869a3aad47f192ac4f473b87cdbff4af + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -17984,6 +22288,21 @@ __metadata: languageName: node linkType: hard +"elliptic@npm:^6.5.3, elliptic@npm:^6.5.7": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10/dc678c9febd89a219c4008ba3a9abb82237be853d9fd171cd602c8fb5ec39927e65c6b5e7a1b2a4ea82ee8e0ded72275e7932bb2da04a5790c2638b818e4e1c5 + languageName: node + linkType: hard + "emittery@npm:0.10.0": version: 0.10.0 resolution: "emittery@npm:0.10.0" @@ -18026,7 +22345,7 @@ __metadata: languageName: node linkType: hard -"encode-utf8@npm:^1.0.2": +"encode-utf8@npm:^1.0.2, encode-utf8@npm:^1.0.3": version: 1.0.3 resolution: "encode-utf8@npm:1.0.3" checksum: 10/0204c37cda21bf19bb8f87f7ec6c89a23d43488c2ef1e5cfa40b64ee9568e63e15dc323fa7f50a491e2c6d33843a6b409f6de09afbf6cf371cb8da596cc64b44 @@ -18061,7 +22380,7 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": +"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.0, end-of-stream@npm:^1.4.1": version: 1.4.4 resolution: "end-of-stream@npm:1.4.4" dependencies: @@ -18070,6 +22389,26 @@ __metadata: languageName: node linkType: hard +"engine.io-client@npm:~6.6.1": + version: 6.6.2 + resolution: "engine.io-client@npm:6.6.2" + dependencies: + "@socket.io/component-emitter": "npm:~3.1.0" + debug: "npm:~4.3.1" + engine.io-parser: "npm:~5.2.1" + ws: "npm:~8.17.1" + xmlhttprequest-ssl: "npm:~2.1.1" + checksum: 10/c006b3389bb8bd0381926b9633e9f547dec187ea28d2dd99cb42d516b0720bc4373f3f937c199ca616c95b2832e0f547f73326f614caedfe39c02fa93b7ac733 + languageName: node + linkType: hard + +"engine.io-parser@npm:~5.2.1": + version: 5.2.3 + resolution: "engine.io-parser@npm:5.2.3" + checksum: 10/eb0023fff5766e7ae9d59e52d92df53fea06d472cfd7b52e5d2c36b4c1dbf78cab5fde1052bcb3d4bb85bdb5aee10ae85d8a1c6c04676dac0c6cdf16bcba6380 + languageName: node + linkType: hard + "enquirer@npm:^2.3.0": version: 2.3.6 resolution: "enquirer@npm:2.3.6" @@ -18153,6 +22492,60 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": + version: 1.23.3 + resolution: "es-abstract@npm:1.23.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + arraybuffer.prototype.slice: "npm:^1.0.3" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + data-view-buffer: "npm:^1.0.1" + data-view-byte-length: "npm:^1.0.1" + data-view-byte-offset: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-set-tostringtag: "npm:^2.0.3" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.6" + get-intrinsic: "npm:^1.2.4" + get-symbol-description: "npm:^1.0.2" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.1" + is-negative-zero: "npm:^2.0.3" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.3" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.13" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.13.1" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.5" + regexp.prototype.flags: "npm:^1.5.2" + safe-array-concat: "npm:^1.1.2" + safe-regex-test: "npm:^1.0.3" + string.prototype.trim: "npm:^1.2.9" + string.prototype.trimend: "npm:^1.0.8" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.2" + typed-array-byte-length: "npm:^1.0.1" + typed-array-byte-offset: "npm:^1.0.2" + typed-array-length: "npm:^1.0.6" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.15" + checksum: 10/2da795a6a1ac5fc2c452799a409acc2e3692e06dc6440440b076908617188899caa562154d77263e3053bcd9389a07baa978ab10ac3b46acc399bd0c77be04cb + languageName: node + linkType: hard + "es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5, es-abstract@npm:^1.20.0, es-abstract@npm:^1.20.1": version: 1.20.1 resolution: "es-abstract@npm:1.20.1" @@ -18247,7 +22640,7 @@ __metadata: languageName: node linkType: hard -"es-errors@npm:^1.3.0": +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: 10/96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 @@ -18271,6 +22664,29 @@ __metadata: languageName: node linkType: hard +"es-iterator-helpers@npm:^1.1.0": + version: 1.2.0 + resolution: "es-iterator-helpers@npm:1.2.0" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.7" + iterator.prototype: "npm:^1.1.3" + safe-array-concat: "npm:^1.1.2" + checksum: 10/a4159e36c6bae03d4b636894fff2ff1acfcedc16c622939298b00adf4d2da6356ad92f682cc75c037a012a4b06adb903f67dfdfd05bac61847e9b763de2acbcb + languageName: node + linkType: hard + "es-module-lexer@npm:^0.9.3": version: 0.9.3 resolution: "es-module-lexer@npm:0.9.3" @@ -18278,6 +22694,15 @@ __metadata: languageName: node linkType: hard +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10/f8910cf477e53c0615f685c5c96210591841850871b81924fcf256bfbaa68c254457d994a4308c60d15b20805e7f61ce6abc669375e01a5349391a8c1767584f + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.2 resolution: "es-set-tostringtag@npm:2.0.2" @@ -18289,7 +22714,18 @@ __metadata: languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: "npm:^1.2.4" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.1" + checksum: 10/7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": version: 1.0.2 resolution: "es-shim-unscopables@npm:1.0.2" dependencies: @@ -18800,6 +23236,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:2.0.0, escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10/9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + "escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -18807,13 +23250,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 10/9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 - languageName: node - linkType: hard - "escodegen@npm:1.8.x": version: 1.8.1 resolution: "escodegen@npm:1.8.1" @@ -18880,6 +23316,43 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react-hooks@npm:^5.0.0": + version: 5.0.0 + resolution: "eslint-plugin-react-hooks@npm:5.0.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + checksum: 10/b762789832806b6981e2d910994e72aa7a85136fe0880572334b26cf1274ba37bd3b1365e77d2c2f92465337c4a65c84ef647bc499d33b86fc1110f2df7ef1bb + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.37.2": + version: 7.37.2 + resolution: "eslint-plugin-react@npm:7.37.2" + dependencies: + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.2" + array.prototype.tosorted: "npm:^1.1.4" + doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.1.0" + estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.8" + object.fromentries: "npm:^2.0.8" + object.values: "npm:^1.2.0" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.5" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.11" + string.prototype.repeat: "npm:^1.0.0" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10/df2f7ab198018d3378f305a8a5ceceebc9bd31f019fc7567a2ef9c77789dc8a6a2c3c3957f8b0805f26c11c02f9f86c972e02cd0eda12f4d0370526c11f8a9a3 + languageName: node + linkType: hard + "eslint-plugin-storybook@npm:^0.6.15": version: 0.6.15 resolution: "eslint-plugin-storybook@npm:0.6.15" @@ -19046,7 +23519,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" checksum: 10/37cbe6e9a68014d34dbdc039f90d0baf72436809d02edffcc06ba3c2a12eb298048f877511353b130153e532aac8d68ba78430c0dd2f44806ebc7c014b01585e @@ -19090,6 +23563,19 @@ __metadata: languageName: node linkType: hard +"eth-block-tracker@npm:^7.1.0": + version: 7.1.0 + resolution: "eth-block-tracker@npm:7.1.0" + dependencies: + "@metamask/eth-json-rpc-provider": "npm:^1.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" + json-rpc-random-id: "npm:^1.0.1" + pify: "npm:^3.0.0" + checksum: 10/b001ecb126e949a9ff19950596d5180b2f1bc5504e3dec0c01b3417e8ad190f4a53dfc61be901b72ab6dd558d1d711b73eca560bc8a605d0348eef9f501defab + languageName: node + linkType: hard + "eth-ens-namehash@npm:2.0.8": version: 2.0.8 resolution: "eth-ens-namehash@npm:2.0.8" @@ -19128,6 +23614,19 @@ __metadata: languageName: node linkType: hard +"eth-json-rpc-filters@npm:^6.0.0": + version: 6.0.1 + resolution: "eth-json-rpc-filters@npm:6.0.1" + dependencies: + "@metamask/safe-event-emitter": "npm:^3.0.0" + async-mutex: "npm:^0.2.6" + eth-query: "npm:^2.1.2" + json-rpc-engine: "npm:^6.1.0" + pify: "npm:^5.0.0" + checksum: 10/d1fa8bb21da07c2f5d37c1e6053d499b272b4f49542077efc6b05eebe49affa9df7221c8c2439c4e33caa3f4ccb35240a6105abc83b83375dae03c0de53113a7 + languageName: node + linkType: hard + "eth-lib@npm:0.2.8": version: 0.2.8 resolution: "eth-lib@npm:0.2.8" @@ -19153,6 +23652,25 @@ __metadata: languageName: node linkType: hard +"eth-query@npm:^2.1.2": + version: 2.1.2 + resolution: "eth-query@npm:2.1.2" + dependencies: + json-rpc-random-id: "npm:^1.0.0" + xtend: "npm:^4.0.1" + checksum: 10/af4f3575b8315f8156a83a24e850881053748aca97e4aee12dd6645ab56f0985c7000a5c45ccf315702f3e532f0c6464e03f4aba294c658dee89f5e5d1b86702 + languageName: node + linkType: hard + +"eth-rpc-errors@npm:^4.0.2, eth-rpc-errors@npm:^4.0.3": + version: 4.0.3 + resolution: "eth-rpc-errors@npm:4.0.3" + dependencies: + fast-safe-stringify: "npm:^2.0.6" + checksum: 10/47ce14170eabaee51ab1cc7e643bb3ef96ee6b15c6404806aedcd51750e00ae0b1a12c37785b180679b8d452b6dd44a0240bb018d01fa73efc85fcfa808b35a7 + languageName: node + linkType: hard + "ethereum-bloom-filters@npm:^1.0.6": version: 1.0.10 resolution: "ethereum-bloom-filters@npm:1.0.10" @@ -19197,6 +23715,18 @@ __metadata: languageName: node linkType: hard +"ethereum-cryptography@npm:^2.0.0": + version: 2.2.1 + resolution: "ethereum-cryptography@npm:2.2.1" + dependencies: + "@noble/curves": "npm:1.4.2" + "@noble/hashes": "npm:1.4.0" + "@scure/bip32": "npm:1.4.0" + "@scure/bip39": "npm:1.3.0" + checksum: 10/ab123bbfe843500ac2d645ce9edc4bc814962ffb598db6bf8bf01fbecac656e6c81ff4cf2472f1734844bbcbad2bf658d8b699cb7248d768e0f06ae13ecf43b8 + languageName: node + linkType: hard + "ethereum-waffle@npm:^4.0.10": version: 4.0.10 resolution: "ethereum-waffle@npm:4.0.10" @@ -19348,6 +23878,13 @@ __metadata: languageName: node linkType: hard +"eventemitter2@npm:^6.4.7": + version: 6.4.9 + resolution: "eventemitter2@npm:6.4.9" + checksum: 10/b829b1c6b11e15926b635092b5ad62b4463d1c928859831dcae606e988cf41893059e3541f5a8209d21d2f15314422ddd4d84d20830b4bf44978608d15b06b08 + languageName: node + linkType: hard + "eventemitter3@npm:4.0.4": version: 4.0.4 resolution: "eventemitter3@npm:4.0.4" @@ -19355,6 +23892,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:5.0.1, eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -19362,7 +23906,11 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "events@npm:^3.2.0, events@npm:^3.3.0": +======= +"events@npm:3.3.0, events@npm:^3.2.0, events@npm:^3.3.0": +>>>>>>> origin/main version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be @@ -19588,6 +24136,16 @@ __metadata: languageName: node linkType: hard +"extension-port-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "extension-port-stream@npm:3.0.0" + dependencies: + readable-stream: "npm:^3.6.2 || ^4.4.2" + webextension-polyfill: "npm:>=0.10.0 <1.0" + checksum: 10/4f51d2258a96154c2d916a8a5425636a2b0817763e9277f7dc378d08b6f050c90d185dbde4313d27cf66ad99d4b3116479f9f699c40358c64cccfa524d2b55bf + languageName: node + linkType: hard + "external-editor@npm:^3.0.3, external-editor@npm:^3.1.0": version: 3.1.0 resolution: "external-editor@npm:3.1.0" @@ -19702,13 +24260,20 @@ __metadata: languageName: node linkType: hard -"fast-redact@npm:^3.1.1": +"fast-redact@npm:^3.0.0, fast-redact@npm:^3.1.1": version: 3.5.0 resolution: "fast-redact@npm:3.5.0" checksum: 10/24b27e2023bd5a62f908d97a753b1adb8d89206b260f97727728e00b693197dea2fc2aa3711147a385d0ec6e713569fd533df37a4ef947e08cb65af3019c7ad5 languageName: node linkType: hard +"fast-safe-stringify@npm:^2.0.6": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: 10/dc1f063c2c6ac9533aee14d406441f86783a8984b2ca09b19c2fe281f9ff59d315298bc7bc22fd1f83d26fe19ef2f20e2ddb68e96b15040292e555c5ced0c1e4 + languageName: node + linkType: hard + "fast-stable-stringify@npm:^1.0.0": version: 1.0.0 resolution: "fast-stable-stringify@npm:1.0.0" @@ -19823,6 +24388,13 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: 10/9d681939eec2b4b129cb4f307b7e93d954a0657421d4e5357d86093b26d3f4f570909ed43717dcfd62428b3cf8cddd9841b35f9d40d12ac62cfabaa677942593 + languageName: node + linkType: hard + "finalhandler@npm:1.2.0": version: 1.2.0 resolution: "finalhandler@npm:1.2.0" @@ -19869,6 +24441,13 @@ __metadata: languageName: node linkType: hard +"find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: 10/caa799c976a14925ba7f31ca1a226fe73d3aa270f4f1b623fcfeb1c6e263111db4beb807d8acd31bd4d48d44c343b93688a9288dfbccca27463c36a0301b0bb9 + languageName: node + linkType: hard + "find-up@npm:3.0.0, find-up@npm:^3.0.0": version: 3.0.0 resolution: "find-up@npm:3.0.0" @@ -19968,6 +24547,15 @@ __metadata: languageName: node linkType: hard +"focus-lock@npm:^1.3.5": + version: 1.3.5 + resolution: "focus-lock@npm:1.3.5" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10/1078c9d1f5515c47961a27d22b3b09c2a4eaf42a405f9be621d5ec5f426086a65f5937bff8a104e93d4bd84a7d8364e2f3ec07be876dae259df207384bbfb5de + languageName: node + linkType: hard + "follow-redirects@npm:^1.12.1": version: 1.15.1 resolution: "follow-redirects@npm:1.15.1" @@ -20099,6 +24687,36 @@ __metadata: languageName: node linkType: hard +"framer-motion@npm:^10.16.4": + version: 10.18.0 + resolution: "framer-motion@npm:10.18.0" + dependencies: + "@emotion/is-prop-valid": "npm:^0.8.2" + tslib: "npm:^2.4.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependenciesMeta: + "@emotion/is-prop-valid": + optional: true + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 10/8dc61e16af34ea7c7e830e03f588c54b7a186a767787eb6373ac692bbffa219959d50b7cf983f54305951e121ea7d50ebd4819920290fc6ad58b03fc5eb2bdde + languageName: node + linkType: hard + +"framesync@npm:6.1.2": + version: 6.1.2 + resolution: "framesync@npm:6.1.2" + dependencies: + tslib: "npm:2.4.0" + checksum: 10/741161b8978173acaf515ab45ff127496476e6262e624de3ccb995a67a8b32c65a4242e178646bb5554f128dd4a350ecff675c7fbd4e2aa4568dffab932ebe29 + languageName: node + linkType: hard + "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -20486,7 +25104,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4": +"get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" dependencies: @@ -20520,6 +25138,13 @@ __metadata: languageName: node linkType: hard +"get-port-please@npm:^3.1.2": + version: 3.1.2 + resolution: "get-port-please@npm:3.1.2" + checksum: 10/ec8b8da9f816edde114b76742ec29695730094904bb0e94309081e4adf3f797b483b9d648abcf5e0511c4e21a7bf68334672b9575f8b23bccf93bf97eb517f0e + languageName: node + linkType: hard + "get-port@npm:^3.1.0": version: 3.2.0 resolution: "get-port@npm:3.2.0" @@ -20584,6 +25209,17 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + checksum: 10/e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 + languageName: node + linkType: hard + "get-tsconfig@npm:^4.7.2": version: 4.7.3 resolution: "get-tsconfig@npm:4.7.3" @@ -20857,6 +25493,16 @@ __metadata: languageName: node linkType: hard +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10/1f1fd078fb2f7296306ef9dd51019491044ccf17a59ed49d375b576ca108ff37e47f3d29aead7add40763574a992f16a5367dd1e2173b8634ef18556ab719ac4 + languageName: node + linkType: hard + "globby@npm:^10.0.1": version: 10.0.2 resolution: "globby@npm:10.0.2" @@ -21072,6 +25718,24 @@ __metadata: languageName: node linkType: hard +"h3@npm:^1.12.0, h3@npm:^1.13.0": + version: 1.13.0 + resolution: "h3@npm:1.13.0" + dependencies: + cookie-es: "npm:^1.2.2" + crossws: "npm:>=0.2.0 <0.4.0" + defu: "npm:^6.1.4" + destr: "npm:^2.0.3" + iron-webcrypto: "npm:^1.2.1" + ohash: "npm:^1.1.4" + radix3: "npm:^1.1.2" + ufo: "npm:^1.5.4" + uncrypto: "npm:^0.1.3" + unenv: "npm:^1.10.0" + checksum: 10/ecdbe3cdddc767ea6f9be9939b14192dd296eb434641bbecc5b665f7210de8c03910ae40931668788395b5de6cd517afaa628d7b5ce0fb60786fce1ad6e81bcb + languageName: node + linkType: hard + "handlebars@npm:^4.0.1": version: 4.7.7 resolution: "handlebars@npm:4.7.7" @@ -21392,6 +26056,13 @@ __metadata: languageName: node linkType: hard +"has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 10/0b67c2c94e3bea37db3e412e3c41f79d59259875e636ba471e94c009cdfb1fa82bf045deeffafc7dbb9c148e36cae6b467055aaa5d9fad4316e11b41e3ba551a + languageName: node + linkType: hard + "has-symbol-support-x@npm:^1.4.1": version: 1.4.2 resolution: "has-symbol-support-x@npm:1.4.2" @@ -21424,6 +26095,15 @@ __metadata: languageName: node linkType: hard +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10/c74c5f5ceee3c8a5b8bc37719840dc3749f5b0306d818974141dda2471a1a2ca6c8e46b9d6ac222c5345df7a901c9b6f350b1e6d62763fec877e26609a401bfe + languageName: node + linkType: hard + "has-unicode@npm:^2.0.0, has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -21480,6 +26160,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10/7898a9c1788b2862cf0f9c345a6bec77ba4a0c0983c7f19d610c382343d4f98fa260686b225dfb1f88393a66679d2ec58ee310c1d6868c081eda7918f32cc70a + languageName: node + linkType: hard + "he@npm:1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -21496,6 +26185,13 @@ __metadata: languageName: node linkType: hard +"hey-listen@npm:^1.0.8": + version: 1.0.8 + resolution: "hey-listen@npm:1.0.8" + checksum: 10/744b5f4c18c7cfb82b22bd22e1d300a9ac4eafe05a22e58fb87e48addfca8be00604d9aa006434ea02f9530990eb4b393ddb28659e2ab7f833ce873e32eb809c + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -21507,6 +26203,15 @@ __metadata: languageName: node linkType: hard +"hoist-non-react-statics@npm:^3.3.1": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: "npm:^16.7.0" + checksum: 10/1acbe85f33e5a39f90c822ad4d28b24daeb60f71c545279431dc98c312cd28a54f8d64788e477fe21dc502b0e3cf58589ebe5c1ad22af27245370391c2d24ea6 + languageName: node + linkType: hard + "hosted-git-info@npm:^2.1.4, hosted-git-info@npm:^2.6.0": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" @@ -21594,6 +26299,13 @@ __metadata: languageName: node linkType: hard +"http-shutdown@npm:^1.2.2": + version: 1.2.2 + resolution: "http-shutdown@npm:1.2.2" + checksum: 10/1c99b575b1a7ebd749950e7f59410348723638808336063321d89588b7f7b548d61c8e3566af0f1f4f961d941c758677d062d2289bc63356ead143da4d8f3daf + languageName: node + linkType: hard + "http-signature@npm:~1.2.0": version: 1.2.0 resolution: "http-signature@npm:1.2.0" @@ -21645,13 +26357,6 @@ __metadata: languageName: node linkType: hard -"https@npm:^1.0.0": - version: 1.0.0 - resolution: "https@npm:1.0.0" - checksum: 10/ccea8a8363a018d4b241db7748cff3a85c9f5b71bf80639e9c37dc6823f590f35dda098b80b726930e9f945387c8bfd6b1461df25cab5bf65a31903d81875b5d - languageName: node - linkType: hard - "human-id@npm:^1.0.2": version: 1.0.2 resolution: "human-id@npm:1.0.2" @@ -21691,6 +26396,24 @@ __metadata: languageName: node linkType: hard +"i18next-browser-languagedetector@npm:7.1.0": + version: 7.1.0 + resolution: "i18next-browser-languagedetector@npm:7.1.0" + dependencies: + "@babel/runtime": "npm:^7.19.4" + checksum: 10/3b06c8a5df09092cffc0b6637b542bb572e8a25dcba97d0d8a5e5dd7539b90bf00000f3a279654693f4b5908c5fc4d1d4f3766dfb461dacab46be3d071266384 + languageName: node + linkType: hard + +"i18next@npm:23.11.5": + version: 23.11.5 + resolution: "i18next@npm:23.11.5" + dependencies: + "@babel/runtime": "npm:^7.23.2" + checksum: 10/3a8e0d5d2b9ac6c6fa8c2180452aaf816d60e1cc790da69d6be515feec85553f8af9fcc19414ade1a621f08236e84f38df4415a8234919fa97fa2e35624e86b6 + languageName: node + linkType: hard + "iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -21709,6 +26432,13 @@ __metadata: languageName: node linkType: hard +"idb-keyval@npm:^6.2.1": + version: 6.2.1 + resolution: "idb-keyval@npm:6.2.1" + checksum: 10/9a1416ff5e2ceff3832f5645518f438833a5ff6ee316fe3ec111d580db120425991d64d8098a847be7541bbbb7cc941984b4d0d62d541c39f7a0f415594837c2 + languageName: node + linkType: hard + "idna-uts46-hx@npm:^2.3.1": version: 2.3.1 resolution: "idna-uts46-hx@npm:2.3.1" @@ -21760,6 +26490,13 @@ __metadata: languageName: node linkType: hard +"immer@npm:^10.1.1": + version: 10.1.1 + resolution: "immer@npm:10.1.1" + checksum: 10/9dacf1e8c201d69191ccd88dc5d733bafe166cd45a5a360c5d7c88f1de0dff974a94114d72b35f3106adfe587fcfb131c545856184a2247d89d735ad25589863 + languageName: node + linkType: hard + "immutable@npm:^4.0.0-rc.12": version: 4.1.0 resolution: "immutable@npm:4.1.0" @@ -21852,7 +26589,7 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.4": +"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" dependencies: @@ -21881,7 +26618,19 @@ __metadata: languageName: node linkType: hard -"invariant@npm:2, invariant@npm:^2.2.4": +"intl-messageformat@npm:^10.1.0": + version: 10.7.6 + resolution: "intl-messageformat@npm:10.7.6" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.3" + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/icu-messageformat-parser": "npm:2.9.3" + tslib: "npm:2" + checksum: 10/53f40e386fcc2eaf1ec7d974b18c91e436bc2dc8188587aa652b307160220847b06275d28ca9757ffd9e8471bb6993bf503a71363ce5f9c155d8dc33b43ab97a + languageName: node + linkType: hard + +"invariant@npm:2, invariant@npm:2.2.4, invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" dependencies: @@ -21913,6 +26662,13 @@ __metadata: languageName: node linkType: hard +"iron-webcrypto@npm:^1.2.1": + version: 1.2.1 + resolution: "iron-webcrypto@npm:1.2.1" + checksum: 10/c1f52ccfe2780efa5438c134538ee4b26c96a87d22f351d896781219efbce25b4fe716d1cb7f248e02da96881760541135acbcc7c0622ffedf71cb0e227bebf9 + languageName: node + linkType: hard + "is-absolute-url@npm:^3.0.0": version: 3.0.3 resolution: "is-absolute-url@npm:3.0.3" @@ -21941,6 +26697,16 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + checksum: 10/34a26213d981d58b30724ef37a1e0682f4040d580fa9ff58fdfdd3cefcb2287921718c63971c1c404951e7b747c50fdc7caf6e867e951353fa71b369c04c969b + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -21948,6 +26714,15 @@ __metadata: languageName: node linkType: hard +"is-async-function@npm:^2.0.0": + version: 2.0.0 + resolution: "is-async-function@npm:2.0.0" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10/2cf336fbf8cba3badcf526aa3d10384c30bab32615ac4831b74492eb4e843ccb7d8439a119c27f84bcf217d72024e611b1373f870f433b48f3fa57d3d1b863f1 + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -22037,6 +26812,15 @@ __metadata: languageName: node linkType: hard +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: "npm:^1.1.13" + checksum: 10/4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 + languageName: node + linkType: hard + "is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" @@ -22062,6 +26846,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: 10/b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -22069,6 +26862,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.0.2": + version: 1.0.2 + resolution: "is-finalizationregistry@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 10/1b8e9e1bf2075e862315ef9d38ce6d39c43ca9d81d46f73b34473506992f4b0fbaadb47ec9b420a5e76afe3f564d9f1f0d9b552ef272cc2395e0f21d743c9c29 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^1.0.0": version: 1.0.0 resolution: "is-fullwidth-code-point@npm:1.0.0" @@ -22113,7 +26915,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -22145,6 +26947,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: 10/c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -22183,6 +26996,13 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10/8fe5cffd8d4fb2ec7b49d657e1691889778d037494c6f40f4d1a524cadd658b4b53ad7b6b73a59bcb4b143ae9a3d15829af864b2c0f9d65ac1e678c4c80f17e5 + languageName: node + linkType: hard + "is-number-object@npm:^1.0.4": version: 1.0.7 resolution: "is-number-object@npm:1.0.7" @@ -22283,6 +27103,15 @@ __metadata: languageName: node linkType: hard +"is-shared-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "is-shared-array-buffer@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + checksum: 10/bc5402900dc62b96ebb2548bf5b0a0bcfacc2db122236fe3ab3b3e3c884293a0d5eb777e73f059bcbf8dc8563bb65eae972fee0fb97e38a9ae27c8678f62bcfe + languageName: node + linkType: hard + "is-stream@npm:^1.0.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -22340,6 +27169,15 @@ __metadata: languageName: node linkType: hard +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: "npm:^1.1.14" + checksum: 10/f850ba08286358b9a11aee6d93d371a45e3c59b5953549ee1c1a9a55ba5c1dd1bd9952488ae194ad8f32a9cf5e79c8fa5f0cc4d78c00720aa0bbcf238b38062d + languageName: node + linkType: hard + "is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": version: 1.1.9 resolution: "is-typed-array@npm:1.1.9" @@ -22416,6 +27254,24 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: "npm:^1.0.0" + checksum: 10/f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + languageName: node + linkType: hard + +"is64bit@npm:^2.0.0": + version: 2.0.0 + resolution: "is64bit@npm:2.0.0" + dependencies: + system-architecture: "npm:^0.1.0" + checksum: 10/94dafd5f29bfb96c542e89ef8c33e811159ca7d07a2890ab83026fa87706612af4101308d9392e9ee68e046e8604a6b59a8f41091f8556f6235efbcfd9c5574c + languageName: node + linkType: hard + "isarray@npm:0.0.1": version: 0.0.1 resolution: "isarray@npm:0.0.1" @@ -22561,6 +27417,19 @@ __metadata: languageName: node linkType: hard +"iterator.prototype@npm:^1.1.3": + version: 1.1.3 + resolution: "iterator.prototype@npm:1.1.3" + dependencies: + define-properties: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + reflect.getprototypeof: "npm:^1.0.4" + set-function-name: "npm:^2.0.1" + checksum: 10/1a2a508d3baac121b76c834404ff552d1bb96a173b1d74ff947b2c5763840c0b1e5be01be7e2183a19b08e99e38729812668ff1f23b35f6655a366017bc32519 + languageName: node + linkType: hard + "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -23075,6 +27944,22 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.1.2": + version: 2.4.0 + resolution: "jiti@npm:2.4.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10/10aa999a4f9bccc82b1dab9ebaf4484a8770450883c1bf7fafc07f8fca1e417fd8e7731e651337d1060c9e2ff3f97362dcdfd27e86d1f385db97f4adf7b5a21d + languageName: node + linkType: hard + +"js-base64@npm:^3.7.5": + version: 3.7.7 + resolution: "js-base64@npm:3.7.7" + checksum: 10/185e34c536a6b1c4e1ad8bd96d25b49a9ea4e6803e259eaaaca95f1b392a0d590b2933c5ca8580c776f7279507944b81ff1faf889d84baa5e31f026e96d676a5 + languageName: node + linkType: hard + "js-cookie@npm:^2.2.1": version: 2.2.1 resolution: "js-cookie@npm:2.2.1" @@ -23203,6 +28088,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 + languageName: node + linkType: hard + "jsesc@npm:~0.5.0": version: 0.5.0 resolution: "jsesc@npm:0.5.0" @@ -23235,6 +28129,23 @@ __metadata: languageName: node linkType: hard +"json-rpc-engine@npm:^6.1.0": + version: 6.1.0 + resolution: "json-rpc-engine@npm:6.1.0" + dependencies: + "@metamask/safe-event-emitter": "npm:^2.0.0" + eth-rpc-errors: "npm:^4.0.2" + checksum: 10/00d5b5228e90f126dd52176598db6e5611d295d3a3f7be21254c30c1b6555811260ef2ec2df035cd8e583e4b12096259da721e29f4ea2affb615f7dfc960a6a6 + languageName: node + linkType: hard + +"json-rpc-random-id@npm:^1.0.0, json-rpc-random-id@npm:^1.0.1": + version: 1.0.1 + resolution: "json-rpc-random-id@npm:1.0.1" + checksum: 10/fcd2e884193a129ace4002bd65a86e9cdb206733b4693baea77bd8b372cf8de3043fbea27716a2c9a716581a908ca8d978d9dfec4847eb2cf77edb4cf4b2252c + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -23361,6 +28272,18 @@ __metadata: languageName: node linkType: hard +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: 10/b61d44613687dfe4cc8ad4b4fbf3711bf26c60b8d5ed1f494d723e0808415c59b24a7c0ed8ab10736a40ff84eef38cbbfb68b395e05d31117b44ffc59d31edfc + languageName: node + linkType: hard + "just-extend@npm:^4.0.2": version: 4.2.1 resolution: "just-extend@npm:4.2.1" @@ -23412,6 +28335,18 @@ __metadata: languageName: node linkType: hard +"keccak@npm:^3.0.3": + version: 3.0.4 + resolution: "keccak@npm:3.0.4" + dependencies: + node-addon-api: "npm:^2.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.0" + readable-stream: "npm:^3.6.0" + checksum: 10/45478bb0a57e44d0108646499b8360914b0fbc8b0e088f1076659cb34faaa9eb829c40f6dd9dadb3460bb86cc33153c41fed37fe5ce09465a60e71e78c23fa55 + languageName: node + linkType: hard + "keyv@npm:^4.0.0": version: 4.5.2 resolution: "keyv@npm:4.5.2" @@ -23430,6 +28365,13 @@ __metadata: languageName: node linkType: hard +"keyvaluestorage-interface@npm:^1.0.0": + version: 1.0.0 + resolution: "keyvaluestorage-interface@npm:1.0.0" + checksum: 10/e652448bc915f9c21b9916678ed58f5314c831f0a284d190a340c0370296c71918e0cdc1156a17b12d1993941b302f0881e23fb9c395079e2065a7d2f33d0199 + languageName: node + linkType: hard + "kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -23740,6 +28682,35 @@ __metadata: languageName: node linkType: hard +"listhen@npm:^1.9.0": + version: 1.9.0 + resolution: "listhen@npm:1.9.0" + dependencies: + "@parcel/watcher": "npm:^2.4.1" + "@parcel/watcher-wasm": "npm:^2.4.1" + citty: "npm:^0.1.6" + clipboardy: "npm:^4.0.0" + consola: "npm:^3.2.3" + crossws: "npm:>=0.2.0 <0.4.0" + defu: "npm:^6.1.4" + get-port-please: "npm:^3.1.2" + h3: "npm:^1.12.0" + http-shutdown: "npm:^1.2.2" + jiti: "npm:^2.1.2" + mlly: "npm:^1.7.1" + node-forge: "npm:^1.3.1" + pathe: "npm:^1.1.2" + std-env: "npm:^3.7.0" + ufo: "npm:^1.5.4" + untun: "npm:^0.1.3" + uqr: "npm:^0.1.2" + bin: + listen: bin/listhen.mjs + listhen: bin/listhen.mjs + checksum: 10/72b869c8604301352c5d5825a7737705f0df2ce1795af8e779b6f956ba71302e13b12b2d35142687fb4e1e8ccc2747e2be3c9cbf20f7f96b73f897881aa3c384 + languageName: node + linkType: hard + "listr2@npm:^4.0.5": version: 4.0.5 resolution: "listr2@npm:4.0.5" @@ -23761,6 +28732,37 @@ __metadata: languageName: node linkType: hard +"lit-element@npm:^3.3.0": + version: 3.3.3 + resolution: "lit-element@npm:3.3.3" + dependencies: + "@lit-labs/ssr-dom-shim": "npm:^1.1.0" + "@lit/reactive-element": "npm:^1.3.0" + lit-html: "npm:^2.8.0" + checksum: 10/7968e7f3ce3994911f27c4c54acc956488c91d8af81677cce3d6f0c2eaea45cceb79b064077159392238d6e43d46015a950269db9914fea8913566aacb17eaa1 + languageName: node + linkType: hard + +"lit-html@npm:^2.8.0": + version: 2.8.0 + resolution: "lit-html@npm:2.8.0" + dependencies: + "@types/trusted-types": "npm:^2.0.2" + checksum: 10/3503e55e2927c2ff94773cf041fc4128f92291869c9192f36eacb7f95132d11f6b329e5b910ab60a4456349cd2e6d23b33d83291b24d557bcd6b904d6314ac1a + languageName: node + linkType: hard + +"lit@npm:2.8.0": + version: 2.8.0 + resolution: "lit@npm:2.8.0" + dependencies: + "@lit/reactive-element": "npm:^1.6.0" + lit-element: "npm:^3.3.0" + lit-html: "npm:^2.8.0" + checksum: 10/aa64c1136b855ba328d41157dba67657d480345aeec3c1dd829abeb67719d759c9ff2ade9903f9cfb4f9d012b16087034aaa5b33f1182e70c615765562e3251b + languageName: node + linkType: hard + "load-yaml-file@npm:^0.2.0": version: 0.2.0 resolution: "load-yaml-file@npm:0.2.0" @@ -23860,6 +28862,13 @@ __metadata: languageName: node linkType: hard +"lodash.isequal@npm:4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: 10/82fc58a83a1555f8df34ca9a2cd300995ff94018ac12cc47c349655f0ae1d4d92ba346db4c19bbfc90510764e0c00ddcc985a358bdcd4b3b965abf8f2a48a214 + languageName: node + linkType: hard + "lodash.memoize@npm:4.x": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -23874,6 +28883,13 @@ __metadata: languageName: node linkType: hard +"lodash.mergewith@npm:4.6.2": + version: 4.6.2 + resolution: "lodash.mergewith@npm:4.6.2" + checksum: 10/aea75a4492541a4902ac7e551dc6c54b722da0c187f84385d02e8fc33a7ae3454b837822446e5f63fcd5ad1671534ea408740b776670ea4d9c7890b10105fce0 + languageName: node + linkType: hard + "lodash.startcase@npm:^4.4.0": version: 4.4.0 resolution: "lodash.startcase@npm:4.4.0" @@ -23990,7 +29006,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.2.0": +"lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a @@ -24228,6 +29244,15 @@ __metadata: languageName: node linkType: hard +"media-query-parser@npm:^2.0.2": + version: 2.0.2 + resolution: "media-query-parser@npm:2.0.2" + dependencies: + "@babel/runtime": "npm:^7.12.5" + checksum: 10/9dff3ed135149944717a8687567f4fda1d39d28637f265c6ce7efe5ed55cd88ed49136c912ee0c7f3a6e5debc50b1ff969db609d862318f1af97f48752b08b0b + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -24302,6 +29327,15 @@ __metadata: languageName: node linkType: hard +"merge-options@npm:^3.0.4": + version: 3.0.4 + resolution: "merge-options@npm:3.0.4" + dependencies: + is-plain-obj: "npm:^2.1.0" + checksum: 10/d86ddb3dd6e85d558dbf25dc944f3527b6bacb944db3fdda6e84a3f59c4e4b85231095f58b835758b9a57708342dee0f8de0dffa352974a48221487fe9f4584f + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -24350,6 +29384,13 @@ __metadata: languageName: node linkType: hard +"micro-ftch@npm:^0.3.1": + version: 0.3.1 + resolution: "micro-ftch@npm:0.3.1" + checksum: 10/a7ab07d25e28ec4ae492ce4542ea9b06eee85538742b3b1263b247366ee8872f2c5ce9c8651138b2f1d22c8212f691a7b8b5384fe86ead5aff1852e211f1c035 + languageName: node + linkType: hard + "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -24707,6 +29748,18 @@ __metadata: languageName: node linkType: hard +"mipd@npm:0.0.7": + version: 0.0.7 + resolution: "mipd@npm:0.0.7" + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/c14dffef0ef7a3e71469aee553f5735f4a6a9f9a2b47ca02798040f2e006261c2e7e8b26ee0dc56a815c04d5612eb4be1eed474e7bb4e496eb0f5ada2fe1d2e7 + languageName: node + linkType: hard + "mixme@npm:^0.5.1": version: 0.5.10 resolution: "mixme@npm:0.5.10" @@ -24782,6 +29835,13 @@ __metadata: languageName: node linkType: hard +"mobx@npm:^6.1.7": + version: 6.13.5 + resolution: "mobx@npm:6.13.5" + checksum: 10/1b0842ae4f3d7319a532ee5fcb29d4ccde714248af9111e7c375bed4adbe49c4535c6383fd14933c4e7ec022c0b730deb55e32344dcfad025c711435b3e21c42 + languageName: node + linkType: hard + "mocha@npm:7.1.2": version: 7.1.2 resolution: "mocha@npm:7.1.2" @@ -24891,6 +29951,13 @@ __metadata: languageName: node linkType: hard +"modern-ahocorasick@npm:^1.0.0": + version: 1.0.1 + resolution: "modern-ahocorasick@npm:1.0.1" + checksum: 10/ec83479f406511f37a966d66ce1c2b1701bb4a2cc2aabbbc257001178c9fbc48ce748c88eb10dfe72ba8b7f991a0bc7f1fa14683f444685edd1a9eeb32ecbc1e + languageName: node + linkType: hard + "module-error@npm:^1.0.1, module-error@npm:^1.0.2": version: 1.0.2 resolution: "module-error@npm:1.0.2" @@ -24898,6 +29965,20 @@ __metadata: languageName: node linkType: hard +"motion@npm:10.16.2": + version: 10.16.2 + resolution: "motion@npm:10.16.2" + dependencies: + "@motionone/animation": "npm:^10.15.1" + "@motionone/dom": "npm:^10.16.2" + "@motionone/svelte": "npm:^10.16.2" + "@motionone/types": "npm:^10.15.1" + "@motionone/utils": "npm:^10.15.1" + "@motionone/vue": "npm:^10.16.2" + checksum: 10/2470f12b97371eb876337b355ad158c545622b2cc7c83b0ba540d2c02afedb49990e78898e520b8f74cccc9ecf11d366ae005a35c60e92178fadd7434860a966 + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -24919,7 +30000,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -24965,6 +30046,13 @@ __metadata: languageName: node linkType: hard +"multiformats@npm:^9.4.2": + version: 9.9.0 + resolution: "multiformats@npm:9.9.0" + checksum: 10/ad55c7d480d22f4258a68fd88aa2aab744fe0cb1e68d732fc886f67d858b37e3aa6c2cec12b2960ead7730d43be690931485238569952d8a3d7f90fdc726c652 + languageName: node + linkType: hard + "multihashes@npm:^0.4.15, multihashes@npm:~0.4.15": version: 0.4.21 resolution: "multihashes@npm:0.4.21" @@ -25014,6 +30102,15 @@ __metadata: languageName: node linkType: hard +"nan@npm:^2.13.2": + version: 2.22.0 + resolution: "nan@npm:2.22.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10/ab165ba910e549fcc21fd561a33f534d86e81ae36c97b1019dcfe506b09692ff867c97794a54b49c9a83b8b485f529f0f58d24966c3a11863c97dc70814f4d50 + languageName: node + linkType: hard + "nan@npm:^2.14.0": version: 2.16.0 resolution: "nan@npm:2.16.0" @@ -25062,6 +30159,13 @@ __metadata: languageName: node linkType: hard +"napi-wasm@npm:^1.1.0": + version: 1.1.3 + resolution: "napi-wasm@npm:1.1.3" + checksum: 10/5cad19c3ba4c8b176453149542ea72f156be5db6d249611a76537833381f5cec802ed4d7ae5c3f7c0ef69d439c037f7247bbae7db711ed84f915be2a9fc43bb4 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -25110,6 +30214,17 @@ __metadata: languageName: node linkType: hard +"nock@npm:13.5.4": + version: 13.5.4 + resolution: "nock@npm:13.5.4" + dependencies: + debug: "npm:^4.1.0" + json-stringify-safe: "npm:^5.0.1" + propagate: "npm:^2.0.0" + checksum: 10/75bad391bae4efb81b742734af5f2d87309cd93d3ca6b78372fd37946d78ccb254d79104676619866915e6734abfc1b00fee2aa42073a4843ca3c746aad35a4d + languageName: node + linkType: hard + "node-abi@npm:^2.18.0, node-abi@npm:^2.21.0, node-abi@npm:^2.7.0": version: 2.30.1 resolution: "node-abi@npm:2.30.1" @@ -25146,6 +30261,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10/ee1e1ed6284a2f8cd1d59ac6175ecbabf8978dcf570345e9a8095a9d0a2b9ced591074ae77f9009287b00c402352b38aa9322a34f2199cdc9f567b842a636b94 + languageName: node + linkType: hard + "node-dir@npm:^0.1.17": version: 0.1.17 resolution: "node-dir@npm:0.1.17" @@ -25174,7 +30298,7 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.6.3": +"node-fetch-native@npm:^1.6.3, node-fetch-native@npm:^1.6.4": version: 1.6.4 resolution: "node-fetch-native@npm:1.6.4" checksum: 10/39c4c6d0c2a4bed1444943e1647ad0d79eb6638cf159bc37dffeafd22cffcf6a998e006aa1f3dd1d9d2258db7d78dee96b44bee4ba0bbaf0440ed348794f2543 @@ -25209,6 +30333,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "node-fetch@npm:^2.6.11": version: 2.6.12 resolution: "node-fetch@npm:2.6.12" @@ -25224,6 +30349,9 @@ __metadata: linkType: hard "node-forge@npm:^1": +======= +"node-forge@npm:^1, node-forge@npm:^1.3.1": +>>>>>>> origin/main version: 1.3.1 resolution: "node-forge@npm:1.3.1" checksum: 10/05bab6868633bf9ad4c3b1dd50ec501c22ffd69f556cdf169a00998ca1d03e8107a6032ba013852f202035372021b845603aeccd7dfcb58cdb7430013b3daa8d @@ -25513,6 +30641,17 @@ __metadata: languageName: node linkType: hard +"obj-multiplex@npm:^1.0.0": + version: 1.0.0 + resolution: "obj-multiplex@npm:1.0.0" + dependencies: + end-of-stream: "npm:^1.4.0" + once: "npm:^1.4.0" + readable-stream: "npm:^2.3.3" + checksum: 10/6bdcb7d48a1cd4458a7ff0be0b3c1dc58e8e9e6504f937c10b1eac096a3d459b85d7ba32bdd9a45382bb238e245eb42ebcd91430c72f04b0a57c97f846f2d06f + languageName: node + linkType: hard + "object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -25594,6 +30733,41 @@ __metadata: languageName: node linkType: hard +"object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: 10/dbb22da4cda82e1658349ea62b80815f587b47131b3dd7a4ab7f84190ab31d206bbd8fe7e26ae3220c55b65725ac4529825f6142154211220302aa6b1518045d + languageName: node + linkType: hard + +"object.entries@npm:^1.1.8": + version: 1.1.8 + resolution: "object.entries@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/2301918fbd1ee697cf6ff7cd94f060c738c0a7d92b22fd24c7c250e9b593642c9707ad2c44d339303c1439c5967d8964251cdfc855f7f6ec55db2dd79e8dc2a7 + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10/5b2e80f7af1778b885e3d06aeb335dcc86965e39464671adb7167ab06ac3b0f5dd2e637a90d8ebd7426d69c6f135a4753ba3dd7d0fe2a7030cf718dcb910fd92 + languageName: node + linkType: hard + "object.getownpropertydescriptors@npm:^2.0.3": version: 2.1.4 resolution: "object.getownpropertydescriptors@npm:2.1.4" @@ -25606,6 +30780,17 @@ __metadata: languageName: node linkType: hard +"object.values@npm:^1.1.6, object.values@npm:^1.2.0": + version: 1.2.0 + resolution: "object.values@npm:1.2.0" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/db2e498019c354428c5dd30d02980d920ac365b155fce4dcf63eb9433f98ccf0f72624309e182ce7cc227c95e45d474e1d483418e60de2293dd23fa3ebe34903 + languageName: node + linkType: hard + "obliterator@npm:^2.0.0": version: 2.0.4 resolution: "obliterator@npm:2.0.4" @@ -25622,6 +30807,17 @@ __metadata: languageName: node linkType: hard +"ofetch@npm:^1.4.1": + version: 1.4.1 + resolution: "ofetch@npm:1.4.1" + dependencies: + destr: "npm:^2.0.3" + node-fetch-native: "npm:^1.6.4" + ufo: "npm:^1.5.4" + checksum: 10/329ecd5595eff6da090c728e66f4223ad7ba5c2c309446f3707245c1b213da47dfd1eb1740f26b3da9e31ed7b7a903733bdaae85187b714514da865a0c5a4a9c + languageName: node + linkType: hard + "ohash@npm:^1.1.3": version: 1.1.3 resolution: "ohash@npm:1.1.3" @@ -25629,6 +30825,20 @@ __metadata: languageName: node linkType: hard +"ohash@npm:^1.1.4": + version: 1.1.4 + resolution: "ohash@npm:1.1.4" + checksum: 10/b11445234e59c9c2b00f357f8f00b6ba00e14c84fc0a232cdc14eb1d80066479b09d27af0201631e84b7a15ba7c4a1939f4cc47f2030e9bf83c9e8afc3ff7dfd + languageName: node + linkType: hard + +"on-exit-leak-free@npm:^0.2.0": + version: 0.2.0 + resolution: "on-exit-leak-free@npm:0.2.0" + checksum: 10/36a3a1baea964dc01088884e9d87824cc1a3304ae702e7c688bdb5deec61fbb79325977dd6cba5988f60ad40fedc6ef31ec705adf65b4b042bc0d2686186c0dd + languageName: node + linkType: hard + "on-exit-leak-free@npm:^2.1.0": version: 2.1.2 resolution: "on-exit-leak-free@npm:2.1.2" @@ -25759,6 +30969,26 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.1.2": + version: 0.1.2 + resolution: "ox@npm:0.1.2" + dependencies: + "@adraffy/ens-normalize": "npm:^1.10.1" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + "@scure/bip32": "npm:^1.5.0" + "@scure/bip39": "npm:^1.4.0" + abitype: "npm:^1.0.6" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/cba00f13289599ff03cee3dbc19167c1d0f01829379d119f962b4e951ee2bf0d14491c7a45974e6a2a745117b13b22e9e4131d285e1f5247ea4e1cbc43c5c3d8 + languageName: node + linkType: hard + "p-cancelable@npm:^0.3.0": version: 0.3.0 resolution: "p-cancelable@npm:0.3.0" @@ -26196,6 +31426,13 @@ __metadata: languageName: node linkType: hard +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10/668c1dc8d9fc1b34b9ce3b16ba59deb39d4dc743527bf2ed908d2b914cb8ba40aa5ba6960b27c417c241531c5aafd0598feeac2d50cb15278cf9863fa6b02a77 + languageName: node + linkType: hard + "pify@npm:^4.0.1": version: 4.0.1 resolution: "pify@npm:4.0.1" @@ -26203,6 +31440,23 @@ __metadata: languageName: node linkType: hard +"pify@npm:^5.0.0": + version: 5.0.0 + resolution: "pify@npm:5.0.0" + checksum: 10/443e3e198ad6bfa8c0c533764cf75c9d5bc976387a163792fb553ffe6ce923887cf14eebf5aea9b7caa8eab930da8c33612990ae85bd8c2bc18bedb9eae94ecb + languageName: node + linkType: hard + +"pino-abstract-transport@npm:v0.5.0": + version: 0.5.0 + resolution: "pino-abstract-transport@npm:0.5.0" + dependencies: + duplexify: "npm:^4.1.2" + split2: "npm:^4.0.0" + checksum: 10/d304a104e5cb0c3fef62ea544a4a39bf2472a602cdd7ddb136b0671b9c324ad93fa7888825c4cf33e624802436e897081ba92440f40518b9f2dbdbc0c889e409 + languageName: node + linkType: hard + "pino-abstract-transport@npm:v1.1.0": version: 1.1.0 resolution: "pino-abstract-transport@npm:1.1.0" @@ -26213,6 +31467,13 @@ __metadata: languageName: node linkType: hard +"pino-std-serializers@npm:^4.0.0": + version: 4.0.0 + resolution: "pino-std-serializers@npm:4.0.0" + checksum: 10/cec586f9634ef0e6582f62bc8fc5ca5b6e5e11ab88fe3950c66fb0fd5d6690f66bc39cd3f27216b925d2963ad5c3bba415718819ac20ebe0390c7d056cbfea1b + languageName: node + linkType: hard + "pino-std-serializers@npm:^6.0.0": version: 6.2.2 resolution: "pino-std-serializers@npm:6.2.2" @@ -26220,6 +31481,27 @@ __metadata: languageName: node linkType: hard +"pino@npm:7.11.0": + version: 7.11.0 + resolution: "pino@npm:7.11.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + fast-redact: "npm:^3.0.0" + on-exit-leak-free: "npm:^0.2.0" + pino-abstract-transport: "npm:v0.5.0" + pino-std-serializers: "npm:^4.0.0" + process-warning: "npm:^1.0.0" + quick-format-unescaped: "npm:^4.0.3" + real-require: "npm:^0.1.0" + safe-stable-stringify: "npm:^2.1.0" + sonic-boom: "npm:^2.2.1" + thread-stream: "npm:^0.15.1" + bin: + pino: bin.js + checksum: 10/1c7b4b52fea76e0bc5d8b1190a0fee24279cb16d76fdb5833b32b64256fd8a94d641574b850faba5be72514f04045206b6d902a9a3f5ceae2a4296687088e073 + languageName: node + linkType: hard + "pino@npm:^8.19.0": version: 8.19.0 resolution: "pino@npm:8.19.0" @@ -26304,6 +31586,13 @@ __metadata: languageName: node linkType: hard +"pngjs@npm:^5.0.0": + version: 5.0.0 + resolution: "pngjs@npm:5.0.0" + checksum: 10/345781644740779752505af2fea3e9043f6c7cc349b18e1fb8842796360d1624791f0c24d33c0f27b05658373f90ffaa177a849e932e5fea1f540cef3975f3c9 + languageName: node + linkType: hard + "polished@npm:^4.2.2": version: 4.3.1 resolution: "polished@npm:4.3.1" @@ -26313,6 +31602,20 @@ __metadata: languageName: node linkType: hard +"pony-cause@npm:^2.1.10": + version: 2.1.11 + resolution: "pony-cause@npm:2.1.11" + checksum: 10/ed7d0bb6e3e69f753080bf736b71f40e6ae4c13ec0c8c473ff73345345c088819966fdd68a62ad7482d464bf41176cf9421f5f63715d1a4532005eedc099db55 + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0": + version: 1.0.0 + resolution: "possible-typed-array-names@npm:1.0.0" + checksum: 10/8ed3e96dfeea1c5880c1f4c9cb707e5fb26e8be22f14f82ef92df20fd2004e635c62ba47fbe8f2bb63bfd80dac1474be2fb39798da8c2feba2815435d1f749af + languageName: node + linkType: hard + "postcss-import@npm:^15.1.0": version: 15.1.0 resolution: "postcss-import@npm:15.1.0" @@ -26405,6 +31708,13 @@ __metadata: languageName: node linkType: hard +"preact@npm:^10.16.0, preact@npm:^10.24.2": + version: 10.24.3 + resolution: "preact@npm:10.24.3" + checksum: 10/e9c4c901a4ddd475a1072355b5c6c944b05797445e0d68f317ad0dbc976b831523573693ea75d2e12e7902042e3729af435377816d25558bf693ecf6b516c707 + languageName: node + linkType: hard + "prebuild-install@npm:^5.3.4": version: 5.3.6 resolution: "prebuild-install@npm:5.3.6" @@ -26569,6 +31879,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^1.0.0": + version: 1.0.0 + resolution: "process-warning@npm:1.0.0" + checksum: 10/8736d11d8d71c349d176e210305e84d74b13af06efb3c779377b056bfd608257d1e4e32b8fbbf90637c900f0313e40f7c9f583140884f667a21fc10a869b840c + languageName: node + linkType: hard + "process-warning@npm:^3.0.0": version: 3.0.0 resolution: "process-warning@npm:3.0.0" @@ -26635,7 +31952,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.7.2": +"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -26646,6 +31963,13 @@ __metadata: languageName: node linkType: hard +"propagate@npm:^2.0.0": + version: 2.0.1 + resolution: "propagate@npm:2.0.1" + checksum: 10/8c761c16e8232f82f6d015d3e01e8bd4109f47ad804f904d950f6fe319813b448ca112246b6bfdc182b400424b155b0b7c4525a9bb009e6fa950200157569c14 + languageName: node + linkType: hard + "proper-lockfile@npm:^4.1.1": version: 4.1.2 resolution: "proper-lockfile@npm:4.1.2" @@ -26693,7 +32017,7 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:^6.8.8": +"protobufjs@npm:^6.11.2, protobufjs@npm:^6.8.8": version: 6.11.4 resolution: "protobufjs@npm:6.11.4" dependencies: @@ -26747,6 +32071,13 @@ __metadata: languageName: node linkType: hard +"proxy-compare@npm:2.5.1": + version: 2.5.1 + resolution: "proxy-compare@npm:2.5.1" + checksum: 10/64b6277d08d89f0b2c468a84decf43f82a4e88da7075651e6adebc69d1b87fadc17cfeb43c024c00b65faa3f0908f7ac1e61f5f6849a404a547a742e6aa527a6 + languageName: node + linkType: hard + "proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -26875,6 +32206,58 @@ __metadata: languageName: node linkType: hard +"qr-code-styling@npm:^1.6.0-rc.1": + version: 1.8.4 + resolution: "qr-code-styling@npm:1.8.4" + dependencies: + qrcode-generator: "npm:^1.4.4" + checksum: 10/ddc193ac15c16bed24a7a27eb15e14ba59efa48bad390a116802f57cb537905238a23fe4a06488951c4f107f0c7271950ebd58ce7f30cfd9ee07c4fea32bebff + languageName: node + linkType: hard + +"qrcode-generator@npm:^1.4.4": + version: 1.4.4 + resolution: "qrcode-generator@npm:1.4.4" + checksum: 10/65b2bba237d1f230eba0d08ae4267d04f326859c2265775ade99191be1b522158b623fcc0b613bbfc9d4edbbafb928fc41c66d61053b333f2eb0bcedb2ebadca + languageName: node + linkType: hard + +"qrcode-terminal-nooctal@npm:^0.12.1": + version: 0.12.1 + resolution: "qrcode-terminal-nooctal@npm:0.12.1" + bin: + qrcode-terminal: bin/qrcode-terminal.js + checksum: 10/8f437f9e95d8211c3b4eb3de572abd8e9695efa51b327e68e843fcbc2f017e32d6407caf4d8a8dca64d2d1270cf1cc1b16ebb6f2a69a1f891df430e8efdef66a + languageName: node + linkType: hard + +"qrcode@npm:1.5.3": + version: 1.5.3 + resolution: "qrcode@npm:1.5.3" + dependencies: + dijkstrajs: "npm:^1.0.1" + encode-utf8: "npm:^1.0.3" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 10/823642d59a81ba5f406a1e78415fee37fd53856038f49a85c4ca7aa32ba6b8505ab059a832718ac16612bed75aa2a18584faae38cf3c25e2c90fb19b8c55fe46 + languageName: node + linkType: hard + +"qrcode@npm:1.5.4, qrcode@npm:^1.5.4": + version: 1.5.4 + resolution: "qrcode@npm:1.5.4" + dependencies: + dijkstrajs: "npm:^1.0.1" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 10/9a1b61760e4ea334545a0f54bbc11c537aba0a17cf52cab9fa1b07f8a1337eed0bc6f7fde41b197f2c82c249bc48728983bfaf861bb7ecb29dc597b2ae33c424 + languageName: node + linkType: hard + "qs@npm:6.10.3": version: 6.10.3 resolution: "qs@npm:6.10.3" @@ -26927,6 +32310,18 @@ __metadata: languageName: node linkType: hard +"query-string@npm:7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" + dependencies: + decode-uri-component: "npm:^0.2.2" + filter-obj: "npm:^1.1.0" + split-on-first: "npm:^1.0.0" + strict-uri-encode: "npm:^2.0.0" + checksum: 10/3b6f2c167e76ca4094c5f1a9eb276efcbb9ebfd8b1a28c413f3c4e4e7d6428c8187bf46c8cbc9f92a229369dd0015de10a7fd712c8cee98d5d84c2ac6140357e + languageName: node + linkType: hard + "query-string@npm:^5.0.1": version: 5.1.1 resolution: "query-string@npm:5.1.1" @@ -26973,6 +32368,23 @@ __metadata: languageName: node linkType: hard +"radix3@npm:^1.1.2": + version: 1.1.2 + resolution: "radix3@npm:1.1.2" + checksum: 10/5ed01a8e4b753e325c6ecb01d993de77f690e548ef9e149e7dc403ee7b109c2cb41e3d09bc3ce004d872c67c8dca1d556dbf7808b1ac7df9f86994e57d757557 + languageName: node + linkType: hard + +"rainbow-sprinkles@npm:^0.17.3": + version: 0.17.3 + resolution: "rainbow-sprinkles@npm:0.17.3" + peerDependencies: + "@vanilla-extract/css": ^1 + "@vanilla-extract/dynamic": ^2 + checksum: 10/63c668a58032a6914974e4e13c587338f70c1cd76d388ba133f920112c7f6e002b3ed6d98f6dc2c045f5522eafd78dc58aa6103b520150dcb8ca23b3b8744ce0 + languageName: node + linkType: hard + "ramda@npm:0.29.0": version: 0.29.0 resolution: "ramda@npm:0.29.0" @@ -27034,6 +32446,66 @@ __metadata: languageName: node linkType: hard +"react-aria@npm:^3.34.3": + version: 3.35.1 + resolution: "react-aria@npm:3.35.1" + dependencies: + "@internationalized/string": "npm:^3.2.4" + "@react-aria/breadcrumbs": "npm:^3.5.18" + "@react-aria/button": "npm:^3.10.1" + "@react-aria/calendar": "npm:^3.5.13" + "@react-aria/checkbox": "npm:^3.14.8" + "@react-aria/color": "npm:^3.0.1" + "@react-aria/combobox": "npm:^3.10.5" + "@react-aria/datepicker": "npm:^3.11.4" + "@react-aria/dialog": "npm:^3.5.19" + "@react-aria/dnd": "npm:^3.7.4" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/gridlist": "npm:^3.9.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/link": "npm:^3.7.6" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/meter": "npm:^3.4.17" + "@react-aria/numberfield": "npm:^3.11.8" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/progress": "npm:^3.4.17" + "@react-aria/radio": "npm:^3.10.9" + "@react-aria/searchfield": "npm:^3.7.10" + "@react-aria/select": "npm:^3.14.11" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/separator": "npm:^3.4.3" + "@react-aria/slider": "npm:^3.7.13" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/switch": "npm:^3.6.9" + "@react-aria/table": "npm:^3.15.5" + "@react-aria/tabs": "npm:^3.9.7" + "@react-aria/tag": "npm:^3.4.7" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/tooltip": "npm:^3.7.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/eb63ad498582374f1708c6691faf08ecaa887da02f95277e858b384bed7d4a2fbca0c24adf1d16c0929ca965163bbd5c73cea5251d4b834b221a65313760f89c + languageName: node + linkType: hard + +"react-clientside-effect@npm:^1.2.6": + version: 1.2.6 + resolution: "react-clientside-effect@npm:1.2.6" + dependencies: + "@babel/runtime": "npm:^7.12.13" + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: 10/45411b2e1d5e77ce8586ef0fa6cef2d394da4660af90a2c0f044a2170a0b601ac023ac2bc62d6109201969329a8dbd13bd1a4bd4027be3980e4fde7c6a48bee3 + languageName: node + linkType: hard + "react-colorful@npm:^5.1.2": version: 5.6.1 resolution: "react-colorful@npm:5.6.1" @@ -27108,6 +32580,33 @@ __metadata: languageName: node linkType: hard +"react-fast-compare@npm:3.2.2": + version: 3.2.2 + resolution: "react-fast-compare@npm:3.2.2" + checksum: 10/a6826180ba75cefba1c8d3ac539735f9b627ca05d3d307fe155487f5d0228d376dac6c9708d04a283a7b9f9aee599b637446635b79c8c8753d0b4eece56c125c + languageName: node + linkType: hard + +"react-focus-lock@npm:^2.9.6": + version: 2.13.2 + resolution: "react-focus-lock@npm:2.13.2" + dependencies: + "@babel/runtime": "npm:^7.0.0" + focus-lock: "npm:^1.3.5" + prop-types: "npm:^15.6.2" + react-clientside-effect: "npm:^1.2.6" + use-callback-ref: "npm:^1.3.2" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/a169e060e2a2457062489fb5e48811f334823b3878a4599162878c93c683f47807407044009c3886da07f2adaa9d7325cbb4fafc104a7f8cd4d1dad7325304f8 + languageName: node + linkType: hard + "react-is@npm:18.1.0": version: 18.1.0 resolution: "react-is@npm:18.1.0" @@ -27115,7 +32614,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.13.1": +"react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: 10/5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf @@ -27136,6 +32635,19 @@ __metadata: languageName: node linkType: hard +"react-native-webview@npm:^11.26.0": + version: 11.26.1 + resolution: "react-native-webview@npm:11.26.1" + dependencies: + escape-string-regexp: "npm:2.0.0" + invariant: "npm:2.2.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/d64123c73e7795096434135a1bec2aef5caf71a4c1c95b1416cc528bc55f5c4a89df2d311ad3637594f120e864b5798e2c4ea4eb7153bf938ad167c54e7a7e61 + languageName: node + linkType: hard + "react-refresh@npm:^0.14.0": version: 0.14.2 resolution: "react-refresh@npm:0.14.2" @@ -27143,7 +32655,7 @@ __metadata: languageName: node linkType: hard -"react-remove-scroll-bar@npm:^2.3.3": +"react-remove-scroll-bar@npm:^2.3.3, react-remove-scroll-bar@npm:^2.3.6": version: 2.3.6 resolution: "react-remove-scroll-bar@npm:2.3.6" dependencies: @@ -27178,6 +32690,59 @@ __metadata: languageName: node linkType: hard +"react-remove-scroll@npm:2.6.0, react-remove-scroll@npm:^2.5.7": + version: 2.6.0 + resolution: "react-remove-scroll@npm:2.6.0" + dependencies: + react-remove-scroll-bar: "npm:^2.3.6" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/9fac79e1c2ed2c85729bfe82f61ef4ae5ce51f478736a13892a9a11e05cbd4e9599f9f0e012cb5fc0719e18dc1dd687ab61f516193228615df636db8b851245e + languageName: node + linkType: hard + +"react-stately@npm:^3.32.2": + version: 3.33.0 + resolution: "react-stately@npm:3.33.0" + dependencies: + "@react-stately/calendar": "npm:^3.5.5" + "@react-stately/checkbox": "npm:^3.6.9" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/color": "npm:^3.8.0" + "@react-stately/combobox": "npm:^3.10.0" + "@react-stately/data": "npm:^3.11.7" + "@react-stately/datepicker": "npm:^3.10.3" + "@react-stately/dnd": "npm:^3.4.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/menu": "npm:^3.8.3" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/radio": "npm:^3.10.8" + "@react-stately/searchfield": "npm:^3.5.7" + "@react-stately/select": "npm:^3.6.8" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/slider": "npm:^3.5.8" + "@react-stately/table": "npm:^3.12.3" + "@react-stately/tabs": "npm:^3.6.10" + "@react-stately/toggle": "npm:^3.7.8" + "@react-stately/tooltip": "npm:^3.4.13" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/69da664db3427d19aa8802fa0b7ca5fd49dad2f63e670ae00cefc2398b773568e5a72a0b909e51b64ea2a67dfd4e376ced324b096f159496bc571c5e6a2c0ec9 + languageName: node + linkType: hard + "react-style-singleton@npm:^2.2.1": version: 2.2.1 resolution: "react-style-singleton@npm:2.2.1" @@ -27261,7 +32826,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.0, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.3.3, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -27291,7 +32856,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.1.0": +"readable-stream@npm:^3.1.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -27313,7 +32878,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^4.0.0": +"readable-stream@npm:^3.6.2 || ^4.4.2, readable-stream@npm:^4.0.0": version: 4.5.2 resolution: "readable-stream@npm:4.5.2" dependencies: @@ -27351,6 +32916,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.1.0": + version: 0.1.0 + resolution: "real-require@npm:0.1.0" + checksum: 10/0ba1c440dc9b7777d35a97f755312bf236be0847249f76cc9789c5c08d141f5d80b8564888e6a94ed0253fabf597b6892f8502c4e5658fb98f88642633a39723 + languageName: node + linkType: hard + "real-require@npm:^0.2.0": version: 0.2.0 resolution: "real-require@npm:0.2.0" @@ -27406,6 +32978,21 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.4": + version: 1.0.6 + resolution: "reflect.getprototypeof@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.1" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + globalthis: "npm:^1.0.3" + which-builtin-type: "npm:^1.1.3" + checksum: 10/518f6457e4bb470c9b317d239c62d4b4a05678b7eae4f1c3f4332fad379b3ea6d2d8999bfad448547fdba8fb77e4725cfe8c6440d0168ff387f16b4f19f759ad + languageName: node + linkType: hard + "regenerate-unicode-properties@npm:^10.1.0": version: 10.1.1 resolution: "regenerate-unicode-properties@npm:10.1.1" @@ -27467,6 +33054,18 @@ __metadata: languageName: node linkType: hard +"regexp.prototype.flags@npm:^1.5.2": + version: 1.5.3 + resolution: "regexp.prototype.flags@npm:1.5.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + set-function-name: "npm:^2.0.2" + checksum: 10/fe17bc4eebbc72945aaf9dd059eb7784a5ca453a67cc4b5b3e399ab08452c9a05befd92063e2c52e7b24d9238c60031656af32dd57c555d1ba6330dbf8c23b43 + languageName: node + linkType: hard + "regexpu-core@npm:^5.3.1": version: 5.3.2 resolution: "regexpu-core@npm:5.3.2" @@ -27712,7 +33311,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.8": +"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -27725,6 +33324,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/2d6fd28699f901744368e6f2032b4268b4c7b9185fd8beb64f68c93ac6b22e52ae13560ceefc96241a665b985edf9ffd393ae26d2946a7d3a07b7007b7d51e79 + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A1.1.x#optional!builtin": version: 1.1.7 resolution: "resolve@patch:resolve@npm%3A1.1.7#optional!builtin::version=1.1.7&hash=3bafbf" @@ -27754,7 +33366,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -27767,6 +33379,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/05fa778de9d0347c8b889eb7a18f1f06bf0f801b0eb4610b4871a4b2f22e220900cf0ad525e94f990bb8d8921c07754ab2122c0c225ab4cdcea98f36e64fa4c2 + languageName: node + linkType: hard + "responselike@npm:^2.0.0": version: 2.0.1 resolution: "responselike@npm:2.0.1" @@ -28149,6 +33774,18 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.7" + get-intrinsic: "npm:^1.2.4" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 10/a54f8040d7cb696a1ee38d19cc71ab3cfb654b9b81bae00c6459618cfad8214ece7e6666592f9c925aafef43d0a20c5e6fbb3413a2b618e1ce9d516a2e6dcfc5 + languageName: node + linkType: hard + "safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -28174,6 +33811,24 @@ __metadata: languageName: node linkType: hard +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.1.4" + checksum: 10/b04de61114b10274d92e25b6de7ccb5de07f11ea15637ff636de4b5190c0f5cd8823fe586dde718504cf78055437d70fd8804976894df502fcf5a210c970afb3 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.1.0": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10/2697fa186c17c38c3ca5309637b4ac6de2f1c3d282da27cd5e1e3c88eca0fb1f9aea568a6aabdf284111592c8782b94ee07176f17126031be72ab1313ed46c5c + languageName: node + linkType: hard + "safe-stable-stringify@npm:^2.3.1": version: 2.4.3 resolution: "safe-stable-stringify@npm:2.4.3" @@ -28329,7 +33984,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.5.1": +"semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.1": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -28457,6 +34112,18 @@ __metadata: languageName: node linkType: hard +"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/c7614154a53ebf8c0428a6c40a3b0b47dac30587c1a19703d1b75f003803f73cdfa6a93474a9ba678fa565ef5fbddc2fae79bca03b7d22ab5fd5163dbe571a74 + languageName: node + linkType: hard + "setimmediate@npm:1.0.4": version: 1.0.4 resolution: "setimmediate@npm:1.0.4" @@ -28478,7 +34145,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": version: 2.4.11 resolution: "sha.js@npm:2.4.11" dependencies: @@ -28733,6 +34400,28 @@ __metadata: languageName: node linkType: hard +"socket.io-client@npm:^4.5.1": + version: 4.8.1 + resolution: "socket.io-client@npm:4.8.1" + dependencies: + "@socket.io/component-emitter": "npm:~3.1.0" + debug: "npm:~4.3.2" + engine.io-client: "npm:~6.6.1" + socket.io-parser: "npm:~4.2.4" + checksum: 10/7480cf1ab30eba371a96dd1ce2ce9018dcbeaf81035a066fb89d99df0d0a6388b05840c92d970317c739956b68b28b0f4833f3b18e460a24eef557b9bca127c1 + languageName: node + linkType: hard + +"socket.io-parser@npm:~4.2.4": + version: 4.2.4 + resolution: "socket.io-parser@npm:4.2.4" + dependencies: + "@socket.io/component-emitter": "npm:~3.1.0" + debug: "npm:~4.3.1" + checksum: 10/4be500a9ff7e79c50ec25af11048a3ed34b4c003a9500d656786a1e5bceae68421a8394cf3eb0aa9041f85f36c1a9a737617f4aee91a42ab4ce16ffb2aa0c89c + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -29001,6 +34690,15 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^2.2.1": + version: 2.8.0 + resolution: "sonic-boom@npm:2.8.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + checksum: 10/05351d9f44bac59b2a4ab42ee22bf81b8c3bbd22db20183d78d5f2067557eb623e0eaf93b2bc0f8417bee92ca372bc26e0d83e3bdb0ffebcc33738ac1c191876 + languageName: node + linkType: hard + "sonic-boom@npm:^3.7.0": version: 3.8.0 resolution: "sonic-boom@npm:3.8.0" @@ -29037,7 +34735,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.5.0": +"source-map@npm:^0.5.0, source-map@npm:^0.5.7": version: 0.5.7 resolution: "source-map@npm:0.5.7" checksum: 10/9b4ac749ec5b5831cad1f8cc4c19c4298ebc7474b24a0acf293e2f040f03f8eeccb3d01f12aa0f90cf46d555c887e03912b83a042c627f419bda5152d89c5269 @@ -29118,6 +34816,13 @@ __metadata: languageName: node linkType: hard +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 10/16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 + languageName: node + linkType: hard + "split2@npm:^4.0.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -29211,6 +34916,13 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.7.0": + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10/034176196cfcaaab16dbdd96fc9e925a9544799fb6dc5a3e36fe43270f3a287c7f779d785b89edaf22cef2b5f1dcada2aae67430b8602e785ee74bdb3f671768 + languageName: node + linkType: hard + "stealthy-require@npm:^1.1.1": version: 1.1.1 resolution: "stealthy-require@npm:1.1.1" @@ -29292,6 +35004,13 @@ __metadata: languageName: node linkType: hard +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: 10/eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 + languageName: node + linkType: hard + "string-argv@npm:^0.3.1": version: 0.3.1 resolution: "string-argv@npm:0.3.1" @@ -29370,6 +35089,36 @@ __metadata: languageName: node linkType: hard +"string.prototype.matchall@npm:^4.0.11": + version: 4.0.11 + resolution: "string.prototype.matchall@npm:4.0.11" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.7" + regexp.prototype.flags: "npm:^1.5.2" + set-function-name: "npm:^2.0.2" + side-channel: "npm:^1.0.6" + checksum: 10/a902ff4500f909f2a08e55cc5ab1ffbbc905f603b36837674370ee3921058edd0392147e15891910db62a2f31ace2adaf065eaa3bc6e9810bdbc8ca48e05a7b5 + languageName: node + linkType: hard + +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" + dependencies: + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10/4b1bd91b75fa8fdf0541625184ebe80e445a465ce4253c19c3bccd633898005dadae0f74b85ae72662a53aafb8035bf48f8f5c0755aec09bc106a7f13959d05e + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.8": version: 1.2.8 resolution: "string.prototype.trim@npm:1.2.8" @@ -29381,6 +35130,18 @@ __metadata: languageName: node linkType: hard +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10/b2170903de6a2fb5a49bb8850052144e04b67329d49f1343cdc6a87cb24fb4e4b8ad00d3e273a399b8a3d8c32c89775d93a8f43cb42fbff303f25382079fb58a + languageName: node + linkType: hard + "string.prototype.trimend@npm:^1.0.5": version: 1.0.5 resolution: "string.prototype.trimend@npm:1.0.5" @@ -29403,6 +35164,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/c2e862ae724f95771da9ea17c27559d4eeced9208b9c20f69bbfcd1b9bc92375adf8af63a103194dba17c4cc4a5cb08842d929f415ff9d89c062d44689c8761b + languageName: node + linkType: hard + "string.prototype.trimstart@npm:^1.0.5": version: 1.0.5 resolution: "string.prototype.trimstart@npm:1.0.5" @@ -29425,6 +35197,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/160167dfbd68e6f7cb9f51a16074eebfce1571656fc31d40c3738ca9e30e35496f2c046fe57b6ad49f65f238a152be8c86fd9a2dd58682b5eba39dad995b3674 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -29580,6 +35363,13 @@ __metadata: languageName: node linkType: hard +"stylis@npm:4.2.0": + version: 4.2.0 + resolution: "stylis@npm:4.2.0" + checksum: 10/58359185275ef1f39c339ae94e598168aa6bb789f6cf0d52e726c1e7087a94e9c17f0385a28d34483dec1ffc2c75670ec714dc5603d99c3124ec83bc2b0a0f42 + languageName: node + linkType: hard + "sucrase@npm:^3.32.0": version: 3.35.0 resolution: "sucrase@npm:3.35.0" @@ -29605,6 +35395,23 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD +======= +"superstruct@npm:^1.0.3": + version: 1.0.4 + resolution: "superstruct@npm:1.0.4" + checksum: 10/9b3fd70a08c5ad3ea78b5c6b7ab90d31dde71af10448208d296c3d29ba2e55dfd817dfef75957163ee032163d04c4b2e0cb2fddff30313516aa60f748c1a48da + languageName: node + linkType: hard + +"superstruct@npm:^2.0.2": + version: 2.0.2 + resolution: "superstruct@npm:2.0.2" + checksum: 10/10e1944a9da4baee187fbaa6c5d97d7af266b55786dfe50bce67f0f1e7d93f1a5a42dd51e245a2e16404f8336d07c21c67f1c1fbc4ad0a252d3d2601d6c926da + languageName: node + linkType: hard + +>>>>>>> origin/main "supports-color@npm:6.0.0": version: 6.0.0 resolution: "supports-color@npm:6.0.0" @@ -29727,6 +35534,13 @@ __metadata: languageName: node linkType: hard +"system-architecture@npm:^0.1.0": + version: 0.1.0 + resolution: "system-architecture@npm:0.1.0" + checksum: 10/ca0dd793c45c354ab57dd7fc8ce7dc9923a6e07382bd3b22eb5b08f55ddb0217c390d00767549c5155fd4ce7ef23ffdd8cfb33dd4344cbbd37837d085a50f6f0 + languageName: node + linkType: hard + "tabbable@npm:^6.0.0": version: 6.2.0 resolution: "tabbable@npm:6.2.0" @@ -30012,6 +35826,15 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^0.15.1": + version: 0.15.2 + resolution: "thread-stream@npm:0.15.2" + dependencies: + real-require: "npm:^0.1.0" + checksum: 10/ca0a4f5bf45db88b48b41af0299455eaa8f01dd3ef8279e7ba6909c295b3ab79ddf576b595cbbceb4dbdf4012b17c6449805092926163fcbf30ac1604cb595b1 + languageName: node + linkType: hard + "thread-stream@npm:^2.0.0": version: 2.4.1 resolution: "thread-stream@npm:2.4.1" @@ -30052,6 +35875,20 @@ __metadata: languageName: node linkType: hard +"tiny-secp256k1@npm:^1.1.3": + version: 1.1.7 + resolution: "tiny-secp256k1@npm:1.1.7" + dependencies: + bindings: "npm:^1.3.0" + bn.js: "npm:^4.11.8" + create-hmac: "npm:^1.1.7" + elliptic: "npm:^6.4.0" + nan: "npm:^2.13.2" + node-gyp: "npm:latest" + checksum: 10/588393c36df18b2819787fc91616e1fcb930509307eecc460ad45c7011f99f900eea28493a36eb203c3933ae76f737e6a1b978fa0b8a391fcc5dd7b64d57c572 + languageName: node + linkType: hard + "tinybench@npm:^2.5.1": version: 2.9.0 resolution: "tinybench@npm:2.9.0" @@ -30112,6 +35949,13 @@ __metadata: languageName: node linkType: hard +"toggle-selection@npm:^1.0.6": + version: 1.0.6 + resolution: "toggle-selection@npm:1.0.6" + checksum: 10/9a0ed0ecbaac72b4944888dacd79fe0a55eeea76120a4c7e46b3bb3d85b24f086e90560bb22f5a965654a25ab43d79ec47dfdb3f1850ba740b14c5a50abc7040 + languageName: node + linkType: hard + "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -30304,27 +36148,34 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.11.1, tslib@npm:^1.13.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": +"tslib@npm:1.14.1, tslib@npm:^1.11.1, tslib@npm:^1.13.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c +"tslib@npm:2, tslib@npm:^2.0.3": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 languageName: node linkType: hard -"tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": +"tslib@npm:2.4.0, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.4.0 resolution: "tslib@npm:2.4.0" checksum: 10/d8379e68b36caf082c1905ec25d17df8261e1d68ddc1abfd6c91158a064f6e4402039ae7c02cf4c81d12e3a2a2c7cd8ea2f57b233eb80136a2e3e7279daf2911 languageName: node linkType: hard +"tslib@npm:^2.0.0, tslib@npm:^2.0.1": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c + languageName: node + linkType: hard + "tslib@npm:^2.2.0": version: 2.7.0 resolution: "tslib@npm:2.7.0" @@ -30617,6 +36468,17 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.13" + checksum: 10/02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b + languageName: node + linkType: hard + "typed-array-byte-length@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-byte-length@npm:1.0.0" @@ -30629,6 +36491,19 @@ __metadata: languageName: node linkType: hard +"typed-array-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "typed-array-byte-length@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + checksum: 10/e4a38329736fe6a73b52a09222d4a9e8de14caaa4ff6ad8e55217f6705b017d9815b7284c85065b3b8a7704e226ccff1372a72b78c2a5b6b71b7bf662308c903 + languageName: node + linkType: hard + "typed-array-byte-offset@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-byte-offset@npm:1.0.0" @@ -30642,6 +36517,20 @@ __metadata: languageName: node linkType: hard +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + checksum: 10/ac26d720ebb2aacbc45e231347c359e6649f52e0cfe0e76e62005912f8030d68e4cb7b725b1754e8fdd48e433cb68df5a8620a3e420ad1457d666e8b29bf9150 + languageName: node + linkType: hard + "typed-array-length@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" @@ -30653,6 +36542,20 @@ __metadata: languageName: node linkType: hard +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + checksum: 10/05e96cf4ff836743ebfc593d86133b8c30e83172cb5d16c56814d7bacfed57ce97e87ada9c4b2156d9aaa59f75cdef01c25bd9081c7826e0b869afbefc3e8c39 + languageName: node + linkType: hard + "typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" @@ -30669,6 +36572,13 @@ __metadata: languageName: node linkType: hard +"typeforce@npm:^1.11.5": + version: 1.18.0 + resolution: "typeforce@npm:1.18.0" + checksum: 10/dbf98c75b1d57e56e33c1e1271d5505e67981f4e6a2e2e6e8e31160b58777fea1726160810b6c606517db16476805b7dce315926ba2d4859b9a56cab05b7a41f + languageName: node + linkType: hard + "typescript@npm:5.3.3": version: 5.3.3 resolution: "typescript@npm:5.3.3" @@ -30710,6 +36620,15 @@ __metadata: languageName: node linkType: hard +"ua-parser-js@npm:^1.0.37": + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" + bin: + ua-parser-js: script/cli.js + checksum: 10/dd4026b6ece8a34a0d39b6de5542154c4506077d8def8647a300a29e1b3ffa0e23f5c8eeeb8101df6162b7b3eb3597d0b4adb031ae6104cbdb730d6ebc07f3c0 + languageName: node + linkType: hard + "ufo@npm:^1.5.3, ufo@npm:^1.5.4": version: 1.5.4 resolution: "ufo@npm:1.5.4" @@ -30726,6 +36645,24 @@ __metadata: languageName: node linkType: hard +"uint8arrays@npm:3.1.0": + version: 3.1.0 + resolution: "uint8arrays@npm:3.1.0" + dependencies: + multiformats: "npm:^9.4.2" + checksum: 10/caf1cd6a1cdbd7c59d6c8698c06a6d603380942b5745b3fddcd1b16f7a84a4f351fb8c6ac41f4cb2c59c226bb6d954733a6e20a42dec6f3fd266a02270a5088d + languageName: node + linkType: hard + +"uint8arrays@npm:^3.0.0": + version: 3.1.1 + resolution: "uint8arrays@npm:3.1.1" + dependencies: + multiformats: "npm:^9.4.2" + checksum: 10/536e70273c040484aa7d522031a9dbca1fe8c06eb58a3ace1064ba68825b4e2764d4a0b604a1c451e7b8be0986dc94f23a419cfe9334bd116716074a2d29b33d + languageName: node + linkType: hard + "ultron@npm:~1.1.0": version: 1.1.1 resolution: "ultron@npm:1.1.1" @@ -30745,6 +36682,13 @@ __metadata: languageName: node linkType: hard +"uncrypto@npm:^0.1.3": + version: 0.1.3 + resolution: "uncrypto@npm:0.1.3" + checksum: 10/0020f74b0ce34723196d8982a73bb7f40cff455a41b8f88ae146b86885f4e66e41a1241fe80a887505c3bd2c7f07ed362b6ed041968370073c40a98496e6a737 + languageName: node + linkType: hard + "undefsafe@npm:^2.0.5": version: 2.0.5 resolution: "undefsafe@npm:2.0.5" @@ -30775,6 +36719,19 @@ __metadata: languageName: node linkType: hard +"unenv@npm:^1.10.0": + version: 1.10.0 + resolution: "unenv@npm:1.10.0" + dependencies: + consola: "npm:^3.2.3" + defu: "npm:^6.1.4" + mime: "npm:^3.0.0" + node-fetch-native: "npm:^1.6.4" + pathe: "npm:^1.1.2" + checksum: 10/23198e150fd3b4db4d7abe444b75ee05a0d36768bd6d94a6aaf5dca830db82e707ccc0f6cca22671327b62c5cd85ada08d4665bf7652afec9de0bdc7a4546249 + languageName: node + linkType: hard + "unenv@npm:unenv-nightly@2.0.0-1724863496.70db6f1": version: 2.0.0-1724863496.70db6f1 resolution: "unenv-nightly@npm:2.0.0-1724863496.70db6f1" @@ -30913,6 +36870,65 @@ __metadata: languageName: node linkType: hard +"unstorage@npm:^1.9.0": + version: 1.13.1 + resolution: "unstorage@npm:1.13.1" + dependencies: + anymatch: "npm:^3.1.3" + chokidar: "npm:^3.6.0" + citty: "npm:^0.1.6" + destr: "npm:^2.0.3" + h3: "npm:^1.13.0" + listhen: "npm:^1.9.0" + lru-cache: "npm:^10.4.3" + node-fetch-native: "npm:^1.6.4" + ofetch: "npm:^1.4.1" + ufo: "npm:^1.5.4" + peerDependencies: + "@azure/app-configuration": ^1.7.0 + "@azure/cosmos": ^4.1.1 + "@azure/data-tables": ^13.2.2 + "@azure/identity": ^4.5.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.25.0 + "@capacitor/preferences": ^6.0.2 + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 + "@vercel/kv": ^1.0.1 + idb-keyval: ^6.2.1 + ioredis: ^5.4.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/kv": + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + checksum: 10/a5fea4f83189d222dcb95ce36d0de29b1ab2fa64122f4c4435b63e6dab8bacd630f6234b0599a505de620f719965ea3a3ce068ece759a96e19fd187e1fb9561c + languageName: node + linkType: hard + "untildify@npm:^4.0.0": version: 4.0.0 resolution: "untildify@npm:4.0.0" @@ -30920,6 +36936,19 @@ __metadata: languageName: node linkType: hard +"untun@npm:^0.1.3": + version: 0.1.3 + resolution: "untun@npm:0.1.3" + dependencies: + citty: "npm:^0.1.5" + consola: "npm:^3.2.3" + pathe: "npm:^1.1.1" + bin: + untun: bin/untun.mjs + checksum: 10/6a096002ca13b8442ad1d40840088888cfaa28626eefdd132cd0fd3d3b956af121a9733b7bda32647608e278fb13332d2b72e2c319a27dc55dbc8e709a2f61d4 + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.0.13": version: 1.0.13 resolution: "update-browserslist-db@npm:1.0.13" @@ -30948,6 +36977,13 @@ __metadata: languageName: node linkType: hard +"uqr@npm:^0.1.2": + version: 0.1.2 + resolution: "uqr@npm:0.1.2" + checksum: 10/31f1fe7d7a8121a2670712234524763160985b053e7eb8af7925a131bcde0df11641e15129d988358032da603185456d08dd72b26b507897272eb9640273bfa6 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -31001,7 +37037,7 @@ __metadata: languageName: node linkType: hard -"use-callback-ref@npm:^1.3.0": +"use-callback-ref@npm:^1.3.0, use-callback-ref@npm:^1.3.2": version: 1.3.2 resolution: "use-callback-ref@npm:1.3.2" dependencies: @@ -31044,6 +37080,24 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/a676216affc203876bd47981103f201f28c2731361bb186367e12d287a7566763213a8816910c6eb88265eccd4c230426eb783d64c373c4a180905be8820ed8e + languageName: node + linkType: hard + +"use-sync-external-store@npm:1.2.2": + version: 1.2.2 + resolution: "use-sync-external-store@npm:1.2.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/671e9c190aab9a8374a5d468c6ba17f52c38b6fae970110bc196fc1e2b57204149aea9619be49a1bb5207fb6e51d8afd19c3bcb94afe61813fed039821461dc0 + languageName: node + linkType: hard + "utf-8-validate@npm:5.0.7": version: 5.0.7 resolution: "utf-8-validate@npm:5.0.7" @@ -31105,6 +37159,13 @@ __metadata: languageName: node linkType: hard +"utility-types@npm:^3.10.0": + version: 3.11.0 + resolution: "utility-types@npm:3.11.0" + checksum: 10/a3c51463fc807ed04ccc8b5d0fa6e31f3dcd7a4cbd30ab4bc6d760ce5319dd493d95bf04244693daf316f97e9ab2a37741edfed8748ad38572a595398ad0fdaf + languageName: node + linkType: hard + "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -31183,6 +37244,24 @@ __metadata: languageName: node linkType: hard +"valtio@npm:1.11.2": + version: 1.11.2 + resolution: "valtio@npm:1.11.2" + dependencies: + proxy-compare: "npm:2.5.1" + use-sync-external-store: "npm:1.2.0" + peerDependencies: + "@types/react": ">=16.8" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + checksum: 10/a259f5af204b801668e019855813a8f702c9558961395bb5847f583119428b997efb9b0e6feb5d6e48a76a9b541173a10fdfdb1527a7bd14477a0e0c5beba914 + languageName: node + linkType: hard + "varint@npm:^5.0.0": version: 5.0.2 resolution: "varint@npm:5.0.2" @@ -31208,6 +37287,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "viem@npm:^1.20.0": version: 1.20.0 resolution: "viem@npm:1.20.0" @@ -31220,12 +37300,31 @@ __metadata: abitype: "npm:0.9.8" isows: "npm:1.0.3" ws: "npm:8.13.0" +======= +"viem@npm:^2.1.1, viem@npm:^2.21.41, viem@npm:^2.21.45": + version: 2.21.45 + resolution: "viem@npm:2.21.45" + dependencies: + "@noble/curves": "npm:1.6.0" + "@noble/hashes": "npm:1.5.0" + "@scure/bip32": "npm:1.5.0" + "@scure/bip39": "npm:1.4.0" + abitype: "npm:1.0.6" + isows: "npm:1.0.6" + ox: "npm:0.1.2" + webauthn-p256: "npm:0.0.10" + ws: "npm:8.18.0" +>>>>>>> origin/main peerDependencies: typescript: ">=5.0.4" peerDependenciesMeta: typescript: optional: true +<<<<<<< HEAD checksum: 10/f6f232e1b75085b2088e842a44d3e574afd3e603420cf65181d6fb0dec7942d0c4f4d3cdae8f7a43ddb9942dcb185443b1d5b7daec8a009a3cbab9436bea2164 +======= + checksum: 10/93428588882620de5ed442a5a568367762d39660bdb4ff9c430d5409da1dca085a3648bf0afedb6631bb219b410e58ccabf600ed26228ab9ae73a77a1031c576 +>>>>>>> origin/main languageName: node linkType: hard @@ -31377,6 +37476,25 @@ __metadata: languageName: node linkType: hard +"wagmi@npm:^2.12.26": + version: 2.12.32 + resolution: "wagmi@npm:2.12.32" + dependencies: + "@wagmi/connectors": "npm:5.3.10" + "@wagmi/core": "npm:2.14.6" + use-sync-external-store: "npm:1.2.0" + peerDependencies: + "@tanstack/react-query": ">=5.0.0" + react: ">=18" + typescript: ">=5.0.4" + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/6456d32df5c7a6ed1bdde1c4512fccf6a4bc45f1cf78e44cc44f952e3a8016f7b413197e431bd4b3bfb5faab78ae79f7bab402f323e12bcaddd67cb3f5cd5c6a + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -31804,6 +37922,33 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD +======= +"webauthn-p256@npm:0.0.10": + version: 0.0.10 + resolution: "webauthn-p256@npm:0.0.10" + dependencies: + "@noble/curves": "npm:^1.4.0" + "@noble/hashes": "npm:^1.4.0" + checksum: 10/dde2b6313b6a0f20996f7ee90181258fc7685bfff401df7d904578da75b374f25d5b9c1189cd2fcec30625b1f276b393188d156d49783f0611623cd713bb5b09 + languageName: node + linkType: hard + +"webextension-polyfill@npm:>=0.10.0 <1.0": + version: 0.12.0 + resolution: "webextension-polyfill@npm:0.12.0" + checksum: 10/77e648b958b573ef075e75a0c180e2bbd74dee17b3145e86d21fcbb168c4999e4a311654fe634b8178997bee9b35ea5808d8d3d3e5ff2ad138f197f4f0ea75d9 + languageName: node + linkType: hard + +"webextension-polyfill@npm:^0.10.0": + version: 0.10.0 + resolution: "webextension-polyfill@npm:0.10.0" + checksum: 10/51ff30ebed4b1aa802b7f0347f05021b2fe492078bb1a597223d43995fcee96e2da8f914a2f6e36f988c1877ed5ab36ca7077f2f3ab828955151a59e4c01bf7e + languageName: node + linkType: hard + +>>>>>>> origin/main "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -31862,7 +38007,27 @@ __metadata: languageName: node linkType: hard -"which-collection@npm:^1.0.1": +"which-builtin-type@npm:^1.1.3": + version: 1.1.4 + resolution: "which-builtin-type@npm:1.1.4" + dependencies: + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.0.5" + is-finalizationregistry: "npm:^1.0.2" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.1.4" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.15" + checksum: 10/c0cdb9b004e7a326f4ce54c75b19658a3bec73601a71dd7e2d9538accb3e781b546b589c3f306caf5e7429ac1c8019028d5e662e2860f03603354105b8247c83 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.1, which-collection@npm:^1.0.2": version: 1.0.2 resolution: "which-collection@npm:1.0.2" dependencies: @@ -31911,6 +38076,19 @@ __metadata: languageName: node linkType: hard +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + checksum: 10/c3b6a99beadc971baa53c3ee5b749f2b9bdfa3b3b9a70650dd8511a48b61d877288b498d424712e9991d16019633086bd8b5923369460d93463c5825fa36c448 + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.2": version: 1.1.8 resolution: "which-typed-array@npm:1.1.8" @@ -31986,6 +38164,15 @@ __metadata: languageName: node linkType: hard +"wif@npm:^2.0.6": + version: 2.0.6 + resolution: "wif@npm:2.0.6" + dependencies: + bs58check: "npm:<3.0.0" + checksum: 10/c8d7581664532d9ab6d163ee5194a9bec71b089a6e50d54d6ec57a9bd714fcf84bc8d9f22f4cfc7c297fc6ad10b973b8e83eca5c41240163fc61f44b5154b7da + languageName: node + linkType: hard + "word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" @@ -32233,9 +38420,30 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "ws@npm:^8.17.1, ws@npm:^8.2.3": version: 8.18.0 resolution: "ws@npm:8.18.0" +======= +"ws@npm:^7.5.1, ws@npm:^7.5.10": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/9c796b84ba80ffc2c2adcdfc9c8e9a219ba99caa435c9a8d45f9ac593bba325563b3f83edc5eb067cc6d21b9a6bf2c930adf76dd40af5f58a5ca6859e81858f0 + languageName: node + linkType: hard + +"ws@npm:^8.5.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" +>>>>>>> origin/main peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -32248,6 +38456,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:~8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/4264ae92c0b3e59c7e309001e93079b26937aab181835fb7af79f906b22cd33b6196d96556dafb4e985742dd401e99139572242e9847661fdbc96556b9e6902d + languageName: node + linkType: hard + "xhr-request-promise@npm:^0.1.2": version: 0.1.3 resolution: "xhr-request-promise@npm:0.1.3" @@ -32284,6 +38507,13 @@ __metadata: languageName: node linkType: hard +"xmlhttprequest-ssl@npm:~2.1.1": + version: 2.1.2 + resolution: "xmlhttprequest-ssl@npm:2.1.2" + checksum: 10/708a177fe41c6c8cd4ec7c04d965b4c01801d87f44383ec639be58bdc14418142969841659e0850db44feee8bec0a3d3e7d33fed22519415f3d0daab04d3f160 + languageName: node + linkType: hard + "xmlhttprequest@npm:1.8.0": version: 1.8.0 resolution: "xmlhttprequest@npm:1.8.0" @@ -32366,7 +38596,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.2": +"yaml@npm:^1.10.0, yaml@npm:^1.10.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: 10/e088b37b4d4885b70b50c9fa1b7e54bd2e27f5c87205f9deaffd1fb293ab263d9c964feadb9817a7b129a5bf30a06582cb08750f810568ecc14f3cdbabb79cb3 @@ -32479,7 +38709,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^15.1.0": +"yargs@npm:^15.1.0, yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" dependencies: @@ -32594,6 +38824,47 @@ __metadata: languageName: node linkType: hard +"zustand@npm:5.0.0": + version: 5.0.0 + resolution: "zustand@npm:5.0.0" + peerDependencies: + "@types/react": ">=18.0.0" + immer: ">=9.0.6" + react: ">=18.0.0" + use-sync-external-store: ">=1.2.0" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + checksum: 10/be75ef4d1b218b143314467bb9e23641231043cad2d5c3a4b2219c46d1609ee799cd8dc9acec9b23d55ec3a2a619a06616e593aea4049f3b7323938af9a33bfe + languageName: node + linkType: hard + +"zustand@npm:^4.5.5": + version: 4.5.5 + resolution: "zustand@npm:4.5.5" + dependencies: + use-sync-external-store: "npm:1.2.2" + peerDependencies: + "@types/react": ">=16.8" + immer: ">=9.0.6" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + checksum: 10/481b8210187b69678074a1ca51107654c2379688e90407bfcb7961e0803a259742bfd0d77171c3f07e290896ad55fe9659b3863f30d34cb2572650ead1249f25 + languageName: node + linkType: hard + "zx@npm:^8.1.4": version: 8.1.4 resolution: "zx@npm:8.1.4"