From e7350efcf1b996cc68f11bc6b0e9432aa84e1629 Mon Sep 17 00:00:00 2001 From: Mohammed Hussan Date: Fri, 20 Dec 2024 15:09:36 +0000 Subject: [PATCH 01/81] feat(warpConfig): Update FastUSD/ethereum-sei collateral router owner (#5053) ### Description - Update FastUSD/ethereum-sei collateral router owner ### Testing Manual --- .../warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts index 73c3a5655d..cb90ba42a8 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts @@ -15,6 +15,7 @@ import { // Elixir const owner = '0x00000000F51340906F767C6999Fe512b1275955C'; +const elixirSafe = '0x738744237b7fd97af670d9ddf54390c24263cea8'; const ownerConfig = getOwnerConfigForAddress(owner); export const getEthereumSeiFastUSDWarpConfig = async ( @@ -34,7 +35,10 @@ export const getEthereumSeiFastUSDWarpConfig = async ( const ethereum: HypTokenRouterConfig = { ...routerConfig.ethereum, - ...ownerConfig, + owner: elixirSafe, + ownerOverrides: { + proxyAdmin: owner, + }, type: TokenType.collateral, token: tokens.ethereum.deUSD, interchainSecurityModule: ethers.constants.AddressZero, From 774d54971812abc26c85aee52647dc762f14d65f Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:36:34 +0000 Subject: [PATCH 02/81] chore(retrying_provider): reduce log verbosity (#5038) ### Description 60% of validator logs are `Dispatching request`, which really isn't needed at the info/debug level and we can safe quite significantly ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../src/rpc_clients/retrying.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/retrying.rs b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/retrying.rs index 7c57e61702..59baeec762 100644 --- a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/retrying.rs +++ b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/retrying.rs @@ -10,7 +10,7 @@ use serde::{de::DeserializeOwned, Serialize}; use serde_json::Value; use thiserror::Error; use tokio::time::sleep; -use tracing::{debug, error, instrument, trace, warn_span}; +use tracing::{error, instrument, trace, warn, warn_span}; /// An HTTP Provider with a simple naive exponential backoff built-in #[derive(Debug, Clone)] @@ -89,13 +89,16 @@ where { let params = serde_json::to_value(params).expect("valid"); - let mut last_err; + let mut last_err = None; let mut i = 1; loop { let mut rate_limited = false; let backoff_ms = self.base_retry_ms * 2u64.pow(i - 1); - trace!(params = %serde_json::to_string(¶ms).unwrap_or_default(), "Dispatching request with params"); - debug!(attempt = i, "Dispatching request"); + if let Some(ref last_err) = last_err { + // `last_err` is always expected to be `Some` if `i > 1` + warn!(attempt = i, ?last_err, "Dispatching request"); + } + trace!(attempt = i, params = %serde_json::to_string(¶ms).unwrap_or_default(), "Dispatching request"); let fut = match params { Value::Null => self.inner.request(method, ()), @@ -110,10 +113,10 @@ where return Err(RetryingProviderError::JsonRpcClientError(e)); } HandleMethod::Retry(e) => { - last_err = e; + last_err = Some(e); } HandleMethod::RateLimitedRetry(e) => { - last_err = e; + last_err = Some(e); rate_limited = true; } } @@ -128,7 +131,7 @@ where trace!(backoff_ms, rate_limited, "Retrying provider going to sleep"); sleep(Duration::from_millis(backoff_ms)).await; } else { - trace!( + warn!( requests_made = self.max_requests, "Retrying provider reached max requests" ); @@ -150,7 +153,7 @@ where JsonRpcClientError(P::Error), /// Hit max requests #[error("Hit max requests")] - MaxRequests(P::Error), + MaxRequests(Option), } impl

From> for ProviderError From d4cf9687445ab57becf18e283135fcc2e8da48ef Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Sat, 21 Dec 2024 23:24:19 +0000 Subject: [PATCH 03/81] chore: rm Viction env-test (#5067) ### Description - Removing the consistently failing Viction env test, see https://discord.com/channels/935678348330434570/1319783601407262854/1319788686111674418 for context ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 98426a76a6..d2e5f9a40b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -301,7 +301,7 @@ jobs: fail-fast: false matrix: environment: [mainnet3] - chain: [ethereum, arbitrum, optimism, inevm, viction] + chain: [ethereum, arbitrum, optimism, inevm] module: [core, igp] include: - environment: testnet4 From ccba2925299627c8bcd65c918dc89a562e426b3c Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Sun, 22 Dec 2024 05:58:31 +0000 Subject: [PATCH 04/81] chore: add undeliverable message to blacklist (#5066) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/agent.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 7820908d81..3756344809 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -537,6 +537,10 @@ const blacklistedMessageIds = [ // ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet '0x229a832dfdfa23dfc27eb773e6b34e87f329067393f4f7b616251b3d7d52d294', '0xcdfd5294e8b1253263908e1919d27675f80a2e9a3bb339b759810efdbb81faa5', + + // txs between unenrolled routers of + // USDT/arbitrum-ethereum-mantle-mode-polygon-scroll-zeronetwork + '0x10159bf1b5b2142b882cb060d1da9f9123d82974ca265ba432138221e52c2a27', ]; // Blacklist matching list intended to be used by all contexts. From 09679f8b04331583a89ce185a340b1cc4e8413ab Mon Sep 17 00:00:00 2001 From: anson-caldera Date: Sun, 22 Dec 2024 22:36:02 -0800 Subject: [PATCH 05/81] fix: correct instructions in Rust readme for building docker image (#5064) ### Description Fix incorrect instructions in Rust readme for building the docker image. The build does not work as the readme dictates. Being in the rust folder gives a `ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref y1ezs2da6re8bcvxgo9psu1xk::hydxdsbeaxqx3rvjjzako1134: "/rust/main/config": not found` error. Being at the top level causes a successful build. Also have to edit the build script to target the correct directory dockerfile. --- rust/README.md | 5 ++--- rust/build.sh | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/rust/README.md b/rust/README.md index 35050b1e79..2e4577deac 100644 --- a/rust/README.md +++ b/rust/README.md @@ -119,11 +119,10 @@ cargo test --release --package run-locally --bin run-locally --features cosmos - ### Building Agent Docker Images There exists a docker build for the agent binaries. These docker images are used for deploying the agents in a -production environment. +production environment. You should run this at the top level of the repo. ```bash -cd rust -./build.sh +./rust/build.sh ``` ### Deploy Procedure diff --git a/rust/build.sh b/rust/build.sh index 65214900b5..16af4721ba 100755 --- a/rust/build.sh +++ b/rust/build.sh @@ -19,4 +19,4 @@ if [[ -z $TAG ]]; then fi fi -DOCKER_BUILDKIT=1 docker build $PLATFORM -t gcr.io/abacus-labs-dev/hyperlane-agent:$TAG . +DOCKER_BUILDKIT=1 docker build -f rust/Dockerfile $PLATFORM -t gcr.io/abacus-labs-dev/hyperlane-agent:$TAG . From c914123909c6dc9732d4aea7c19ab0b9206d6466 Mon Sep 17 00:00:00 2001 From: Mohammed Hussan Date: Mon, 23 Dec 2024 17:07:52 +0000 Subject: [PATCH 06/81] fix(warpChecker): Check for token mismatch before decimals check (#5023) ### Description - reorder checks to so that a token mismatch is caught before decimal checks are done. This will avoid us calling `.decimals` on a contract that is not a token contract i.e if the config has been misconfigured ### Testing Manual --- typescript/sdk/src/token/checker.ts | 47 +++++++++++++++-------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/typescript/sdk/src/token/checker.ts b/typescript/sdk/src/token/checker.ts index cf29d28c81..7f18e27b80 100644 --- a/typescript/sdk/src/token/checker.ts +++ b/typescript/sdk/src/token/checker.ts @@ -68,29 +68,7 @@ export class HypERC20Checker extends ProxiedRouterChecker< const expectedConfig = this.configMap[chain]; const hypToken = this.app.router(this.app.getContracts(chain)); - // Check all actual decimals are consistent - const actualChainDecimals = await this.getEvmActualDecimals(); - this.checkDecimalConsistency( - chain, - hypToken, - actualChainDecimals, - 'actual', - true, - ); - - // Check all config decimals are consistent as well - const configDecimals = objMap( - this.configMap, - (_chain, config) => config.decimals, - ); - this.checkDecimalConsistency( - chain, - hypToken, - configDecimals, - 'config', - false, - ); - + // Check if configured token type matches actual token type if (isNativeTokenConfig(expectedConfig)) { try { await this.multiProvider.estimateGas(chain, { @@ -126,6 +104,29 @@ export class HypERC20Checker extends ProxiedRouterChecker< this.addViolation(violation); } } + + // Check all actual decimals are consistent, this should be done after checking the token type to avoid 'decimal()' calls to non collateral token that would fail + const actualChainDecimals = await this.getEvmActualDecimals(); + this.checkDecimalConsistency( + chain, + hypToken, + actualChainDecimals, + 'actual', + true, + ); + + // Check all config decimals are consistent as well + const configDecimals = objMap( + this.configMap, + (_chain, config) => config.decimals, + ); + this.checkDecimalConsistency( + chain, + hypToken, + configDecimals, + 'config', + false, + ); } private cachedAllActualDecimals: Record | undefined = From e9911bb9d2bbe68783c61f7ade166954db55e9fd Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 23 Dec 2024 21:03:29 +0000 Subject: [PATCH 07/81] feat: SVM priority fee oracles and transaction submitters, more consistent tx submission (#4959) ### Description The fruition of https://www.notion.so/hyperlanexyz/Landing-Solana-Transactions-15a6d35200d680cbaf5eea5f9dbec1b1 Major highlights: - Instead of using the max CUs, estimate CU usage and apply a 10% buffer - Allow for priority fees to be configured. If not specified, defaults to a constant priority fee of 0. Supported options are: - a constant fee - the Helius priority fee API (https://docs.helius.dev/solana-apis/priority-fee-api) - Allow for transaction submission to be configured. If not specified, defaults to the configured RPC url for the chain. Supported options are: - An arbitrary RPC URL, which will use priority fee auctions for fees - Jito, which will use a tip for fees - In our own infra, we have logic to plumb through the Helius URL found at https://console.cloud.google.com/security/secret-manager/secret/mainnet3-rpc-endpoint-helius-solanamainnet/versions?project=abacus-labs-dev - Signs txs with a finalized blockhash, as suggested by [How to Land Transactions on Solana](https://www.helius.dev/blog/how-to-land-transactions-on-solana) - Partially implements `process_estimate_costs` to test that messages are processable. Does not yet actually enforce gas limits, because this will take some rollout effort. This is part of https://www.notion.so/hyperlanexyz/Alerting-on-critical-processing-issues-for-any-and-all-messages-15b6d35200d680a79d40fabc2e4e49da ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --------- Co-authored-by: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> --- .changeset/long-llamas-fly.md | 2 +- .changeset/polite-bulldogs-sit.md | 2 +- .changeset/spotty-guests-dance.md | 5 + .../main/chains/hyperlane-sealevel/src/lib.rs | 2 + .../chains/hyperlane-sealevel/src/mailbox.rs | 392 ++++++------------ .../hyperlane-sealevel/src/priority_fee.rs | 218 ++++++++++ .../hyperlane-sealevel/src/rpc/client.rs | 262 +++++++++++- .../hyperlane-sealevel/src/trait_builder.rs | 110 +++++ .../hyperlane-sealevel/src/tx_submitter.rs | 115 +++++ rust/main/config/mainnet_config.json | 7 +- .../templates/external-secret.yaml | 13 + .../templates/relayer-statefulset.yaml | 2 + .../templates/scraper-statefulset.yaml | 2 + .../templates/validator-statefulset.yaml | 2 + .../src/settings/parser/connection_parser.rs | 178 +++++++- .../config/environments/mainnet3/agent.ts | 48 +++ typescript/infra/src/agents/index.ts | 31 +- typescript/infra/src/config/agent/agent.ts | 15 + typescript/infra/src/utils/helm.ts | 9 +- typescript/sdk/src/index.ts | 6 + typescript/sdk/src/metadata/agentConfig.ts | 62 +++ 21 files changed, 1190 insertions(+), 293 deletions(-) create mode 100644 .changeset/spotty-guests-dance.md create mode 100644 rust/main/chains/hyperlane-sealevel/src/priority_fee.rs create mode 100644 rust/main/chains/hyperlane-sealevel/src/tx_submitter.rs diff --git a/.changeset/long-llamas-fly.md b/.changeset/long-llamas-fly.md index c0d6d01e9b..f9da56dd0f 100644 --- a/.changeset/long-llamas-fly.md +++ b/.changeset/long-llamas-fly.md @@ -1,5 +1,5 @@ --- -"@hyperlane-xyz/cli": patch +'@hyperlane-xyz/cli': patch --- Suppress help on CLI failures diff --git a/.changeset/polite-bulldogs-sit.md b/.changeset/polite-bulldogs-sit.md index 8acf555fe5..6c68774325 100644 --- a/.changeset/polite-bulldogs-sit.md +++ b/.changeset/polite-bulldogs-sit.md @@ -1,5 +1,5 @@ --- -"@hyperlane-xyz/cli": patch +'@hyperlane-xyz/cli': patch --- Fix strategy flag propagation diff --git a/.changeset/spotty-guests-dance.md b/.changeset/spotty-guests-dance.md new file mode 100644 index 0000000000..39eb9b0f49 --- /dev/null +++ b/.changeset/spotty-guests-dance.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Added new Sealevel tx submission and priority fee oracle params to agent config types diff --git a/rust/main/chains/hyperlane-sealevel/src/lib.rs b/rust/main/chains/hyperlane-sealevel/src/lib.rs index 90a2e01b66..6121bbe27f 100644 --- a/rust/main/chains/hyperlane-sealevel/src/lib.rs +++ b/rust/main/chains/hyperlane-sealevel/src/lib.rs @@ -23,8 +23,10 @@ mod log_meta_composer; mod mailbox; mod merkle_tree_hook; mod multisig_ism; +mod priority_fee; mod provider; mod rpc; mod trait_builder; +mod tx_submitter; mod utils; mod validator_announce; diff --git a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs index 66e58131aa..034f24c027 100644 --- a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs +++ b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs @@ -22,61 +22,37 @@ use hyperlane_sealevel_message_recipient_interface::{ }; use lazy_static::lazy_static; use serializable_account_meta::SimulationReturnData; -use solana_client::{rpc_client::SerializableTransaction, rpc_response::Response}; use solana_program::pubkey; use solana_sdk::{ account::Account, - bs58, clock::Slot, commitment_config::CommitmentConfig, - compute_budget::ComputeBudgetInstruction, instruction::{AccountMeta, Instruction}, pubkey::Pubkey, - signature::Signature, signer::{keypair::Keypair, Signer as _}, - transaction::Transaction, }; -use solana_transaction_status::TransactionStatus; use tracing::{debug, info, instrument, warn}; use hyperlane_core::{ config::StrOrIntParseError, ChainCommunicationError, ChainResult, ContractLocator, Decode as _, Encode as _, FixedPointNumber, HyperlaneChain, HyperlaneContract, HyperlaneDomain, - HyperlaneMessage, HyperlaneProvider, Indexed, Indexer, KnownHyperlaneDomain, LogMeta, Mailbox, - MerkleTreeHook, ReorgPeriod, SequenceAwareIndexer, TxCostEstimate, TxOutcome, H256, H512, U256, + HyperlaneMessage, HyperlaneProvider, Indexed, Indexer, LogMeta, Mailbox, MerkleTreeHook, + ReorgPeriod, SequenceAwareIndexer, TxCostEstimate, TxOutcome, H256, H512, U256, }; -use crate::account::{search_accounts_by_discriminator, search_and_validate_account}; use crate::log_meta_composer::{ is_message_delivery_instruction, is_message_dispatch_instruction, LogMetaComposer, }; +use crate::tx_submitter::TransactionSubmitter; +use crate::{ + account::{search_accounts_by_discriminator, search_and_validate_account}, + priority_fee::PriorityFeeOracle, +}; use crate::{ConnectionConf, SealevelProvider, SealevelRpcClient}; const SYSTEM_PROGRAM: &str = "11111111111111111111111111111111"; const SPL_NOOP: &str = "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"; -// The max amount of compute units for a transaction. -// TODO: consider a more sane value and/or use IGP gas payments instead. -const PROCESS_COMPUTE_UNITS: u32 = 1_400_000; - -/// 0.0005 SOL, in lamports. -/// A typical tx fee without a prioritization fee is 0.000005 SOL, or -/// 5000 lamports. (Example: https://explorer.solana.com/tx/fNd3xVeBzFHeuzr8dXQxLGiHMzTeYpykSV25xWzNRaHtzzjvY9A3MzXh1ZsK2JncRHkwtuWrGEwGXVhFaUCYhtx) -/// See average priority fees here https://solanacompass.com/statistics/fees -/// to inform what to spend here. -const PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX: u64 = 500000; - -/// In micro-lamports. Multiply this by the compute units to figure out -/// the additional cost of processing a message, in addition to the mandatory -/// "base" cost of signature verification. -/// Unused at the moment, but kept for future reference. -#[allow(dead_code)] -const PROCESS_COMPUTE_UNIT_PRICE_MICRO_LAMPORTS: u64 = - // Convert to micro-lamports - (PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX * 1_000_000) - // Divide by the max compute units - / PROCESS_COMPUTE_UNITS as u64; - // Earlier versions of collateral warp routes were deployed off a version where the mint // was requested as a writeable account for handle instruction. This is not necessary, // and generally requires a higher priority fee to be paid. @@ -96,6 +72,7 @@ lazy_static! { (pubkey!("CuQmsT4eSF4dYiiGUGYYQxJ7c58pUAD5ADE3BbFGzQKx"), pubkey!("EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm")), ]); } + /// A reference to a Mailbox contract on some Sealevel chain pub struct SealevelMailbox { pub(crate) program_id: Pubkey, @@ -103,6 +80,8 @@ pub struct SealevelMailbox { pub(crate) outbox: (Pubkey, u8), pub(crate) provider: SealevelProvider, payer: Option, + priority_fee_oracle: Box, + tx_submitter: Box, } impl SealevelMailbox { @@ -127,8 +106,12 @@ impl SealevelMailbox { program_id, inbox, outbox, - provider, payer, + priority_fee_oracle: conf.priority_fee_oracle.create_oracle(), + tx_submitter: conf + .transaction_submitter + .create_submitter(provider.rpc().url()), + provider, }) } @@ -301,122 +284,88 @@ impl SealevelMailbox { self.get_account_metas(instruction).await } - fn use_jito(&self) -> bool { - matches!( - self.domain(), - HyperlaneDomain::Known(KnownHyperlaneDomain::SolanaMainnet) - ) - } - - async fn send_and_confirm_transaction( + async fn get_process_instruction( &self, - transaction: &Transaction, - ) -> ChainResult { - if self.use_jito() { - self.send_and_confirm_transaction_with_jito(transaction) - .await - } else { - self.provider - .rpc() - .send_and_confirm_transaction(transaction) - .await - } - } + message: &HyperlaneMessage, + metadata: &[u8], + ) -> ChainResult { + let recipient: Pubkey = message.recipient.0.into(); + let mut encoded_message = vec![]; + message.write_to(&mut encoded_message).unwrap(); - /// Send a transaction to Jito and wait for it to be confirmed. - /// Logic stolen from Solana's non-blocking client. - pub async fn send_and_confirm_transaction_with_jito( - &self, - transaction: &impl SerializableTransaction, - ) -> ChainResult { - let signature = transaction.get_signature(); + let payer = self.get_payer()?; - let base58_txn = bs58::encode( - bincode::serialize(&transaction).map_err(ChainCommunicationError::from_other)?, + let (process_authority_key, _process_authority_bump) = Pubkey::try_find_program_address( + mailbox_process_authority_pda_seeds!(&recipient), + &self.program_id, ) - .into_string(); - - const SEND_RETRIES: usize = 1; - const GET_STATUS_RETRIES: usize = usize::MAX; - - 'sending: for _ in 0..SEND_RETRIES { - let jito_request_body = serde_json::json!({ - "jsonrpc": "2.0", - "id": 1, - "method": "sendBundle", - "params": [ - [base58_txn] - ], + .ok_or_else(|| { + ChainCommunicationError::from_other_str( + "Could not find program address for process authority", + ) + })?; + let (processed_message_account_key, _processed_message_account_bump) = + Pubkey::try_find_program_address( + mailbox_processed_message_pda_seeds!(message.id()), + &self.program_id, + ) + .ok_or_else(|| { + ChainCommunicationError::from_other_str( + "Could not find program address for processed message account", + ) + })?; + + // Get the account metas required for the recipient.InterchainSecurityModule instruction. + let ism_getter_account_metas = self.get_ism_getter_account_metas(recipient).await?; + + // Get the recipient ISM. + let ism = self + .get_recipient_ism(recipient, ism_getter_account_metas.clone()) + .await?; + + let ixn = + hyperlane_sealevel_mailbox::instruction::Instruction::InboxProcess(InboxProcess { + metadata: metadata.to_vec(), + message: encoded_message.clone(), }); + let ixn_data = ixn + .into_instruction_data() + .map_err(ChainCommunicationError::from_other)?; - tracing::info!( - ?jito_request_body, - ?signature, - "Sending sealevel transaction to Jito as bundle" - ); + // Craft the accounts for the transaction. + let mut accounts: Vec = vec![ + AccountMeta::new_readonly(payer.pubkey(), true), + AccountMeta::new_readonly(Pubkey::from_str(SYSTEM_PROGRAM).unwrap(), false), + AccountMeta::new(self.inbox.0, false), + AccountMeta::new_readonly(process_authority_key, false), + AccountMeta::new(processed_message_account_key, false), + ]; + accounts.extend(ism_getter_account_metas); + accounts.extend([ + AccountMeta::new_readonly(Pubkey::from_str(SPL_NOOP).unwrap(), false), + AccountMeta::new_readonly(ism, false), + ]); - let jito_response = reqwest::Client::new() - .post("https://mainnet.block-engine.jito.wtf:443/api/v1/bundles") - .json(&jito_request_body) - .send() - .await - .map_err(ChainCommunicationError::from_other)?; - let jito_response_text = jito_response.text().await; - - tracing::info!( - ?signature, - ?jito_response_text, - "Got Jito response for sealevel transaction bundle" - ); + // Get the account metas required for the ISM.Verify instruction. + let ism_verify_account_metas = self + .get_ism_verify_account_metas(ism, metadata.into(), encoded_message) + .await?; + accounts.extend(ism_verify_account_metas); - let recent_blockhash = if transaction.uses_durable_nonce() { - self.provider - .rpc() - .get_latest_blockhash_with_commitment(CommitmentConfig::processed()) - .await? - } else { - *transaction.get_recent_blockhash() - }; - - for status_retry in 0..GET_STATUS_RETRIES { - let signature_statuses: Response>> = self - .provider - .rpc() - .get_signature_statuses(&[*signature]) - .await?; - let signature_status = signature_statuses.value.first().cloned().flatten(); - match signature_status { - Some(_) => return Ok(*signature), - None => { - if !self - .provider - .rpc() - .is_blockhash_valid(&recent_blockhash) - .await? - { - // Block hash is not found by some reason - break 'sending; - } else if cfg!(not(test)) - // Ignore sleep at last step. - && status_retry < GET_STATUS_RETRIES - { - // Retry twice a second - tokio::time::sleep(std::time::Duration::from_millis(500)).await; - continue; - } - } - } - } - } + // The recipient. + accounts.extend([AccountMeta::new_readonly(recipient, false)]); - Err(ChainCommunicationError::from_other( - solana_client::rpc_request::RpcError::ForUser( - "unable to confirm transaction. \ - This can happen in situations such as transaction expiration \ - and insufficient fee-payer funds" - .to_string(), - ), - )) + // Get account metas required for the Handle instruction + let handle_account_metas = self.get_handle_account_metas(message).await?; + accounts.extend(handle_account_metas); + + let process_instruction = Instruction { + program_id: self.program_id, + data: ixn_data, + accounts, + }; + + Ok(process_instruction) } async fn get_inbox(&self) -> ChainResult> { @@ -429,6 +378,12 @@ impl SealevelMailbox { .into_inner(); Ok(inbox) } + + fn get_payer(&self) -> ChainResult<&Keypair> { + self.payer + .as_ref() + .ok_or_else(|| ChainCommunicationError::SignerUnavailable) + } } impl HyperlaneContract for SealevelMailbox { @@ -508,133 +463,42 @@ impl Mailbox for SealevelMailbox { metadata: &[u8], _tx_gas_limit: Option, ) -> ChainResult { - let recipient: Pubkey = message.recipient.0.into(); - let mut encoded_message = vec![]; - message.write_to(&mut encoded_message).unwrap(); - - let payer = self - .payer - .as_ref() - .ok_or_else(|| ChainCommunicationError::SignerUnavailable)?; - - let mut instructions = Vec::with_capacity(3); - // Set the compute unit limit. - instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( - PROCESS_COMPUTE_UNITS, - )); - - // If we're using Jito, we need to send a tip to the Jito fee account. - // Otherwise, we need to set the compute unit price. - if self.use_jito() { - let tip: u64 = std::env::var("JITO_TIP_LAMPORTS") - .ok() - .and_then(|s| s.parse::().ok()) - .unwrap_or(PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX); - - // The tip is a standalone transfer to a Jito fee account. - // See https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#sendbundle. - instructions.push(solana_sdk::system_instruction::transfer( - &payer.pubkey(), - // A random Jito fee account, taken from the getFeeAccount RPC response: - // https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#gettipaccounts - &solana_sdk::pubkey!("DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh"), - tip, - )); - } // "processed" level commitment does not guarantee finality. // roughly 5% of blocks end up on a dropped fork. // However we don't want this function to be a bottleneck and there already // is retry logic in the agents. let commitment = CommitmentConfig::processed(); - let (process_authority_key, _process_authority_bump) = Pubkey::try_find_program_address( - mailbox_process_authority_pda_seeds!(&recipient), - &self.program_id, - ) - .ok_or_else(|| { - ChainCommunicationError::from_other_str( - "Could not find program address for process authority", - ) - })?; - let (processed_message_account_key, _processed_message_account_bump) = - Pubkey::try_find_program_address( - mailbox_processed_message_pda_seeds!(message.id()), - &self.program_id, - ) - .ok_or_else(|| { - ChainCommunicationError::from_other_str( - "Could not find program address for processed message account", - ) - })?; + let process_instruction = self.get_process_instruction(message, metadata).await?; - // Get the account metas required for the recipient.InterchainSecurityModule instruction. - let ism_getter_account_metas = self.get_ism_getter_account_metas(recipient).await?; - - // Get the recipient ISM. - let ism = self - .get_recipient_ism(recipient, ism_getter_account_metas.clone()) - .await?; - - let ixn = - hyperlane_sealevel_mailbox::instruction::Instruction::InboxProcess(InboxProcess { - metadata: metadata.to_vec(), - message: encoded_message.clone(), - }); - let ixn_data = ixn - .into_instruction_data() - .map_err(ChainCommunicationError::from_other)?; - - // Craft the accounts for the transaction. - let mut accounts: Vec = vec![ - AccountMeta::new_readonly(payer.pubkey(), true), - AccountMeta::new_readonly(Pubkey::from_str(SYSTEM_PROGRAM).unwrap(), false), - AccountMeta::new(self.inbox.0, false), - AccountMeta::new_readonly(process_authority_key, false), - AccountMeta::new(processed_message_account_key, false), - ]; - accounts.extend(ism_getter_account_metas); - accounts.extend([ - AccountMeta::new_readonly(Pubkey::from_str(SPL_NOOP).unwrap(), false), - AccountMeta::new_readonly(ism, false), - ]); - - // Get the account metas required for the ISM.Verify instruction. - let ism_verify_account_metas = self - .get_ism_verify_account_metas(ism, metadata.into(), encoded_message) + let tx = self + .provider + .rpc() + .build_estimated_tx_for_instruction( + process_instruction, + self.get_payer()?, + &*self.tx_submitter, + &*self.priority_fee_oracle, + ) .await?; - accounts.extend(ism_verify_account_metas); - // The recipient. - accounts.extend([AccountMeta::new_readonly(recipient, false)]); + tracing::info!(?tx, "Created sealevel transaction to process message"); - // Get account metas required for the Handle instruction - let handle_account_metas = self.get_handle_account_metas(message).await?; - accounts.extend(handle_account_metas); + let signature = self.tx_submitter.send_transaction(&tx, true).await?; - let inbox_instruction = Instruction { - program_id: self.program_id, - data: ixn_data, - accounts, - }; - instructions.push(inbox_instruction); - let recent_blockhash = self - .rpc() - .get_latest_blockhash_with_commitment(commitment) - .await?; + tracing::info!(?tx, ?signature, "Sealevel transaction sent"); - let txn = Transaction::new_signed_with_payer( - &instructions, - Some(&payer.pubkey()), - &[payer], - recent_blockhash, - ); + let send_instant = std::time::Instant::now(); - tracing::info!(?txn, "Created sealevel transaction to process message"); + // Wait for the transaction to be confirmed. + self.rpc().wait_for_transaction_confirmation(&tx).await?; - let signature = self.send_and_confirm_transaction(&txn).await?; - - tracing::info!(?txn, ?signature, "Sealevel transaction sent"); + // We expect time_to_confirm to fluctuate depending on the commitment level when submitting the + // tx, but still use it as a proxy for tx latency to help debug. + tracing::info!(?tx, ?signature, time_to_confirm=?send_instant.elapsed(), "Sealevel transaction confirmed"); + // TODO: not sure if this actually checks if the transaction was executed / reverted? + // Confirm the transaction. let executed = self .rpc() .confirm_transaction_with_commitment(&signature, commitment) @@ -655,10 +519,30 @@ impl Mailbox for SealevelMailbox { #[instrument(err, ret, skip(self))] async fn process_estimate_costs( &self, - _message: &HyperlaneMessage, - _metadata: &[u8], + message: &HyperlaneMessage, + metadata: &[u8], ) -> ChainResult { - // TODO use correct data upon integrating IGP support + // Getting a process instruction in Sealevel is a pretty expensive operation + // that involves some view calls. Consider reusing the instruction with subsequent + // calls to `process` to avoid this cost. + let process_instruction = self.get_process_instruction(message, metadata).await?; + + // The returned costs are unused at the moment - we simply want to perform a simulation to + // determine if the message will revert or not. + let _ = self + .rpc() + .get_estimated_costs_for_instruction( + process_instruction, + self.get_payer()?, + &*self.tx_submitter, + &*self.priority_fee_oracle, + ) + .await?; + + // TODO use correct data upon integrating IGP support. + // NOTE: providing a real gas limit here will result in accurately enforcing + // gas payments. Be careful rolling this out to not impact existing contracts + // that may not be paying for super accurate gas amounts. Ok(TxCostEstimate { gas_limit: U256::zero(), gas_price: FixedPointNumber::zero(), diff --git a/rust/main/chains/hyperlane-sealevel/src/priority_fee.rs b/rust/main/chains/hyperlane-sealevel/src/priority_fee.rs new file mode 100644 index 0000000000..2df395cce6 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/priority_fee.rs @@ -0,0 +1,218 @@ +use async_trait::async_trait; +use derive_new::new; +use hyperlane_core::{ChainCommunicationError, ChainResult}; +use reqwest::Client; +use serde::Deserialize; +use solana_sdk::{bs58, transaction::Transaction}; + +use crate::{HeliusPriorityFeeLevel, HeliusPriorityFeeOracleConfig}; + +/// A trait for fetching the priority fee for a transaction. +#[async_trait] +pub trait PriorityFeeOracle: Send + Sync { + /// Fetch the priority fee in microlamports for a transaction. + async fn get_priority_fee(&self, transaction: &Transaction) -> ChainResult; +} + +/// A priority fee oracle that returns a constant fee. +#[derive(Debug, Clone, new)] +pub struct ConstantPriorityFeeOracle { + fee: u64, +} + +#[async_trait] +impl PriorityFeeOracle for ConstantPriorityFeeOracle { + async fn get_priority_fee(&self, _transaction: &Transaction) -> ChainResult { + Ok(self.fee) + } +} + +/// A priority fee oracle that fetches the fee from the Helius API. +/// https://docs.helius.dev/solana-apis/priority-fee-api +#[derive(Debug, Clone)] +pub struct HeliusPriorityFeeOracle { + client: Client, + config: HeliusPriorityFeeOracleConfig, +} + +impl HeliusPriorityFeeOracle { + pub fn new(config: HeliusPriorityFeeOracleConfig) -> Self { + Self { + client: reqwest::Client::new(), + config, + } + } + + fn get_priority_fee_estimate_options(&self) -> serde_json::Value { + // It's an odd interface, but if using the Recommended fee level, the API requires `recommended: true`, + // otherwise it requires `priorityLevel: ""`. + + let (key, value) = match &self.config.fee_level { + HeliusPriorityFeeLevel::Recommended => ("recommended", serde_json::json!(true)), + level => ("priorityLevel", serde_json::json!(level)), + }; + + serde_json::json!({ + key: value, + "transactionEncoding": "base58", + }) + } +} + +#[async_trait] +impl PriorityFeeOracle for HeliusPriorityFeeOracle { + async fn get_priority_fee(&self, transaction: &Transaction) -> ChainResult { + let base58_tx = bs58::encode( + bincode::serialize(transaction).map_err(ChainCommunicationError::from_other)?, + ) + .into_string(); + + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "id": "1", + "method": "getPriorityFeeEstimate", + "params": [ + { + "transaction": base58_tx, + "options": self.get_priority_fee_estimate_options(), + } + ], + }); + + let response = self + .client + .post(self.config.url.clone()) + .json(&request_body) + .send() + .await + .map_err(ChainCommunicationError::from_other)?; + + let response: JsonRpcResult = response + .json() + .await + .map_err(ChainCommunicationError::from_other)?; + + tracing::debug!(?response, "Fetched priority fee from Helius API"); + + let fee = response.result.priority_fee_estimate.round() as u64; + + Ok(fee) + } +} + +/// The result of a JSON-RPC request to the Helius API. +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct JsonRpcResult { + #[allow(dead_code)] + jsonrpc: String, + #[allow(dead_code)] + id: String, + result: T, +} + +/// The result of a `getPriorityFeeEstimate` request to the Helius API. +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +struct GetPriorityFeeEstimateResult { + priority_fee_estimate: f64, +} + +#[cfg(test)] +mod test { + use solana_sdk::{bs58, transaction::Transaction}; + + use crate::{ + priority_fee::{HeliusPriorityFeeOracle, PriorityFeeOracle}, + HeliusPriorityFeeLevel, HeliusPriorityFeeOracleConfig, + }; + + use super::{GetPriorityFeeEstimateResult, JsonRpcResult}; + + #[tokio::test] + async fn test_helius_get_priority_fee() { + let helius_url = if let Ok(url) = std::env::var("HELIUS_URL") { + url + } else { + // Skip test if HELIUS_URL is not set + return; + }; + + let oracle = super::HeliusPriorityFeeOracle::new(super::HeliusPriorityFeeOracleConfig { + url: url::Url::parse(&helius_url).unwrap(), + fee_level: super::HeliusPriorityFeeLevel::Medium, + }); + + // Example process transaction + // https://solscan.io/tx/W9fXtRD8mPkkUmuoLi9QxSCgFuy32rCVa8kfxtPjWXWRH2D1AWzuDEGuvexWGyWhQDXnEmaADZMeYu5RVjWZyAB + let process_tx_base58 = "BPBE2dE4sPJX3nm4svEZ181qBfX9yvUp5H67uTt3aqRGtC6a77hW5vrQk9zJ3KkNuK63KoJCeqp1kkFwsbF5KL1UHf5Hrj8GXpiRxmKD8NybEZUWhjdVW9azMxJdnxxiFqH7wFQtZGkQxhx6oJz1qi5Xc64LEbPJEwSTAp5US1VCnnhWGRqJ297kvS8hWaVLuUxr4jEqYNG2LSusXZmzABBqEvRv753PBxcKiBE2moo9VKZ8n3ai6rmQGnSzsoAfwnjCx6iUdNSWqpYFHcq2xhMXJx8US5kv837KsT5tKQBbujsWUoRGGJ8vkmm7RJSYyR3DYEMa5ira9fiDwnK5qP3EgP2hrG73YYBxZ9naRrYzHG2GiEGWEUgNPHaUtK3JsbjTLiNjyZU8ERTdMxi4rBLppREJfHDWYUNgN9hTL81LYv4YoJY3UUTQphzT268f6oZoiyavngb8t3Lq8pbyc3gPiw7AcWXmn2ERDAcHvS59AaoxxcwZyn8UWUdynwCzvNbWhb97qVHSzBY1S79sxHFuqyBhbbD5YhkMhFGLjPUEDvncxE2hLt9iQCQaEQzCNRMmnZw7yJ1YxoKDKfmUTXJ6rmT4p2pz7f8x4jJwQ2pC2YxobcfHrNvD7929vXSvpomyZmaEXYAN2bqGBUe2KazpnobVCwafjKMVN4AaTJRMTXi92VKuShuKJEuZo9ZM7TScEqRZC5hLFU8SbCdASEUoQjpDzivUf1m9gQtT2ob5FPwJzcuZpqTWgixd59BRHTB1L5c4fDvtYr1QJFpJRN4DsXGryK4eTMu2oAs3imGpg1rHRLpuBTbcrchEivz7bD17bBj8VeHogfkPcehD9yaHzmYPRF47aWZ52GSFSSpc5kJRRQyghUKNPFBnycLGAbfkRYDdVzUgdrr3CNYksJCu45TChg54tMWWwrqSD3k5RPv7A6bXbAH4PzW83vzE2vGJFYpwUgNEnjuA1rVnYJHXsFdWBrqrsz3UvdTs5kUxyoxjNNKvoXSaTeXMXEt1HUdmQ3sw1dW9wRkYdHwWzksM6n7P7MLnVY6qv3BVUpJiX4K355BXhMhyozzcBQX2vvyC7J8UxPBofMrBRVtbMsXmfp3sphos1pog6wpN2MiEaJqm6KK5yQguANnQzN8mK7MREkjYXtCnczf84CrcHqpp2onQUaR4TPn8zCPVAxY4HVkCoDWTwKj8Am9M4L3a7wmF37epgKnQuypTH7dqbJPRTALe7tndrtvJCuoTFP8wPXQXxvwnBPXeLmhK9E2mpskTA33KfqvVBu4R5SFYNtGoKbvuHaDf83Lf2xx1YPUogXuEWZMx5zcaHWMmvutpfdnPe3Rb7GL4hPVKj4t9MNgiAg3QbjaR9nqYBUPT4kUpxVCJWEadDVh5pgLwnkg4DJ5ArNfgH5"; + let process_tx_bytes = bs58::decode(process_tx_base58).into_vec().unwrap(); + let transaction: Transaction = bincode::deserialize(&process_tx_bytes).unwrap(); + + oracle.get_priority_fee(&transaction).await.unwrap(); + } + + #[test] + fn test_helius_get_priority_fee_estimate_options_ser() { + let get_oracle = |fee_level| { + HeliusPriorityFeeOracle::new(HeliusPriorityFeeOracleConfig { + url: url::Url::parse("http://localhost:8080").unwrap(), + fee_level, + }) + }; + + // When the fee level is Recommended, ensure `recommended` is set to true + let oracle = get_oracle(HeliusPriorityFeeLevel::Recommended); + + let options = oracle.get_priority_fee_estimate_options(); + let expected = serde_json::json!({ + "recommended": true, + "transactionEncoding": "base58", + }); + assert_eq!(options, expected); + + // When the fee level is not Recommended, ensure `priorityLevel` is set + let oracle = get_oracle(HeliusPriorityFeeLevel::Medium); + + let options = oracle.get_priority_fee_estimate_options(); + let expected = serde_json::json!({ + "priorityLevel": "Medium", + "transactionEncoding": "base58", + }); + assert_eq!(options, expected); + + // Ensure the serialization of HeliusPriorityFeeLevel is PascalCase, + // as required by the API https://docs.helius.dev/solana-apis/priority-fee-api#helius-priority-fee-api + let serialized = serde_json::json!([ + HeliusPriorityFeeLevel::Recommended, + HeliusPriorityFeeLevel::Min, + HeliusPriorityFeeLevel::Low, + HeliusPriorityFeeLevel::Medium, + HeliusPriorityFeeLevel::High, + HeliusPriorityFeeLevel::VeryHigh, + HeliusPriorityFeeLevel::UnsafeMax, + ]); + let expected = serde_json::json!([ + "Recommended", + "Min", + "Low", + "Medium", + "High", + "VeryHigh", + "UnsafeMax" + ]); + assert_eq!(serialized, expected); + } + + #[test] + fn test_helius_get_priority_fee_estimate_deser() { + let text = r#"{"jsonrpc":"2.0","result":{"priorityFeeEstimate":1000.0},"id":"1"}"#; + let response: JsonRpcResult = + serde_json::from_str(text).unwrap(); + + let expected = GetPriorityFeeEstimateResult { + priority_fee_estimate: 1000.0, + }; + assert_eq!(response.result, expected); + } +} diff --git a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs index 59adb671f3..22b44497c8 100644 --- a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs +++ b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs @@ -2,12 +2,18 @@ use base64::Engine; use borsh::{BorshDeserialize, BorshSerialize}; use serializable_account_meta::{SerializableAccountMeta, SimulationReturnData}; use solana_client::{ - nonblocking::rpc_client::RpcClient, rpc_config::RpcBlockConfig, - rpc_config::RpcProgramAccountsConfig, rpc_config::RpcTransactionConfig, rpc_response::Response, + nonblocking::rpc_client::RpcClient, + rpc_client::SerializableTransaction, + rpc_config::{ + RpcBlockConfig, RpcProgramAccountsConfig, RpcSendTransactionConfig, + RpcSimulateTransactionConfig, RpcTransactionConfig, + }, + rpc_response::{Response, RpcSimulateTransactionResult}, }; use solana_sdk::{ account::Account, commitment_config::CommitmentConfig, + compute_budget::ComputeBudgetInstruction, hash::Hash, instruction::{AccountMeta, Instruction}, message::Message, @@ -17,16 +23,27 @@ use solana_sdk::{ }; use solana_transaction_status::{ EncodedConfirmedTransactionWithStatusMeta, TransactionStatus, UiConfirmedBlock, - UiReturnDataEncoding, UiTransactionEncoding, UiTransactionReturnData, + UiReturnDataEncoding, UiTransactionEncoding, }; use hyperlane_core::{ChainCommunicationError, ChainResult, U256}; -use crate::error::HyperlaneSealevelError; +use crate::{ + error::HyperlaneSealevelError, priority_fee::PriorityFeeOracle, + tx_submitter::TransactionSubmitter, +}; + +pub struct SealevelTxCostEstimate { + compute_units: u32, + compute_unit_price_micro_lamports: u64, +} pub struct SealevelRpcClient(RpcClient); impl SealevelRpcClient { + /// The max amount of compute units for a transaction. + const MAX_COMPUTE_UNITS: u32 = 1_400_000; + pub fn new(rpc_endpoint: String) -> Self { Self(RpcClient::new_with_commitment( rpc_endpoint, @@ -199,16 +216,74 @@ impl SealevelRpcClient { .map_err(ChainCommunicationError::from_other) } - pub async fn send_and_confirm_transaction( + pub async fn send_transaction( &self, transaction: &Transaction, + skip_preflight: bool, ) -> ChainResult { self.0 - .send_and_confirm_transaction(transaction) + .send_transaction_with_config( + transaction, + RpcSendTransactionConfig { + skip_preflight, + ..Default::default() + }, + ) .await .map_err(ChainCommunicationError::from_other) } + /// Polls the RPC until the transaction is confirmed or the blockhash + /// expires. + /// Standalone logic stolen from Solana's non-blocking client, + /// decoupled from the sending of a transaction. + pub async fn wait_for_transaction_confirmation( + &self, + transaction: &impl SerializableTransaction, + ) -> ChainResult<()> { + let signature = transaction.get_signature(); + + const GET_STATUS_RETRIES: usize = usize::MAX; + + let recent_blockhash = if transaction.uses_durable_nonce() { + self.get_latest_blockhash_with_commitment(CommitmentConfig::processed()) + .await? + } else { + *transaction.get_recent_blockhash() + }; + + for status_retry in 0..GET_STATUS_RETRIES { + let signature_statuses: Response>> = + self.get_signature_statuses(&[*signature]).await?; + let signature_status = signature_statuses.value.first().cloned().flatten(); + match signature_status { + Some(_) => return Ok(()), + None => { + if !self.is_blockhash_valid(&recent_blockhash).await? { + // Block hash is not found by some reason + break; + } else if cfg!(not(test)) + // Ignore sleep at last step. + && status_retry < GET_STATUS_RETRIES + { + // Retry twice a second + tokio::time::sleep(std::time::Duration::from_millis(500)).await; + continue; + } + } + } + } + + Err(ChainCommunicationError::from_other( + solana_client::rpc_request::RpcError::ForUser( + "unable to confirm transaction. \ + This can happen in situations such as transaction expiration \ + and insufficient fee-payer funds" + .to_string(), + ), + )) + } + /// Simulates an instruction, and attempts to deserialize it into a T. /// If no return data at all was returned, returns Ok(None). /// If some return data was returned but deserialization was unsuccessful, @@ -227,9 +302,9 @@ impl SealevelRpcClient { Some(&payer.pubkey()), &recent_blockhash, )); - let return_data = self.simulate_transaction(&transaction).await?; + let simulation = self.simulate_transaction(&transaction).await?; - if let Some(return_data) = return_data { + if let Some(return_data) = simulation.return_data { let bytes = match return_data.data.1 { UiReturnDataEncoding::Base64 => base64::engine::general_purpose::STANDARD .decode(return_data.data.0) @@ -245,19 +320,176 @@ impl SealevelRpcClient { Ok(None) } - async fn simulate_transaction( + pub async fn simulate_transaction( &self, transaction: &Transaction, - ) -> ChainResult> { - let return_data = self + ) -> ChainResult { + let result = self .0 - .simulate_transaction(transaction) + .simulate_transaction_with_config( + transaction, + RpcSimulateTransactionConfig { + sig_verify: false, + replace_recent_blockhash: true, + ..Default::default() + }, + ) .await .map_err(ChainCommunicationError::from_other)? - .value - .return_data; + .value; + + Ok(result) + } + + /// Gets the estimated costs for a given instruction. + pub async fn get_estimated_costs_for_instruction( + &self, + instruction: Instruction, + payer: &Keypair, + tx_submitter: &dyn TransactionSubmitter, + priority_fee_oracle: &dyn PriorityFeeOracle, + ) -> ChainResult { + // Build a transaction that sets the max compute units and a dummy compute unit price. + // This is used for simulation to get the actual compute unit limit. We set dummy values + // for the compute unit limit and price because we want to include the instructions that + // set these in the cost estimate. + let simulation_tx = self + .create_transaction_for_instruction( + Self::MAX_COMPUTE_UNITS, + 0, + instruction.clone(), + payer, + tx_submitter, + false, + ) + .await?; + + let simulation_result = self.simulate_transaction(&simulation_tx).await?; + + // If there was an error in the simulation result, return an error. + if simulation_result.err.is_some() { + tracing::error!(?simulation_result, "Got simulation result for transaction"); + return Err(ChainCommunicationError::from_other_str( + format!("Error in simulation result: {:?}", simulation_result.err).as_str(), + )); + } else { + tracing::debug!(?simulation_result, "Got simulation result for transaction"); + } + + // Get the compute units used in the simulation result, requiring + // that it is greater than 0. + let simulation_compute_units: u32 = simulation_result + .units_consumed + .unwrap_or_default() + .try_into() + .map_err(ChainCommunicationError::from_other)?; + if simulation_compute_units == 0 { + return Err(ChainCommunicationError::from_other_str( + "Empty or zero compute units returned in simulation result", + )); + } + + // Bump the compute units by 10% to ensure we have enough, but cap it at the max. + let simulation_compute_units = + Self::MAX_COMPUTE_UNITS.min((simulation_compute_units * 11) / 10); + + let priority_fee = priority_fee_oracle.get_priority_fee(&simulation_tx).await?; + + Ok(SealevelTxCostEstimate { + compute_units: simulation_compute_units, + compute_unit_price_micro_lamports: priority_fee, + }) + } + + /// Builds a transaction with estimated costs for a given instruction. + pub async fn build_estimated_tx_for_instruction( + &self, + instruction: Instruction, + payer: &Keypair, + tx_submitter: &dyn TransactionSubmitter, + priority_fee_oracle: &dyn PriorityFeeOracle, + ) -> ChainResult { + // Get the estimated costs for the instruction. + let SealevelTxCostEstimate { + compute_units, + compute_unit_price_micro_lamports, + } = self + .get_estimated_costs_for_instruction( + instruction.clone(), + payer, + tx_submitter, + priority_fee_oracle, + ) + .await?; + + tracing::info!( + ?compute_units, + ?compute_unit_price_micro_lamports, + "Got compute units and compute unit price / priority fee for transaction" + ); + + // Build the final transaction with the correct compute unit limit and price. + let tx = self + .create_transaction_for_instruction( + compute_units, + compute_unit_price_micro_lamports, + instruction, + payer, + tx_submitter, + true, + ) + .await?; + + Ok(tx) + } + + /// Creates a transaction for a given instruction, compute unit limit, and compute unit price. + /// If `sign` is true, the transaction will be signed. + pub async fn create_transaction_for_instruction( + &self, + compute_unit_limit: u32, + compute_unit_price_micro_lamports: u64, + instruction: Instruction, + payer: &Keypair, + tx_submitter: &dyn TransactionSubmitter, + sign: bool, + ) -> ChainResult { + let instructions = vec![ + // Set the compute unit limit. + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + // Set the priority fee / tip + tx_submitter.get_priority_fee_instruction( + compute_unit_price_micro_lamports, + compute_unit_limit.into(), + &payer.pubkey(), + ), + instruction, + ]; + + let tx = if sign { + // Getting the finalized blockhash eliminates the chance the blockhash + // gets reorged out, causing the tx to be invalid. The tradeoff is this + // will cause the tx to expire in about 47 seconds (instead of the typical 60). + let recent_blockhash = self + .get_latest_blockhash_with_commitment(CommitmentConfig::finalized()) + .await + .map_err(ChainCommunicationError::from_other)?; + + Transaction::new_signed_with_payer( + &instructions, + Some(&payer.pubkey()), + &[payer], + recent_blockhash, + ) + } else { + Transaction::new_unsigned(Message::new(&instructions, Some(&payer.pubkey()))) + }; + + Ok(tx) + } - Ok(return_data) + pub fn url(&self) -> String { + self.0.url() } } diff --git a/rust/main/chains/hyperlane-sealevel/src/trait_builder.rs b/rust/main/chains/hyperlane-sealevel/src/trait_builder.rs index e0b7c5cb37..13cc0b90a4 100644 --- a/rust/main/chains/hyperlane-sealevel/src/trait_builder.rs +++ b/rust/main/chains/hyperlane-sealevel/src/trait_builder.rs @@ -1,6 +1,12 @@ use hyperlane_core::{config::OperationBatchConfig, ChainCommunicationError, NativeToken}; +use serde::Serialize; use url::Url; +use crate::{ + priority_fee::{ConstantPriorityFeeOracle, HeliusPriorityFeeOracle, PriorityFeeOracle}, + tx_submitter::{JitoTransactionSubmitter, RpcTransactionSubmitter, TransactionSubmitter}, +}; + /// Sealevel connection configuration #[derive(Debug, Clone)] pub struct ConnectionConf { @@ -10,6 +16,10 @@ pub struct ConnectionConf { pub operation_batch: OperationBatchConfig, /// Native token and its denomination pub native_token: NativeToken, + /// Priority fee oracle configuration + pub priority_fee_oracle: PriorityFeeOracleConfig, + /// Transaction submitter configuration + pub transaction_submitter: TransactionSubmitterConfig, } /// An error type when parsing a connection configuration. @@ -23,6 +33,106 @@ pub enum ConnectionConfError { InvalidConnectionUrl(String, url::ParseError), } +/// Configuration to of how the priority fee should be determined +#[derive(Debug, Clone)] +pub enum PriorityFeeOracleConfig { + /// A constant value, in micro lamports + Constant(u64), + /// A Helius priority fee oracle + Helius(HeliusPriorityFeeOracleConfig), +} + +impl Default for PriorityFeeOracleConfig { + fn default() -> Self { + PriorityFeeOracleConfig::Constant(0) + } +} + +impl PriorityFeeOracleConfig { + /// Create a new priority fee oracle from the configuration + pub fn create_oracle(&self) -> Box { + match self { + PriorityFeeOracleConfig::Constant(fee) => { + Box::new(ConstantPriorityFeeOracle::new(*fee)) + } + PriorityFeeOracleConfig::Helius(config) => { + Box::new(HeliusPriorityFeeOracle::new(config.clone())) + } + } + } +} + +/// Configuration for the Helius priority fee oracle +#[derive(Debug, Clone)] +pub struct HeliusPriorityFeeOracleConfig { + /// The Helius URL to use + pub url: Url, + /// The fee level to use + pub fee_level: HeliusPriorityFeeLevel, +} + +/// The priority fee level to use +#[derive(Debug, Clone, Serialize, Default)] +pub enum HeliusPriorityFeeLevel { + /// 50th percentile, but a floor of 10k microlamports. + /// The floor results in a staked Helius connection being used. (https://docs.helius.dev/guides/sending-transactions-on-solana#staked-connections) + #[default] + Recommended, + /// 0th percentile + Min, + /// 10th percentile + Low, + /// 50th percentile + Medium, + /// 75th percentile + High, + /// 90th percentile + VeryHigh, + /// 100th percentile + UnsafeMax, +} + +/// Configuration for the transaction submitter +#[derive(Debug, Clone)] +pub enum TransactionSubmitterConfig { + /// Use the RPC transaction submitter + Rpc { + /// The URL to use. If not provided, a default RPC URL will be used + url: Option, + }, + /// Use the Jito transaction submitter + Jito { + /// The URL to use. If not provided, a default Jito URL will be used + url: Option, + }, +} + +impl Default for TransactionSubmitterConfig { + fn default() -> Self { + TransactionSubmitterConfig::Rpc { url: None } + } +} + +impl TransactionSubmitterConfig { + /// Create a new transaction submitter from the configuration + pub fn create_submitter(&self, default_rpc_url: String) -> Box { + match self { + TransactionSubmitterConfig::Rpc { url } => Box::new(RpcTransactionSubmitter::new( + url.clone().unwrap_or(default_rpc_url), + )), + TransactionSubmitterConfig::Jito { url } => { + // Default to a bundle-only URL (i.e. revert protected) + Box::new(JitoTransactionSubmitter::new(url.clone().unwrap_or_else( + || { + "https://mainnet.block-engine.jito.wtf/api/v1/transactions?bundleOnly=true" + .to_string() + }, + ))) + } + } + } +} + #[derive(thiserror::Error, Debug)] #[error(transparent)] struct SealevelNewConnectionError(#[from] anyhow::Error); diff --git a/rust/main/chains/hyperlane-sealevel/src/tx_submitter.rs b/rust/main/chains/hyperlane-sealevel/src/tx_submitter.rs new file mode 100644 index 0000000000..c7468d0f24 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/tx_submitter.rs @@ -0,0 +1,115 @@ +use async_trait::async_trait; +use hyperlane_core::ChainResult; +use solana_sdk::{ + compute_budget::ComputeBudgetInstruction, instruction::Instruction, pubkey::Pubkey, + signature::Signature, transaction::Transaction, +}; + +use crate::SealevelRpcClient; + +/// A trait for submitting transactions to the chain. +#[async_trait] +pub trait TransactionSubmitter: Send + Sync { + /// Get the instruction to set the compute unit price. + fn get_priority_fee_instruction( + &self, + compute_unit_price_micro_lamports: u64, + compute_units: u64, + payer: &Pubkey, + ) -> Instruction; + + /// Send a transaction to the chain. + async fn send_transaction( + &self, + transaction: &Transaction, + skip_preflight: bool, + ) -> ChainResult; +} + +/// A transaction submitter that uses the vanilla RPC to submit transactions. +#[derive(Debug)] +pub struct RpcTransactionSubmitter { + rpc_client: SealevelRpcClient, +} + +impl RpcTransactionSubmitter { + pub fn new(url: String) -> Self { + Self { + rpc_client: SealevelRpcClient::new(url), + } + } +} + +#[async_trait] +impl TransactionSubmitter for RpcTransactionSubmitter { + fn get_priority_fee_instruction( + &self, + compute_unit_price_micro_lamports: u64, + _compute_units: u64, + _payer: &Pubkey, + ) -> Instruction { + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price_micro_lamports) + } + + async fn send_transaction( + &self, + transaction: &Transaction, + skip_preflight: bool, + ) -> ChainResult { + self.rpc_client + .send_transaction(transaction, skip_preflight) + .await + } +} + +/// A transaction submitter that uses the Jito API to submit transactions. +#[derive(Debug)] +pub struct JitoTransactionSubmitter { + rpc_client: SealevelRpcClient, +} + +impl JitoTransactionSubmitter { + /// The minimum tip to include in a transaction. + /// From https://docs.jito.wtf/lowlatencytxnsend/#sendtransaction + const MINIMUM_TIP_LAMPORTS: u64 = 1000; + + pub fn new(url: String) -> Self { + Self { + rpc_client: SealevelRpcClient::new(url), + } + } +} + +#[async_trait] +impl TransactionSubmitter for JitoTransactionSubmitter { + fn get_priority_fee_instruction( + &self, + compute_unit_price_micro_lamports: u64, + compute_units: u64, + payer: &Pubkey, + ) -> Instruction { + // Divide by 1_000_000 to convert from microlamports to lamports. + let tip_lamports = (compute_units * compute_unit_price_micro_lamports) / 1_000_000; + let tip_lamports = tip_lamports.max(Self::MINIMUM_TIP_LAMPORTS); + + // The tip is a standalone transfer to a Jito fee account. + // See https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#sendbundle. + solana_sdk::system_instruction::transfer( + payer, + // A random Jito fee account, taken from the getFeeAccount RPC response: + // https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#gettipaccounts + &solana_sdk::pubkey!("DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh"), + tip_lamports, + ) + } + + async fn send_transaction( + &self, + transaction: &Transaction, + skip_preflight: bool, + ) -> ChainResult { + self.rpc_client + .send_transaction(transaction, skip_preflight) + .await + } +} diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 5b465b90cf..e7704ff783 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -785,7 +785,7 @@ "index": { "from": 1, "mode": "sequence", - "chunk": 100 + "chunk": 20 }, "interchainGasPaymaster": "ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK", "mailbox": "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", @@ -2762,7 +2762,8 @@ "gasCurrencyCoinGeckoId": "sei-network", "gnosisSafeTransactionServiceUrl": "https://transaction.sei-safe.protofire.io", "index": { - "from": 80809403 + "from": 80809403, + "chunk": 1000 }, "interchainAccountIsm": "0xf35dc7B9eE4Ebf0cd3546Bd6EE3b403dE2b9F5D6", "interchainAccountRouter": "0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5", @@ -2828,7 +2829,7 @@ "index": { "from": 1, "mode": "sequence", - "chunk": 100 + "chunk": 20 }, "interchainGasPaymaster": "JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M", "mailbox": "E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi", diff --git a/rust/main/helm/hyperlane-agent/templates/external-secret.yaml b/rust/main/helm/hyperlane-agent/templates/external-secret.yaml index 9be0700b75..f3a6980d21 100644 --- a/rust/main/helm/hyperlane-agent/templates/external-secret.yaml +++ b/rust/main/helm/hyperlane-agent/templates/external-secret.yaml @@ -30,6 +30,14 @@ spec: {{- if eq .protocol "cosmos" }} HYP_CHAINS_{{ .name | upper }}_CUSTOMGRPCURLS: {{ printf "'{{ .%s_grpcs | mustFromJson | join \",\" }}'" .name }} {{- end }} + {{- if eq .protocol "sealevel" }} + {{- if eq ((.priorityFeeOracle).type) "helius" }} + HYP_CHAINS_{{ .name | upper }}_PRIORITYFEEORACLE_URL: {{ printf "'{{ .%s_helius }}'" .name }} + {{- end }} + {{- if eq ((.transactionSubmitter).url) "helius" }} + HYP_CHAINS_{{ .name | upper }}_TRANSACTIONSUBMITTER_URL: {{ printf "'{{ .%s_helius }}'" .name }} + {{- end }} + {{- end }} {{- end }} data: {{- /* @@ -45,4 +53,9 @@ spec: remoteRef: key: {{ printf "%s-grpc-endpoints-%s" $.Values.hyperlane.runEnv .name }} {{- end }} + {{- if and (eq .protocol "sealevel") (or (eq ((.priorityFeeOracle).type) "helius") (eq ((.transactionSubmitter).url) "helius")) }} + - secretKey: {{ printf "%s_helius" .name }} + remoteRef: + key: {{ printf "%s-rpc-endpoint-helius-%s" $.Values.hyperlane.runEnv .name }} + {{- end }} {{- end }} diff --git a/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml b/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml index da69543d8e..47be9ad2e9 100644 --- a/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml +++ b/rust/main/helm/hyperlane-agent/templates/relayer-statefulset.yaml @@ -17,7 +17,9 @@ spec: metadata: annotations: checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/external-secret: {{ include (print $.Template.BasePath "/external-secret.yaml") . | sha256sum }} checksum/relayer-configmap: {{ include (print $.Template.BasePath "/relayer-configmap.yaml") . | sha256sum }} + checksum/relayer-external-secret: {{ include (print $.Template.BasePath "/relayer-external-secret.yaml") . | sha256sum }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }} diff --git a/rust/main/helm/hyperlane-agent/templates/scraper-statefulset.yaml b/rust/main/helm/hyperlane-agent/templates/scraper-statefulset.yaml index 06326e260c..1b419e1123 100644 --- a/rust/main/helm/hyperlane-agent/templates/scraper-statefulset.yaml +++ b/rust/main/helm/hyperlane-agent/templates/scraper-statefulset.yaml @@ -17,6 +17,8 @@ spec: metadata: annotations: checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/external-secret: {{ include (print $.Template.BasePath "/external-secret.yaml") . | sha256sum }} + checksum/scraper-external-secret: {{ include (print $.Template.BasePath "/scraper-external-secret.yaml") . | sha256sum }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }} diff --git a/rust/main/helm/hyperlane-agent/templates/validator-statefulset.yaml b/rust/main/helm/hyperlane-agent/templates/validator-statefulset.yaml index 1b0a87dd41..b5929bfd99 100644 --- a/rust/main/helm/hyperlane-agent/templates/validator-statefulset.yaml +++ b/rust/main/helm/hyperlane-agent/templates/validator-statefulset.yaml @@ -17,7 +17,9 @@ spec: metadata: annotations: checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/external-secret: {{ include (print $.Template.BasePath "/external-secret.yaml") . | sha256sum }} checksum/validator-configmap: {{ include (print $.Template.BasePath "/validator-configmap.yaml") . | sha256sum }} + checksum/scraper-external-secret: {{ include (print $.Template.BasePath "/scraper-external-secret.yaml") . | sha256sum }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }} diff --git a/rust/main/hyperlane-base/src/settings/parser/connection_parser.rs b/rust/main/hyperlane-base/src/settings/parser/connection_parser.rs index 70e1b81835..b3f91ee88e 100644 --- a/rust/main/hyperlane-base/src/settings/parser/connection_parser.rs +++ b/rust/main/hyperlane-base/src/settings/parser/connection_parser.rs @@ -1,4 +1,7 @@ use eyre::eyre; +use hyperlane_sealevel::{ + HeliusPriorityFeeLevel, HeliusPriorityFeeOracleConfig, PriorityFeeOracleConfig, +}; use url::Url; use h_eth::TransactionOverrides; @@ -162,12 +165,24 @@ fn build_sealevel_connection_conf( chain: &ValueParser, err: &mut ConfigParsingError, operation_batch: OperationBatchConfig, -) -> h_sealevel::ConnectionConf { +) -> Option { + let mut local_err = ConfigParsingError::default(); + let native_token = parse_native_token(chain, err, 9); - h_sealevel::ConnectionConf { - url: url.clone(), - operation_batch, - native_token, + let priority_fee_oracle = parse_sealevel_priority_fee_oracle_config(chain, &mut local_err); + let transaction_submitter = parse_transaction_submitter_config(chain, &mut local_err); + + if !local_err.is_ok() { + err.merge(local_err); + None + } else { + Some(ChainConnectionConf::Sealevel(h_sealevel::ConnectionConf { + url: url.clone(), + operation_batch, + native_token, + priority_fee_oracle: priority_fee_oracle.unwrap(), + transaction_submitter: transaction_submitter.unwrap(), + })) } } @@ -196,6 +211,147 @@ fn parse_native_token( } } +fn parse_sealevel_priority_fee_oracle_config( + chain: &ValueParser, + err: &mut ConfigParsingError, +) -> Option { + let value_parser = chain.chain(err).get_opt_key("priorityFeeOracle").end(); + + let priority_fee_oracle = if let Some(value_parser) = value_parser { + let oracle_type = value_parser + .chain(err) + .get_key("type") + .parse_string() + .end() + .or_else(|| { + err.push( + &value_parser.cwp + "type", + eyre!("Missing priority fee oracle type"), + ); + None + }) + .unwrap_or_default(); + + match oracle_type { + "constant" => { + let fee = value_parser + .chain(err) + .get_key("fee") + .parse_u64() + .end() + .unwrap_or(0); + Some(PriorityFeeOracleConfig::Constant(fee)) + } + "helius" => { + let fee_level = parse_helius_priority_fee_level(&value_parser, err); + if !err.is_ok() { + return None; + } + let config = HeliusPriorityFeeOracleConfig { + url: value_parser + .chain(err) + .get_key("url") + .parse_from_str("Invalid url") + .end() + .unwrap(), + fee_level: fee_level.unwrap(), + }; + Some(PriorityFeeOracleConfig::Helius(config)) + } + _ => { + err.push( + &value_parser.cwp + "type", + eyre!("Unknown priority fee oracle type"), + ); + None + } + } + } else { + // If not specified at all, use default + Some(PriorityFeeOracleConfig::default()) + }; + + priority_fee_oracle +} + +fn parse_helius_priority_fee_level( + value_parser: &ValueParser, + err: &mut ConfigParsingError, +) -> Option { + let level = value_parser + .chain(err) + .get_opt_key("feeLevel") + .parse_string() + .end(); + + if let Some(level) = level { + match level.to_lowercase().as_str() { + "recommended" => Some(HeliusPriorityFeeLevel::Recommended), + "min" => Some(HeliusPriorityFeeLevel::Min), + "low" => Some(HeliusPriorityFeeLevel::Low), + "medium" => Some(HeliusPriorityFeeLevel::Medium), + "high" => Some(HeliusPriorityFeeLevel::High), + "veryhigh" => Some(HeliusPriorityFeeLevel::VeryHigh), + "unsafemax" => Some(HeliusPriorityFeeLevel::UnsafeMax), + _ => { + err.push( + &value_parser.cwp + "feeLevel", + eyre!("Unknown priority fee level"), + ); + None + } + } + } else { + // If not specified at all, use the default + Some(HeliusPriorityFeeLevel::default()) + } +} + +fn parse_transaction_submitter_config( + chain: &ValueParser, + err: &mut ConfigParsingError, +) -> Option { + let submitter_type = chain + .chain(err) + .get_opt_key("transactionSubmitter") + .get_opt_key("type") + .parse_string() + .end(); + + if let Some(submitter_type) = submitter_type { + match submitter_type.to_lowercase().as_str() { + "rpc" => { + let url = chain + .chain(err) + .get_opt_key("transactionSubmitter") + .get_opt_key("url") + .parse_from_str("Invalid url") + .end(); + Some(h_sealevel::TransactionSubmitterConfig::Rpc { url }) + } + "jito" => { + let url = chain + .chain(err) + .get_opt_key("transactionSubmitter") + .get_opt_key("url") + .parse_from_str("Invalid url") + .end(); + Some(h_sealevel::TransactionSubmitterConfig::Jito { url }) + } + _ => { + err.push( + &chain.cwp + "transactionSubmitter.type", + eyre!("Unknown transaction submitter type"), + ); + None + } + } + } else { + // If not specified at all, use default + Some(h_sealevel::TransactionSubmitterConfig::default()) + } +} + pub fn build_connection_conf( domain_protocol: HyperlaneDomainProtocol, rpcs: &[Url], @@ -216,14 +372,10 @@ pub fn build_connection_conf( .iter() .next() .map(|url| ChainConnectionConf::Fuel(h_fuel::ConnectionConf { url: url.clone() })), - HyperlaneDomainProtocol::Sealevel => rpcs.iter().next().map(|url| { - ChainConnectionConf::Sealevel(build_sealevel_connection_conf( - url, - chain, - err, - operation_batch, - )) - }), + HyperlaneDomainProtocol::Sealevel => rpcs + .iter() + .next() + .and_then(|url| build_sealevel_connection_conf(url, chain, err, operation_batch)), HyperlaneDomainProtocol::Cosmos => { build_cosmos_connection_conf(rpcs, chain, err, operation_batch) } diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 3756344809..f81a40bea3 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -1,4 +1,10 @@ import { + AgentSealevelHeliusFeeLevel, + AgentSealevelPriorityFeeOracle, + AgentSealevelPriorityFeeOracleType, + AgentSealevelTransactionSubmitter, + AgentSealevelTransactionSubmitterType, + ChainName, GasPaymentEnforcement, GasPaymentEnforcementPolicyType, MatchingList, @@ -7,6 +13,7 @@ import { import { AgentChainConfig, + HELIUS_SECRET_URL_MARKER, RootAgentConfig, getAgentChainNamesFromConfig, } from '../../../src/config/agent/agent.js'; @@ -396,6 +403,43 @@ export const hyperlaneContextAgentChainNames = getAgentChainNamesFromConfig( mainnet3SupportedChainNames, ); +const sealevelPriorityFeeOracleConfigGetter = ( + chain: ChainName, +): AgentSealevelPriorityFeeOracle => { + // Special case for Solana mainnet + if (chain === 'solanamainnet') { + return { + type: AgentSealevelPriorityFeeOracleType.Helius, + feeLevel: AgentSealevelHeliusFeeLevel.Recommended, + // URL is auto populated by the external secrets in the helm chart + url: '', + }; + } + + // For all other chains, we use the constant fee oracle with a fee of 0 + return { + type: AgentSealevelPriorityFeeOracleType.Constant, + fee: '0', + }; +}; + +const sealevelTransactionSubmitterConfigGetter = ( + chain: ChainName, +): AgentSealevelTransactionSubmitter => { + // Special case for Solana mainnet + if (chain === 'solanamainnet') { + return { + type: AgentSealevelTransactionSubmitterType.Rpc, + url: HELIUS_SECRET_URL_MARKER, + }; + } + + // For all other chains, use the default RPC transaction submitter + return { + type: AgentSealevelTransactionSubmitterType.Rpc, + }; +}; + const contextBase = { namespace: environment, runEnv: environment, @@ -403,6 +447,10 @@ const contextBase = { aws: { region: 'us-east-1', }, + sealevel: { + priorityFeeOracleConfigGetter: sealevelPriorityFeeOracleConfigGetter, + transactionSubmitterConfigGetter: sealevelTransactionSubmitterConfigGetter, + }, } as const; const gasPaymentEnforcement: GasPaymentEnforcement[] = [ diff --git a/typescript/infra/src/agents/index.ts b/typescript/infra/src/agents/index.ts index b7be0e0098..24fccbac07 100644 --- a/typescript/infra/src/agents/index.ts +++ b/typescript/infra/src/agents/index.ts @@ -1,8 +1,14 @@ import fs from 'fs'; import { join } from 'path'; -import { ChainName, RelayerConfig, RpcConsensusType } from '@hyperlane-xyz/sdk'; -import { objOmitKeys } from '@hyperlane-xyz/utils'; +import { + AgentSealevelPriorityFeeOracle, + AgentSealevelTransactionSubmitter, + ChainName, + RelayerConfig, + RpcConsensusType, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType, objOmitKeys } from '@hyperlane-xyz/utils'; import { Contexts } from '../../config/contexts.js'; import { getChain } from '../../config/registry.js'; @@ -87,12 +93,33 @@ export abstract class AgentHelmManager extends HelmManager if (reorgPeriod === undefined) { throw new Error(`No reorg period found for chain ${chain}`); } + + let priorityFeeOracle: AgentSealevelPriorityFeeOracle | undefined; + if (getChain(chain).protocol === ProtocolType.Sealevel) { + priorityFeeOracle = + this.config.rawConfig.sealevel?.priorityFeeOracleConfigGetter?.( + chain, + ); + } + + let transactionSubmitter: + | AgentSealevelTransactionSubmitter + | undefined; + if (getChain(chain).protocol === ProtocolType.Sealevel) { + transactionSubmitter = + this.config.rawConfig.sealevel?.transactionSubmitterConfigGetter?.( + chain, + ); + } + return { name: chain, rpcConsensusType: this.rpcConsensusType(chain), protocol: metadata.protocol, blocks: { reorgPeriod }, maxBatchSize: 32, + priorityFeeOracle, + transactionSubmitter, }; }), }, diff --git a/typescript/infra/src/config/agent/agent.ts b/typescript/infra/src/config/agent/agent.ts index 987a05f0ea..7d2dbe54b6 100644 --- a/typescript/infra/src/config/agent/agent.ts +++ b/typescript/infra/src/config/agent/agent.ts @@ -1,5 +1,7 @@ import { AgentChainMetadata, + AgentSealevelPriorityFeeOracle, + AgentSealevelTransactionSubmitter, AgentSignerAwsKey, AgentSignerKeyType, ChainName, @@ -85,8 +87,21 @@ export interface AgentContextConfig extends AgentEnvConfig { rolesWithKeys: Role[]; // Names of chains this context cares about (subset of environmentChainNames) contextChainNames: AgentChainNames; + sealevel?: SealevelAgentConfig; } +export interface SealevelAgentConfig { + priorityFeeOracleConfigGetter?: ( + chain: ChainName, + ) => AgentSealevelPriorityFeeOracle; + transactionSubmitterConfigGetter?: ( + chain: ChainName, + ) => AgentSealevelTransactionSubmitter; +} + +// An ugly way to mark a URL as a the secret Helius URL when Helm templating +export const HELIUS_SECRET_URL_MARKER = 'helius'; + // incomplete common agent configuration for a role interface AgentRoleConfig { // K8s-specific diff --git a/typescript/infra/src/utils/helm.ts b/typescript/infra/src/utils/helm.ts index 855393473a..4ed4cb478f 100644 --- a/typescript/infra/src/utils/helm.ts +++ b/typescript/infra/src/utils/helm.ts @@ -13,12 +13,13 @@ export enum HelmCommand { } export function helmifyValues(config: any, prefix?: string): string[] { + if (config === null || config === undefined) { + return []; + } + if (typeof config !== 'object') { // Helm incorrectly splits on unescaped commas. - const value = - config !== undefined - ? JSON.stringify(config).replaceAll(',', '\\,') - : undefined; + const value = JSON.stringify(config).replaceAll(',', '\\,'); return [`--set ${prefix}=${value}`]; } diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index dd94504fcd..87e524110e 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -209,6 +209,12 @@ export { AgentCosmosGasPrice, AgentLogFormat, AgentLogLevel, + AgentSealevelChainMetadata, + AgentSealevelHeliusFeeLevel, + AgentSealevelPriorityFeeOracle, + AgentSealevelPriorityFeeOracleType, + AgentSealevelTransactionSubmitter, + AgentSealevelTransactionSubmitterType, AgentSigner, AgentSignerAwsKey, AgentSignerHexKey, diff --git a/typescript/sdk/src/metadata/agentConfig.ts b/typescript/sdk/src/metadata/agentConfig.ts index cb570e29eb..9ff999c0dc 100644 --- a/typescript/sdk/src/metadata/agentConfig.ts +++ b/typescript/sdk/src/metadata/agentConfig.ts @@ -51,6 +51,26 @@ export enum AgentSignerKeyType { Cosmos = 'cosmosKey', } +export enum AgentSealevelPriorityFeeOracleType { + Helius = 'helius', + Constant = 'constant', +} + +export enum AgentSealevelHeliusFeeLevel { + Recommended = 'recommended', + Min = 'min', + Low = 'low', + Medium = 'medium', + High = 'high', + VeryHigh = 'veryHigh', + UnsafeMax = 'unsafeMax', +} + +export enum AgentSealevelTransactionSubmitterType { + Rpc = 'rpc', + Jito = 'jito', +} + const AgentSignerHexKeySchema = z .object({ type: z.literal(AgentSignerKeyType.Hex).optional(), @@ -120,6 +140,40 @@ export type AgentCosmosGasPrice = z.infer< typeof AgentCosmosChainMetadataSchema >['gasPrice']; +const AgentSealevelChainMetadataSchema = z.object({ + priorityFeeOracle: z + .union([ + z.object({ + type: z.literal(AgentSealevelPriorityFeeOracleType.Helius), + url: z.string(), + // TODO add options + feeLevel: z.nativeEnum(AgentSealevelHeliusFeeLevel), + }), + z.object({ + type: z.literal(AgentSealevelPriorityFeeOracleType.Constant), + // In microlamports + fee: ZUWei, + }), + ]) + .optional(), + transactionSubmitter: z + .object({ + type: z.nativeEnum(AgentSealevelTransactionSubmitterType), + url: z.string().optional(), + }) + .optional(), +}); + +export type AgentSealevelChainMetadata = z.infer< + typeof AgentSealevelChainMetadataSchema +>; + +export type AgentSealevelPriorityFeeOracle = + AgentSealevelChainMetadata['priorityFeeOracle']; + +export type AgentSealevelTransactionSubmitter = + AgentSealevelChainMetadata['transactionSubmitter']; + export const AgentChainMetadataSchema = ChainMetadataSchemaObject.merge( HyperlaneDeploymentArtifactsSchema, ) @@ -155,6 +209,7 @@ export const AgentChainMetadataSchema = ChainMetadataSchemaObject.merge( .optional(), }) .merge(AgentCosmosChainMetadataSchema.partial()) + .merge(AgentSealevelChainMetadataSchema.partial()) .refine((metadata) => { // Make sure that the signer is valid for the protocol @@ -201,6 +256,13 @@ export const AgentChainMetadataSchema = ChainMetadataSchemaObject.merge( } } + // If the protocol type is Sealevel, require everything in AgentSealevelChainMetadataSchema + if (metadata.protocol === ProtocolType.Sealevel) { + if (!AgentSealevelChainMetadataSchema.safeParse(metadata).success) { + return false; + } + } + return true; }); From 7dfcc60a96416088a4c21d192104e2ecad947787 Mon Sep 17 00:00:00 2001 From: Mohammed Hussan Date: Tue, 24 Dec 2024 14:20:32 +0000 Subject: [PATCH 08/81] feat(warpMonitor): Always use collateral token symbol for building warp routes id (#5045) ### Description - We are introducing a warp route where there are different symbols in the config (PumpBTC) - This will mean that metric scrapping will have different warp route ids for collateral and synthetic balances - This change ensures that the collateral symbol is used for the warp route id for both metrics ### Testing Manual --- .../scripts/warp-routes/monitor/metrics.ts | 3 +- .../monitor/monitor-warp-route-balances.ts | 51 ++++++++++++++++++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/typescript/infra/scripts/warp-routes/monitor/metrics.ts b/typescript/infra/scripts/warp-routes/monitor/metrics.ts index 52c2604f96..4879415f60 100644 --- a/typescript/infra/scripts/warp-routes/monitor/metrics.ts +++ b/typescript/infra/scripts/warp-routes/monitor/metrics.ts @@ -59,6 +59,7 @@ export function updateTokenBalanceMetrics( warpCore: WarpCore, token: Token, balanceInfo: WarpRouteBalance, + collateralTokenSymbol: string, ) { const metrics: WarpRouteMetrics = { chain_name: token.chainName, @@ -67,7 +68,7 @@ export function updateTokenBalanceMetrics( wallet_address: token.addressOrDenom, token_standard: token.standard, warp_route_id: createWarpRouteConfigId( - token.symbol, + collateralTokenSymbol, warpCore.getTokenChains(), ), related_chain_names: warpCore diff --git a/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts index 4eecc1f736..c04ed7418c 100644 --- a/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts +++ b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts @@ -89,12 +89,18 @@ async function pollAndUpdateWarpRouteMetrics( chainMetadata, apiKey: await getCoinGeckoApiKey(), }); + const collateralTokenSymbol = getWarpRouteCollateralTokenSymbol(warpCore); while (true) { await tryFn(async () => { await Promise.all( warpCore.tokens.map((token) => - updateTokenMetrics(warpCore, token, tokenPriceGetter), + updateTokenMetrics( + warpCore, + token, + tokenPriceGetter, + collateralTokenSymbol, + ), ), ); }, 'Updating warp route metrics'); @@ -107,6 +113,7 @@ async function updateTokenMetrics( warpCore: WarpCore, token: Token, tokenPriceGetter: CoinGeckoTokenPriceGetter, + collateralTokenSymbol: string, ) { const promises = [ tryFn(async () => { @@ -118,7 +125,12 @@ async function updateTokenMetrics( if (!balanceInfo) { return; } - updateTokenBalanceMetrics(warpCore, token, balanceInfo); + updateTokenBalanceMetrics( + warpCore, + token, + balanceInfo, + collateralTokenSymbol, + ); }, 'Getting bridged balance and value'), ]; @@ -310,6 +322,41 @@ async function getCoinGeckoApiKey(): Promise { return apiKey; } +function getWarpRouteCollateralTokenSymbol(warpCore: WarpCore): string { + // We need to have a deterministic way to determine the symbol of the warp route + // as its used to identify the warp route in metrics. This method should support routes where: + // - All tokens have the same symbol, token standards can be all collateral, all synthetic or a mix + // - All tokens have different symbol, but there is a collateral token to break the tie, where there are multiple collateral tokens, alphabetically first is chosen + // - All tokens have different symbol, but there is no collateral token to break the tie, pick the alphabetically first symbol + + // Get all unique symbols from the tokens array + const uniqueSymbols = new Set(warpCore.tokens.map((token) => token.symbol)); + + // If all tokens have the same symbol, return that symbol + if (uniqueSymbols.size === 1) { + return warpCore.tokens[0].symbol; + } + + // Find all collateralized tokens + const collateralTokens = warpCore.tokens.filter( + (token) => + token.isCollateralized() || + token.standard === TokenStandard.EvmHypXERC20Lockbox, + ); + + if (collateralTokens.length === 0) { + // If there are no collateralized tokens, return the alphabetically first symbol + return [...uniqueSymbols].sort()[0]; + } + + // if there is a single unique collateral symbol return it or + // ifthere are multiple, return the alphabetically first symbol + const collateralSymbols = collateralTokens.map((token) => token.symbol); + const uniqueCollateralSymbols = [...new Set(collateralSymbols)]; + + return uniqueCollateralSymbols.sort()[0]; +} + main().catch((err) => { logger.error('Error in main:', err); process.exit(1); From 98521723beef44a739833ffa06949c70bc699bcd Mon Sep 17 00:00:00 2001 From: Kunal Arora <55632507+aroralanuk@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:12:18 +0530 Subject: [PATCH 09/81] feat(infra): warp monitor for pumpBTC warp route b/w ethereum<>sei (#5004) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --------- Co-authored-by: Mo Hussan <22501692+Mo-Hussain@users.noreply.github.com> --- .../getEthereumSeiPumpBTCWarpConfig.ts | 42 +++++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 1 + typescript/infra/config/warp.ts | 2 + typescript/infra/src/config/warp.ts | 1 + typescript/infra/src/warp/helm.ts | 2 +- 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts new file mode 100644 index 0000000000..9d073230a8 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts @@ -0,0 +1,42 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + OwnableConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const ethereumOwner = '0x77A0545Dc1Dc6bAee8d9c1d436c6688a75Ae5777'; +const seiOwner = '0x14A359aE2446eaC89495b3F28b7a29cE2A17f392'; + +export const getEthereumSeiPumpBTCWarpConfig = async ( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), + type: TokenType.collateral, + token: tokens.ethereum.pumpBTCsei, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const sei: HypTokenRouterConfig = { + ...routerConfig.sei, + ...getOwnerConfigForAddress(seiOwner), + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + sei, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index d9bf87760d..1cd98d1c8d 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -22,6 +22,7 @@ export enum WarpRouteIds { EthereumInevmUSDC = 'USDC/ethereum-inevm', EthereumInevmUSDT = 'USDT/ethereum-inevm', EthereumSeiFastUSD = 'FASTUSD/ethereum-sei', + EthereumSeiPumpBTC = 'pumpBTCsei/ethereum-sei', EthereumVanaETH = 'ETH/ethereum-vana', EthereumVanaVANA = 'VANA/ethereum-vana', EthereumVictionETH = 'ETH/ethereum-viction', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index c68e2221d9..d87a010be1 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -33,6 +33,7 @@ import { getEthereumFlowCbBTCWarpConfig } from './environments/mainnet3/warp/con 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'; +import { getEthereumSeiPumpBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.js'; import { getEthereumVictionETHWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.js'; import { getEthereumVictionUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.js'; import { getEthereumVictionUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.js'; @@ -61,6 +62,7 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig, [WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig, [WarpRouteIds.EthereumSeiFastUSD]: getEthereumSeiFastUSDWarpConfig, + [WarpRouteIds.EthereumSeiPumpBTC]: getEthereumSeiPumpBTCWarpConfig, [WarpRouteIds.EthereumVictionETH]: getEthereumVictionETHWarpConfig, [WarpRouteIds.EthereumVictionUSDC]: getEthereumVictionUSDCWarpConfig, [WarpRouteIds.EthereumVictionUSDT]: getEthereumVictionUSDTWarpConfig, diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 2ceb1c8cb1..3a0ddb4110 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -12,6 +12,7 @@ export const tokens: ChainMap> = { USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88', + pumpBTCsei: '0xe9ebd666954B7F0B5B044704c86B126651f6235d', Re7LRT: '0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a', }, sei: { diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 80c2f2353b..1d0f43585a 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '7e520fb-20241215-234731', + tag: '3cacafd-20241220-092417', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From 18310b8caeb80531e3f021c5ebc597a56f6f00af Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 26 Dec 2024 15:29:39 +0000 Subject: [PATCH 10/81] fix: fix SVM scraper dispatch and delivery bugs (#5071) ### Description Context here https://discord.com/channels/935678348330434570/1320897742779977849 Fixes two bugs, adding tests for them: - Txs that had reverted with an error are no longer considered valid in the scraper's log meta population codepath. We ran into an instance where two attempted process txs landed in the same block. We'd get two potentially matching txs in the same block when indexing the process, which causes issues - Versioned txs were not supported. We ran into a versioned dispatch tx for the first time (https://eclipsescan.xyz/tx/Ku7gtQzEztksncHMHYkXq8PNst5rZsznrXMDmVqoQjc7SR4PsXz33qjNMckNcHriCxuhZJGZequo8moNsRP9GZK). The list of accounts wasn't populated correctly because some were dynamic (from an address lookup table). This caused us to think that the Mailbox wasn't being used in a tx, when it was. The solution here is to ensure the list is ordered correctly and has all the accounts, including the dynamic ones. ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../src/log_meta_composer.rs | 27 +- ...age_block_multiple_txs_one_successful.json | 3388 +++++++++++++++++ .../delivery_message_reverted_txn.json | 175 + .../dispatch_message_versioned_txn.json | 565 +++ .../src/log_meta_composer/tests.rs | 90 +- .../config/environments/mainnet3/agent.ts | 2 +- 6 files changed, 4243 insertions(+), 4 deletions(-) create mode 100644 rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_block_multiple_txs_one_successful.json create mode 100644 rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_reverted_txn.json create mode 100644 rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_versioned_txn.json diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs index f530b04e0f..5e3da84942 100644 --- a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs @@ -220,6 +220,11 @@ fn filter_by_validity( tx: UiTransaction, meta: UiTransactionStatusMeta, ) -> Option<(H512, Vec, Vec)> { + // If the transaction has an error, we skip it + if meta.err.is_some() { + return None; + } + let Some(transaction_hash) = tx .signatures .first() @@ -238,9 +243,29 @@ fn filter_by_validity( return None; }; + // Orders the account keys in line with the behavior of compiled instructions. + let account_keys = match &meta.loaded_addresses { + OptionSerializer::Some(addresses) => { + // If there are loaded addresses, we have a versioned transaction + // that may include dynamically loaded addresses (e.g. from a lookup table). + // The order of these is [static, dynamic writeable, dynamic readonly] and + // follows the iter ordering of https://docs.rs/solana-sdk/latest/solana_sdk/message/struct.AccountKeys.html. + [ + message.account_keys, + addresses.writable.clone(), + addresses.readonly.clone(), + ] + .concat() + } + OptionSerializer::None | OptionSerializer::Skip => { + // There are only static addresses in the transaction. + message.account_keys + } + }; + let instructions = instructions(message.instructions, meta); - Some((transaction_hash, message.account_keys, instructions)) + Some((transaction_hash, account_keys, instructions)) } fn filter_by_encoding( diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_block_multiple_txs_one_successful.json b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_block_multiple_txs_one_successful.json new file mode 100644 index 0000000000..d90fb4eabc --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_block_multiple_txs_one_successful.json @@ -0,0 +1,3388 @@ +{ + "blockHeight": 35744889, + "blockTime": 1734974925, + "blockhash": "DvtcDha1ZnwXbggRkP7pw3EDNortvgCWWA7Lyv5wVTcZ", + "parentSlot": 35781851, + "previousBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM", + "rewards": [ + { + "commission": null, + "lamports": 1900, + "postBalance": 8937590330, + "pubkey": "AJwEBmY7PcLNtZKhpVvmF13VgosvMDva2kH79dHaasb9", + "rewardType": "Fee" + } + ], + "transactions": [ + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8937588480, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8937588530, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "AJwEBmY7PcLNtZKhpVvmF13VgosvMDva2kH79dHaasb9", + "C6PeLNxv75pYFFMnWctc75tAPHvbnQk3p5SgcGPemhqg", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvnh9eEmYV25eHYJGiBBVdJ7QaJuHpWU5p1xAELYC92HNBkLkf7vwiANvYagfemtwLFqN5YQdrT1eCHaWb78mx36Efr6yN4rEdV6WTC1K3cCpTpR1XXfJUvvWS4xZ4Ueuep2jg1z4FPi8rj2cNxPoSeCwZ", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "82X78RuKVZMjZ4wwMJpjiaYVGW3q9PatQzWSsokJLCa3" + }, + "signatures": [ + "3dLqABPPT8JkeyZfub57E99rPtU4dRXvtqcdNU6iNa3iuaLHExmYpAa8isksMo5RthPkAkypaTa8Hp8CMmxG9Vec" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8994813620, + 264520, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8994813670, + 264520, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "7jtuen1N95bBNyAV5dbcx6enYT24qKqHobyHQZnyRoTD", + "Fuwdpk6BQq6hPsEWPtmvyujchKYAb6gMA7Z9rKezuoxS", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvnh9eEmYV25eHYJGiBBVdJ7QaJuHpWU5p1xAELYC92HNBkLkf7vwiANvYagfemtwLFqN5YQdrT1eCHaWb78mx36Efr6yN4rEdV6WTC1K3cCpTpR1XXfJUvvWS4xZ4Ueuep2jg1z4FPi8rj2cNxPoSeCwZ", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "82X78RuKVZMjZ4wwMJpjiaYVGW3q9PatQzWSsokJLCa3" + }, + "signatures": [ + "2o1YTyd4AWK5j23DBsYDzw6c6qqQ8JAEm1TQYEhK8BHXZaxyZsQDUfbpndoQPgvXqu21GktDqvnKSkcpW45YSvqY" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8900415217, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8900415267, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "2gb1u6kcg3V5MfhoycoEL6m6JWgQAmdkpJSXoUa4ogVf", + "Fo7TvsvnVzsVsntZX4bnfH9h3MffzxTGtzQyvm8sTLtP", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvnh9eEmYV25eHYJGiBBVdJ7QaJuHpWU5p1xAELYC92HNBkLkf7vwiANvYagfemtwLFqN5YQdrT1eCHaWb78mx36Efr6yN4rEdV6WTC1K3cCpTpR1XXfJUvvWS4xZ4Ueuep2jg1z4FPi8rj2cNxPoSeCwZ", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "82X78RuKVZMjZ4wwMJpjiaYVGW3q9PatQzWSsokJLCa3" + }, + "signatures": [ + "4ztQLtKoowNM3QBvSi8H7BJ6MAuJKRKCfhsV85ptcC8JM1cXqYr3qq5p4JjT1W1jcRTk6gFyPYXS5ZRQyuQbNwfD" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 24927, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [1]", + "Program 11111111111111111111111111111111 success", + "Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr invoke [1]", + "Program log: Memo (len 66): \"0xe377a5c244b12079b9bd5baad4d3ae7e36165721b774557980fb2f2c4bb859f8\"", + "Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr consumed 24927 of 29913 compute units", + "Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr success" + ], + "postBalances": [ + 1495953, + 6722589421, + 1, + 1, + 5095104 + ], + "postTokenBalances": [], + "preBalances": [ + 51496003, + 6672589421, + 1, + 1, + 5095104 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "ByMrVM5LUgHKwPeQSWKEPnyKQVHqfxFTkQuuj1Vi9cVD", + "F7p3dFrjRTbtRp8FRF6qHLomXbKRBzpvBLjtQcfcgmNe", + "ComputeBudget111111111111111111111111111111", + "11111111111111111111111111111111", + "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr" + ], + "addressTableLookups": [], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 3, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "KeSwJP", + "programIdIndex": 2, + "stackHeight": null + }, + { + "accounts": [ + 0, + 1 + ], + "data": "3Bxs4NRZ15a54oAf", + "programIdIndex": 3, + "stackHeight": null + }, + { + "accounts": [], + "data": "KszPnaqCF2i8y7gn5x5f9sgXMgoyBncGcNtYb8WoiD9nqQVRZWawYwMBK234hSpsQ9zxR6sb8DyByvm377GFFo5w75", + "programIdIndex": 4, + "stackHeight": null + } + ], + "recentBlockhash": "FgiA2obJyS9f5QjsbHf3YGjTusWN9Mu9aqB9zSJKEsLh" + }, + "signatures": [ + "4vhWbER158mpYWNNfKgN3EGytrt1mE8PmcHvr2eCAWJiCqZDZxBZy3vCa76FrZefxdyiVSiovDZQD9qKyxkvdZzJ" + ] + }, + "version": 0 + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 431050, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 431100, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXxd", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "Gva3FJcjwjirKpGdQdxreMWnQxd32jDMEwh2pg7NsnuN" + }, + "signatures": [ + "5Nmrbx7J6hhUu3YNYfxdHgh4BioCWAYDWMmXKjR2Ps7xKwfKcJXQVPpTqNgWJirjePb65fwEVZe7G5Pz4GTzPdGR" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25114, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 6yWRb7MA4PTputZS2GgQ1BKQHC5pu1124HqpKroLs2LG", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25114 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 519850, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 519900, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "6yWRb7MA4PTputZS2GgQ1BKQHC5pu1124HqpKroLs2LG", + "Hu94iEVDhfAhUVUYTe2ePXBVUNtPsTTAtkZKPNf2pq8Z", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "B9TNgu8ndXGYB73nF992K6wYKv6Ty7LxLBoxnE5tYYmR", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXzE", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "3veDZBERK9bD5PzCuygjYquZ85aUnU24kRuUwWRzTtkc" + }, + "signatures": [ + "4dm9BrvJsFmM614MuNFyS4EkeEZenJ79g8HMj4bDPErh4DrdN26pHFZr7txJWrbVLEoT3Wbp82Jgmdk7SeGxasde" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker DJiDXfe1jSRmgYuKjzDCbnYciZkXCRbdRR8ezDbM15iF", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 4260450, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 4260500, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "DJiDXfe1jSRmgYuKjzDCbnYciZkXCRbdRR8ezDbM15iF", + "6qQAxeLkfS1Qfsg7WbyMriGtsuPY1T6NwSiXKrqb3gqs", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "HU4JccsEKv5HKdNDe1wiiKBTacB78QEdSV4xJdrCnFZN", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyq", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "AXAiaXycACYJT9WyET1nM9zJkNWWv9h1SAz6VBX9gwdg" + }, + "signatures": [ + "4x13vs877UsCCugnPPVH9jJ3reby5RfKqQm6fgXkieVMgoLBzognyN4PJFcV6hpeksFN78Sz3eyw5bkaLK9Piv8u" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23575, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23575 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 4669050, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 4669100, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "3WUFeYoWxzMKwngWsB2GsKmByZfZvhp2F2Y3QUswxUfh", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "9JhY9KffbdVxED3GY4jNUrDNv2dv7JQc61ioszdkNrXS", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyV", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "HrGwSEeS1L3DKDjHDCeVycwTKrxN5n861eZY6m3G8Fkm" + }, + "signatures": [ + "4PyVsQnjZnnLC5pmgtAsSD5ZYZyp3NuL1At8J5VR5si18eLcCQFmiXKuALQ2Z5VbesKcRVs2zD9PrtzAJciGr8aS" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 29692, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker CfXww3YzNBQUEtS4ZJeEMZtAEbsym7BAKYUdPsQ1qqrJ", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 29692 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 2947200, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 2947250, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "CfXww3YzNBQUEtS4ZJeEMZtAEbsym7BAKYUdPsQ1qqrJ", + "12p6G2ShLgRbxBpCqDue2zed3UGqnLmrxHNmCrhTR1QS", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "AogE6CYJgaLGXug6D6oTuzZsKJAptaCRD2sLTAMqg1Dm", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXx9", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "4feKSCpn9AFR3UfkoqHuC6HRoqGjkiWqAH5PESV2U3CXjv8obBwooMKCP8xfB9VM8WdjGDHb8BKgBZCbScr5kCjR" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992750, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992800, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXz6", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "GX81sTiYtmXrs7p99NPP74vY3Q6TLHueueQ1xXPzt4bk" + }, + "signatures": [ + "a7sKgx3MotvqiK7KsnAUfWaEHqW1oJ2mLScaRQWvEiHH146yTokGfuKUGDzG7tgZta3LVd1TMjk2yWa4r7hqndE" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23705, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker FZDe7R2oeEqPXUZg7GdbP98yfScU5j3WM9BwDdzA3ZLx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23705 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 2058300, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 2058350, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "FZDe7R2oeEqPXUZg7GdbP98yfScU5j3WM9BwDdzA3ZLx", + "Cy3u4YK7jv3mfqhoFTSMvxWE5wyarYi9fXWR7bEe9NAk", + "35b813JrG1f4gJ3GpBRqPkuFRiEgE5himtQHXVj8YvjY", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXvm", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "3qExduzZcYxeKTSTKEY9gs5UTFeg5azfYytswpgFFVeu1BW3XVJJtyfHwHJh9ZLUyn2pHvDfGFaEyMvrtvLgpenu" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23705, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker FZDe7R2oeEqPXUZg7GdbP98yfScU5j3WM9BwDdzA3ZLx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23705 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 2058250, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 2058300, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "FZDe7R2oeEqPXUZg7GdbP98yfScU5j3WM9BwDdzA3ZLx", + "Cy3u4YK7jv3mfqhoFTSMvxWE5wyarYi9fXWR7bEe9NAk", + "35b813JrG1f4gJ3GpBRqPkuFRiEgE5himtQHXVj8YvjY", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXyG", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "CG5epQJHrdo6WME2VRwHhdasACE7CV5kwCuEbvVk5QitMJjhhpJ5V6u1hFk1cMG7oozXFoFJWeNExnoYwPeSVmm" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25114, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 6yWRb7MA4PTputZS2GgQ1BKQHC5pu1124HqpKroLs2LG", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25114 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 519800, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 519850, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "6yWRb7MA4PTputZS2GgQ1BKQHC5pu1124HqpKroLs2LG", + "Hu94iEVDhfAhUVUYTe2ePXBVUNtPsTTAtkZKPNf2pq8Z", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "B9TNgu8ndXGYB73nF992K6wYKv6Ty7LxLBoxnE5tYYmR", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXxS", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "3veDZBERK9bD5PzCuygjYquZ85aUnU24kRuUwWRzTtkc" + }, + "signatures": [ + "3jueLij1hqvENMjToMiEUM119WPZehXCrSCBYLniRZzC1sbwzwGxYGRRB6wKtHkc82ngqbzJJba9GZ7XztCHMjbr" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 431000, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 431050, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXzT", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "Gva3FJcjwjirKpGdQdxreMWnQxd32jDMEwh2pg7NsnuN" + }, + "signatures": [ + "4JES3o1EfQFxUsEuNxYwbyvZzvhoiY6kHvoizya4J5aeuqYBXbmMiY8s76TNoEyT98KY72fe3dp2QHtL3L5zicDs" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23575, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23575 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 4669000, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 4669050, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "3WUFeYoWxzMKwngWsB2GsKmByZfZvhp2F2Y3QUswxUfh", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "9JhY9KffbdVxED3GY4jNUrDNv2dv7JQc61ioszdkNrXS", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXvb", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "4bXsMeojJxqqLbDsN9DnWRwoSyrorP7CQ8HAZBPxhyND" + }, + "signatures": [ + "2N3PrKS7Yd6sDTUhN471dvsHeTP8cs5RC5VKZGvRN3TnmRYVqaZR1y8Hr69o811YMvKpnWVtqSAknbeYKSXbZrcN" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992700, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992750, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXzJ", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "4bXsMeojJxqqLbDsN9DnWRwoSyrorP7CQ8HAZBPxhyND" + }, + "signatures": [ + "8f5FFcU8KgnDgwRdx6YV1FZEbz8fcjDUhp6M8TkXJbDeY434QSpM3fHa1LgTYLfvViXz9e63ePfXmmT5KVXg4Rt" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 26066, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e invoke [1]", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e consumed 13033 of 27000 compute units", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e success", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e invoke [1]", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e consumed 13033 of 13967 compute units", + "Program FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e success" + ], + "postBalances": [ + 55400350, + 233920, + 233920, + 1, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 55400400, + 233920, + 233920, + 1, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "4bEk3CLwmnRHQxUEqDtNcXabz8RSdQyMpsAKJTaM8NUc", + "4bbK5m6YSPyALDa5uE9WYMLwnqEATHDzWdYqFZJ6Ezrf", + "E4wLiGrpMi2RtH7c1WrTzCdVVEi58za1XzPygtr7Kmz1", + "ComputeBudget111111111111111111111111111111", + "FUCHhfHbuxXBWiRBfVdhmiog84sUJw11aAq3ibAUGL6e" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 2, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "HAaSfh", + "programIdIndex": 3, + "stackHeight": null + }, + { + "accounts": [ + 2, + 0 + ], + "data": "vaJro6ZLfqS8Tk6mcBehNesxGGBBDUfeYjo9XpzxmW6pTfUBhDh7eNT", + "programIdIndex": 4, + "stackHeight": null + }, + { + "accounts": [ + 1, + 0 + ], + "data": "svao1p5ZoTbEBpMq8HCJ7B2jKsqFvGGBTjackJ79Q8sb67xwyCid5wd", + "programIdIndex": 4, + "stackHeight": null + } + ], + "recentBlockhash": "HrGwSEeS1L3DKDjHDCeVycwTKrxN5n861eZY6m3G8Fkm" + }, + "signatures": [ + "32xkNevmZipE6UdriH8UdB7bT7LajuAXZF6Y1J7ZJL5q4DEYvZa4SRHL9c6njmmPHjiEDKsEM7CvNPkx9KXb8NaZ" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 262874, + "err": null, + "fee": 150, + "innerInstructions": [ + { + "index": 1, + "instructions": [ + { + "accounts": [ + 0, + 4 + ], + "data": "1111JX81xkJCwniZ1Erg4Sybstk6tqT9u8gU37B5SnCv3ruqnd5SbCwNAcbMvfg2xgbbn", + "programIdIndex": 12, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 6 + ], + "data": "1111JX81xkJCwniZ1Erg4Sybstk6tqT9u8gU37B5SnCv3ruqnd5SbCwNAcbMvfg2xgbbn", + "programIdIndex": 12, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 8 + ], + "data": "3Bxs4Tm5txe73V9q", + "programIdIndex": 12, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 7 + ], + "data": "3Bxs4Tm5txe73V9q", + "programIdIndex": 12, + "stackHeight": 2 + }, + { + "accounts": [ + 3, + 0, + 10, + 0, + 2, + 1, + 9, + 5, + 11, + 18, + 13, + 16, + 12 + ], + "data": "9ZxXEgRKtxM", + "programIdIndex": 15, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 2 + ], + "data": "11114hL6PWxs4U7NCYRNXyZk7j7iV5YvbM2Y4EYYnUoc78BhWkZV7EbHKZpZnbJM3FMyFq", + "programIdIndex": 12, + "stackHeight": 3 + }, + { + "accounts": [ + 2 + ], + "data": "GC422sqZqSiuDzjorrJVQ1wDyBHerctVdibtxN47F9PXCNokjD5NBjqdUEZ7q7gULrAbayLZ33AbQKyBCSPFNnZM1u", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2 + ], + "data": "GyEZt3T6vJ45ToJP8DQByidGXsy4KJEGWVWgP1hEpCP6MRsdGJabNdMf1B9yvA6BX5x37UchRjzKErQP9GT1YjQp1G", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2 + ], + "data": "bPFz9iKJZS3rDbU6zowCjSwEjkgEPMo9i3Vmbodo9YYN1dGaEta9eWisUYepxtz2rgAZBo5ZFNFCJ6MvKF9e8V7ceoa", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2, + 3, + 2, + 3 + ], + "data": "YzZQyW1KJYUcGMonWYpqEXb51jrqpC6SG3vMmUSJpjmTHzgi5rH5QercoJFoQY2wRHDwBmhF3iD7TFuBnY1ETUnuBcVVooT7LgnFcL3XatbSFEdD9SP9HdmRrR1AbAzTR1qauF9DxCfUoHMv7g5GfXSF8H3PcTKcy4HeZAqD6GP7ApLu5bS", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 0, + 1 + ], + "data": "11113Md75Dq7V8gjbzJMw6r5QL5XX645yU1bhj7iFnRmnhAT1ske6hnTQ4LYv8avqJdZ2Z", + "programIdIndex": 12, + "stackHeight": 3 + }, + { + "accounts": [ + 1, + 2, + 3, + 9, + 3 + ], + "data": "SSqVPNo92jX", + "programIdIndex": 16, + "stackHeight": 3 + }, + { + "accounts": [ + 0, + 11, + 0, + 2, + 12, + 18 + ], + "data": "1", + "programIdIndex": 13, + "stackHeight": 3 + }, + { + "accounts": [ + 2 + ], + "data": "84eT", + "programIdIndex": 18, + "stackHeight": 4 + }, + { + "accounts": [ + 0, + 11 + ], + "data": "11112Um5QtBM9RVwhzeb2i4U2mPJ7krjBF48k17qACUVhhTNRzdmH1adRRGPABHBdaEx67", + "programIdIndex": 12, + "stackHeight": 4 + }, + { + "accounts": [ + 11 + ], + "data": "P", + "programIdIndex": 18, + "stackHeight": 4 + }, + { + "accounts": [ + 11, + 2 + ], + "data": "6U1ZUf261fPY3ULHBWy3hurmHY2X4qaWfcvvCwszYF11e", + "programIdIndex": 18, + "stackHeight": 4 + }, + { + "accounts": [ + 2, + 11, + 3 + ], + "data": "6AuM4xMCPFhR", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2, + 3 + ], + "data": "31tb", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2, + 3 + ], + "data": "C2X7q5sVBvi2E5BSotT3ogtLHb3igj3sP7xdQF1f2suStR2MUMN7QBq", + "programIdIndex": 18, + "stackHeight": 3 + }, + { + "accounts": [ + 2, + 3 + ], + "data": "5SL6KejFcJAFCech12rmhDMH11RyzCaprR64rHCLCuRW48Wy42PgxL4nfYsZSejosCQQsJve6HruQaoknGeML2GF", + "programIdIndex": 18, + "stackHeight": 3 + } + ] + } + ], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program RariUNM3vz1rwxPg8UJyRAN7rSKXxgd2ncS2ddCa4ZE invoke [1]", + "Program log: Instruction: MintWithControls", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program Rari9ftBd6vFdtpn8TDLwN2ze24KKkM5MLEETNiBMNn invoke [2]", + "Program log: Instruction: Mint", + "Program log: Invoke create account 7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag,BQ2TPCCzmxNMvmk5snbHGfVDL5JDzvXJBvhGc7adsY2o", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Invoke initialise metadata pointer extension", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: MetadataPointerInstruction::Initialize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2442 of 766976 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: GroupMemberPointerInstruction::Initialize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2505 of 762558 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Invoke initialise mint", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: Instruction: InitializeMint2", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 4078 of 758195 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Initialise metadata if needed", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: TokenMetadataInstruction: Initialize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 9992 of 751137 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Invoke create account 7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag,BQ2TPCCzmxNMvmk5snbHGfVDL5JDzvXJBvhGc7adsY2o", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program RariGDYwEF1jQA4kisHxBxiv1TDuBPVHNNoXFNYriFb invoke [3]", + "Program log: Instruction: InitializeMember", + "Program RariGDYwEF1jQA4kisHxBxiv1TDuBPVHNNoXFNYriFb consumed 3062 of 712812 compute units", + "Program RariGDYwEF1jQA4kisHxBxiv1TDuBPVHNNoXFNYriFb success", + "Program log: Finished", + "Program log: MINT NON-FUNGIBLE TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "Program log: 7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [3]", + "Program log: Create", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: GetAccountDataSize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 3038 of 670644 compute units", + "Program return: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb qgAAAAAAAAA=", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program 11111111111111111111111111111111 invoke [4]", + "Program 11111111111111111111111111111111 success", + "Program log: Initialize the associated token account", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: InitializeImmutableOwner", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 1924 of 662747 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: InitializeAccount3", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5392 of 658406 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 24807 of 677448 compute units", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success", + "Program log: Minting TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: Instruction: MintTo", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5568 of 638961 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Removing mint authority", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: Instruction: SetAuthority", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2740 of 631171 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: done", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: TokenMetadataInstruction: UpdateField", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 12096 of 621425 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: TokenMetadataInstruction: UpdateField", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 13658 of 606546 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program Rari9ftBd6vFdtpn8TDLwN2ze24KKkM5MLEETNiBMNn consumed 214421 of 805330 compute units", + "Program Rari9ftBd6vFdtpn8TDLwN2ze24KKkM5MLEETNiBMNn success", + "Program RariUNM3vz1rwxPg8UJyRAN7rSKXxgd2ncS2ddCa4ZE consumed 262874 of 850000 compute units", + "Program RariUNM3vz1rwxPg8UJyRAN7rSKXxgd2ncS2ddCa4ZE success" + ], + "postBalances": [ + 1504115, + 14144, + 48484, + 142256, + 15368, + 53924, + 15368, + 216518752, + 139608770978, + 14416, + 95200, + 20264, + 1, + 7277632, + 1, + 11152, + 11152, + 11152, + 11152 + ], + "postTokenBalances": [ + { + "accountIndex": 11, + "mint": "BQ2TPCCzmxNMvmk5snbHGfVDL5JDzvXJBvhGc7adsY2o", + "owner": "7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "1", + "decimals": 0, + "uiAmount": 1, + "uiAmountString": "1" + } + } + ], + "preBalances": [ + 2777893, + 0, + 0, + 142256, + 0, + 53924, + 0, + 215938752, + 139608190978, + 14416, + 95200, + 0, + 1, + 7277632, + 1, + 11152, + 11152, + 11152, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "7sroipZDNYGDCrBfRorNRtKu38wFRqExv1kMTJJiwrag", + "9toVdfGuM4qwW9uyfadz3JA9SED6kzJzJaqRfKnvZif2", + "BQ2TPCCzmxNMvmk5snbHGfVDL5JDzvXJBvhGc7adsY2o", + "23buSpWBskpcVtkQsWtcugmbfqsYqHpsDLe4tj5mmAqN", + "5oaouyNATLwQjixXpYT5sEqKaKafafQi5oEM8gcFS1p9", + "71HcxJnmvJrfyYA1gkfK5SAXecGzuWN3B3w9T6dHNa8H", + "8SUKSg5QaqkXBczx27hKisrLnoFpdTekYVyvjcBcwgcw", + "8y6yGuhdyPYEaiujsK62V6ctHcrtYu7f2LxLDXCHnb4d", + "AsSKqK7CkxFUf3KaoQzzr8ZLPm5fFguUtVE5QwGALQQn", + "DLDzmqUwGhBnRkdoUPjAYcHcx17FYjfAAk6q8qj7MPJJ", + "Dq6A6TNFWHjFKuLqWPYjFcTjhSuanpKAgWXxGzJncwtT", + "EoHBPKH6A18QECuWth1pUYafF95W5mfmwS7nAZp9LZLH", + "11111111111111111111111111111111", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "ComputeBudget111111111111111111111111111111", + "Rari9ftBd6vFdtpn8TDLwN2ze24KKkM5MLEETNiBMNn", + "RariGDYwEF1jQA4kisHxBxiv1TDuBPVHNNoXFNYriFb", + "RariUNM3vz1rwxPg8UJyRAN7rSKXxgd2ncS2ddCa4ZE", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 7, + "numRequiredSignatures": 3 + }, + "instructions": [ + { + "accounts": [], + "data": "GA6zB1", + "programIdIndex": 14, + "stackHeight": null + }, + { + "accounts": [ + 3, + 10, + 0, + 4, + 6, + 2, + 1, + 9, + 5, + 8, + 11, + 7, + 18, + 13, + 16, + 12, + 15 + ], + "data": "5gMQbgxkTMLLTytDRsM8B", + "programIdIndex": 17, + "stackHeight": null + } + ], + "recentBlockhash": "GRKHwZHCpQCkdCfLB5uDfNZ1DnbhFaegxpv351WGZESk" + }, + "signatures": [ + "4YYiYWvcT7wqWQ18Jcfwf3D8mPXNVWWWQ1Qapuubqu7FFriFentR8pv6wcDKYAaEe2xNNZXWrDwB6cFXu9g6AUU2", + "4mKjD6UP9fHRaW5BAFp2fzyDFbYZBUF5n2eYfipTYTpXYdbj9o7bysHgJWbNf4HKaXpWtUw5iG6FNhcBbc87rkNS", + "637DgH3g2Giu3m4gD7ALUXGjDAiietgubWDo6yTjkvbqUtNttYTyxQjRBf8j2W8iqsX6AacGGW6j54NXE3pkGTE3" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8937588430, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8937588480, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "AJwEBmY7PcLNtZKhpVvmF13VgosvMDva2kH79dHaasb9", + "C6PeLNxv75pYFFMnWctc75tAPHvbnQk3p5SgcGPemhqg", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvyak29TbGXpE2Lwz5sSCzhNdG5DLVnfiBZBkMgazajyeLBZzKECbBUxETBJhpzkWTodGw6pMLoLygdjREwer3urL9cNoKzndAFuwucV6nMKUePk649zMvZXuP4WCUgk6pjuXigR8Wux32vCszFfJBfqGj", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "4QjwbwDvkGXJ3PiKpEcmbvoiVJKUnyfN3RRJY3xfRYjwkVJ4PQ6kDBiLFWnuirDnqVpSRaPP7NK5JZgxuwC7Y9hy" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430950, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 431000, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXy8", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "Gva3FJcjwjirKpGdQdxreMWnQxd32jDMEwh2pg7NsnuN" + }, + "signatures": [ + "pTYUghgJjDE9jj9TD3izbmKbsoZwyTvQnVXEa9Xumd1enH1TUq3C7tTT7UzXNjCV75V5XNSzvF1yWTZ4Tq4c2Ay" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 23575, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 23575 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 4668950, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 4669000, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "55x98feYeH7taBmGj5MnvVyALkj51ctsvrkJgUooiT2d", + "3WUFeYoWxzMKwngWsB2GsKmByZfZvhp2F2Y3QUswxUfh", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "9JhY9KffbdVxED3GY4jNUrDNv2dv7JQc61ioszdkNrXS", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXxV", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "2DRJDZLuP2bxw5rLvZ4AvX6RhgEnfJ9fRaWPTbGDNEPj43kNof3g2Vp6ZqifU5zPA9FTmZQnTjHKEM8CBhkedHED" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992650, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992700, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXwN", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "745aVzBnpkgPpDCpG4F5fnpFy9WhhRHDJeezHxKHHzDr" + }, + "signatures": [ + "2tB9PPDwziUWj8m6HtPn9A3gn74rwVDSekD2Z5XEtV8DLPY8Fm9S7hZEuFWq8NGcncbb8agyDwNXLB5uoeLbtsff" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992600, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992650, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXxv", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "2d8BhKG9E8nMARkU9SkMN9N5UmS4VkPyYYZNoUcekqCX" + }, + "signatures": [ + "VHivewViQLW3Y7W37y6aLB9ZR7k4oBTDizUcL6s69Fsegz3obiz1TBATzDGQsYRn73JLKWA7so64iDe4HavbEoA" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430900, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430950, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyV", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "14tvFMnmt5uugsBUyWWvdBC6YiD6bcWbNUQc2Tr1aLc5" + }, + "signatures": [ + "4hx1wQotXicZS5LcCzoTn8b9rXoAkRNcTTh1hp7yhb22iR3RpyFDab19PhHVTWpHzqrFjYZbRxpgK6nSUT4JGAeS" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430850, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430900, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXzW", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "9PWtA56bgsBEkMS45eBbkUUzzNUYTUeML3VcGHJTK3CR" + }, + "signatures": [ + "3LWqKcfdwLgte6N7xozj4ESm79n2icUdAx1CowBMbaaHEwDFumFnYeQE1HAfqxpWCx1ALFJpaF22pUWZCDPMjUYh" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430800, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430850, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXwu", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "Gva3FJcjwjirKpGdQdxreMWnQxd32jDMEwh2pg7NsnuN" + }, + "signatures": [ + "5DG3XrVfnfTKimSYuz8mWgnqF5mBLuqAcqDZcv1Tq7TGUdmbwwoygEjHjTkbpeuJ79s3Sp6BGhBe8JzYmT6VXbd1" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430750, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430800, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXzN", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "2ASwJhrEruoZdH9BXDEvL7z25w2PX8ztHy9qDgFqhd2X" + }, + "signatures": [ + "5CevNdHzh7yAgNsEAQQqpC2UmckgtpSkRdHqHo6uW1ow5ZoMCcWCj9dFWkBV28PeDA3xicVeZ2urmpyspoQoNUta" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 9235663620, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 9235663670, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "8t2XBEjM7db1Fv24FhNaayPx32daDZ95L5xTETKCk2pK", + "GtvJ5ydPqRrq1oSDdFr4mKynoFFqkDDDYfkPPJnjsH53", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvyak29TbGXpE2Lwz5sSCzhNdG5DLVnfiBZBkMgazajyeLBZzKECbBUxETBJhpzkWTodGw6pMLoLygdjREwer3urL9cNoKzndAFuwucV6nMKUePk649zMvZXuP4WCUgk6pjuXigR8Wux32vCszFfJBfqGj", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "232wBqGGxFPQi22horR7YvofKdtrpc4xnX84D36VFR9QZa8FmTEMteUURgav2eogG33srJ5wKrwmQXw5EhKxNNWB" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430700, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430750, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyM", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "14tvFMnmt5uugsBUyWWvdBC6YiD6bcWbNUQc2Tr1aLc5" + }, + "signatures": [ + "cNqG9iaTpv89mcmfkMXKrY6iUDGHFbJRBMEoWuFPfPV5aXmvf9AUy6xVeot9BxMXpCoFFScQnQT4yPdrpBxBYmq" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25192, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25192 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 430650, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 430700, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "Cp6knuLPhSihkEX7RvhxVAqsjfaxZ8mBdaDSp6Fh3Pgx", + "FLKwjYChrU5BSjWCwjzvk1tdiR1bntTsQd4F4FJhZrDJ", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "FPZ9A7WnsY8q5sarCFAHJqCLuHkrAo5Jqh1nbCiwFQ5e", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyw", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "14tvFMnmt5uugsBUyWWvdBC6YiD6bcWbNUQc2Tr1aLc5" + }, + "signatures": [ + "x1x9c9YJwvMe9fKJ1etuSEQvjstXHsHH4AGFLBFAGv564ezffyeDmfPi5oHLLhHZ15pBENLVyyBGZRVY3GXu7NK" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8900415167, + 272411, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8900415217, + 272411, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "2gb1u6kcg3V5MfhoycoEL6m6JWgQAmdkpJSXoUa4ogVf", + "Fo7TvsvnVzsVsntZX4bnfH9h3MffzxTGtzQyvm8sTLtP", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvyak29TbGXpE2Lwz5sSCzhNdG5DLVnfiBZBkMgazajyeLBZzKECbBUxETBJhpzkWTodGw6pMLoLygdjREwer3urL9cNoKzndAFuwucV6nMKUePk649zMvZXuP4WCUgk6pjuXigR8Wux32vCszFfJBfqGj", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "4GvrQHF1BuoDyPvT7Vs3TLSfzcSMJscB1fz8Ro36dMncFGYRgg5nJnSpy423MBLqewdn2UNz4Jz7Ze1xfKagz9eH" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 0, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program Vote111111111111111111111111111111111111111 invoke [1]", + "Program Vote111111111111111111111111111111111111111 success" + ], + "postBalances": [ + 8994813570, + 264520, + 1 + ], + "postTokenBalances": [], + "preBalances": [ + 8994813620, + 264520, + 1 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "7jtuen1N95bBNyAV5dbcx6enYT24qKqHobyHQZnyRoTD", + "Fuwdpk6BQq6hPsEWPtmvyujchKYAb6gMA7Z9rKezuoxS", + "Vote111111111111111111111111111111111111111" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 1, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 1, + 0 + ], + "data": "Fk63Pvyak29TbGXpE2Lwz5sSCzhNdG5DLVnfiBZBkMgazajyeLBZzKECbBUxETBJhpzkWTodGw6pMLoLygdjREwer3urL9cNoKzndAFuwucV6nMKUePk649zMvZXuP4WCUgk6pjuXigR8Wux32vCszFfJBfqGj", + "programIdIndex": 2, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "2hWDjjzuEPtuWXyxh7UJscffuDDV7wjgwDrB4LKezEMpJe3PvwZsCHH2tQaYapRaYgoCuxxMxusHsr8gUcsWaDyh" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 29692, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker CfXww3YzNBQUEtS4ZJeEMZtAEbsym7BAKYUdPsQ1qqrJ", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 29692 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 2947150, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 2947200, + 11492, + 14212, + 11492, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "CfXww3YzNBQUEtS4ZJeEMZtAEbsym7BAKYUdPsQ1qqrJ", + "12p6G2ShLgRbxBpCqDue2zed3UGqnLmrxHNmCrhTR1QS", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "AogE6CYJgaLGXug6D6oTuzZsKJAptaCRD2sLTAMqg1Dm", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 3, + 1, + 2, + 0, + 4 + ], + "data": "9Yid3B3uRXyz", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "5ieYGqrkBLQBp5QgEw1qk9TSM7bh1agZF16RT5nJQsjj" + }, + "signatures": [ + "5hwa9WgTik1y13XNZxxXViCbjRqhzgAGtALYAmuvQi934FNFNrjPAiREQiW5HnJGUDiyp9ANMeB5Sahk3NfNDRR6" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 328824, + "err": null, + "fee": 50, + "innerInstructions": [ + { + "index": 2, + "instructions": [ + { + "accounts": [ + 17 + ], + "data": "8YGwT5LUTP4", + "programIdIndex": 15, + "stackHeight": 2 + }, + { + "accounts": [ + 16 + ], + "data": "AsRPEhA6Qs4gQCF7F6cofTsuBDbrBbFbaw5CQ6ceeNF4myVnsfFJtriYBe6adGrQatTrdAY7a1TzMsGRFLBUtZVoToquyyDt3x3G5D2X5g7pUa8DuEZ2AHFK4jJthUV3ytsRDUgDVnPjq2dKcWBc5ZDQKw4EGxaS5U7bofeCxX2vZfWNvCswBx1RABdTaPJJPyhxyDqiT6RfYkL2m6EGAW2dmjLpR4pHmQhC85MnCGKJRd7JR93L5h1EujCBE2gto6wdUUnBFDHGL5SWEKdcEkudNrtUGjCj4R3EnnTBMdmVKFDw8unwhdvGbXnZxxnYDJo31p2e7vVntzaH9MoJ1AGiCAj3VmDYujbJvknMz92Ehk9dihov3uoBrwiJo7X2H7kS7HkfdYS3mGKdom4ZRFAv4vKLjg2Uk9NtE54wVQcqAUCT92e696RnU8gxAc8oeSKf8gFJGHFg1Qrekk9LdaR95Bm7w36iDTB7xovZHkLQay16ZbCv3SC8YRyeqmBfMguY8GJDKXobXg6njWvFVZtVYViLMy9t7o8dZmy9swmuQFYPeRs6fddgQKYQxw", + "programIdIndex": 13, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 1 + ], + "data": "11112L11uQJhYT72kZ1iSnLC4yTJBhW25Zvv2dhge4xi6PgvdPK711MPj6dqaW9Q1Act58", + "programIdIndex": 6, + "stackHeight": 2 + }, + { + "accounts": [ + 12, + 6, + 17, + 10, + 8, + 11, + 3, + 2, + 4 + ], + "data": "7MHiQP8ahsZ7exLBXWsfg2PXgutcWwygoSu2YxVxohLeXDRFUKhVLRz9XRvPvP7wvMK68dufmtWRJYfJgGQkKVJh4UoibKpaSHDjWZd1d1GEnkLMdBPhmZcVGV7Df8LXknCM8gAfqE1gtF8Mey8WfZbuq", + "programIdIndex": 15, + "stackHeight": 2 + }, + { + "accounts": [ + 4, + 2, + 10, + 3, + 6, + 8 + ], + "data": "2", + "programIdIndex": 11, + "stackHeight": 3 + }, + { + "accounts": [ + 3 + ], + "data": "84eT", + "programIdIndex": 8, + "stackHeight": 4 + }, + { + "accounts": [ + 4, + 2 + ], + "data": "11112Um5QtBM9RVwhzeb2i4U2mPJ7krjBF48k17qACUVhhTNRzdmH1adRRGPABHBdaEx67", + "programIdIndex": 6, + "stackHeight": 4 + }, + { + "accounts": [ + 2 + ], + "data": "P", + "programIdIndex": 8, + "stackHeight": 4 + }, + { + "accounts": [ + 2, + 3 + ], + "data": "6SsgWxU3VsJsq1Mht5HyhzQLbcTLc5nrKuFyytmLcmRv9", + "programIdIndex": 8, + "stackHeight": 4 + }, + { + "accounts": [ + 3, + 2, + 3 + ], + "data": "ndTgmR9QMvT7W", + "programIdIndex": 8, + "stackHeight": 3 + } + ] + } + ], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y invoke [1]", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y invoke [2]", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y consumed 4505 of 323327 compute units", + "Program return: FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y AA==", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y success", + "Program BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V invoke [2]", + "Program BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V consumed 184250 of 312286 compute units", + "Program BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y invoke [2]", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [3]", + "Program log: CreateIdempotent", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: GetAccountDataSize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2941 of 91911 compute units", + "Program return: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb qgAAAAAAAAA=", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program 11111111111111111111111111111111 invoke [4]", + "Program 11111111111111111111111111111111 success", + "Program log: Initialize the associated token account", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: InitializeImmutableOwner", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 1924 of 84111 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [4]", + "Program log: Instruction: InitializeAccount3", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5175 of 79770 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 24597 of 98798 compute units", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3]", + "Program log: Instruction: MintToChecked", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5383 of 70773 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program log: Warp route transfer completed from origin: 1399811149, recipient: 6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB, remote_amount: 80000000", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y consumed 73912 of 119663 compute units", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y success", + "Program log: Hyperlane inbox processed message 0x95a06dba7265e86a56ad2c2f0fa9e2888cb304f0cd0d2bddbdb4915f5df16f5a", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y consumed 328824 of 361706 compute units", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y success" + ], + "postBalances": [ + 29970800, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "postTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "preBalances": [ + 29983430, + 0, + 0, + 41072, + 92659224, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "G6fWKEBSrDtR8Uzx4kdVRRhrsHZ6zmGX1G2TYMmMgK6u", + "2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf", + "5Py6bEKmK84Wp4Bm9fG9JnjoDazyDrEM4KRrLZLbLexR", + "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "CijxTbPs9JZxTUfo8Hmz2imxzHtKnDFD3kZP3RPy34uJ", + "GKkC5NTFvHkjkPprY4hWbtpsCAt4bhVG9zPx7N8rbSuA", + "11111111111111111111111111111111", + "ComputeBudget111111111111111111111111111111", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "AUiZ4KyQ25f9uRFPJ7GRaYLwFfd8TqL76xYfymWQ7H41", + "BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V", + "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", + "FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y", + "HRmKtAk47FtpiJuNvwZh66CmWkCFuXN18DN4z4b4cRzH", + "HXLdLtBLj3yn384tpZCdN3SMDdN9hDzBsvNxCND3gQCt" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 12, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "L5k7BD", + "programIdIndex": 7, + "stackHeight": null + }, + { + "accounts": [], + "data": "3DTZbgwsozUF", + "programIdIndex": 7, + "stackHeight": null + }, + { + "accounts": [ + 0, + 6, + 5, + 12, + 1, + 17, + 9, + 13, + 16, + 15, + 6, + 17, + 10, + 8, + 11, + 3, + 2, + 4 + ], + "data": "FTTpGG1B19Dvee6GQUXvdRAGVDD2KsGVzEYf41TUxTUZR4AtU9NZiyDkKioWpAgvXfTcn6B3JKbwvQy8n1bWorY2VvWnzwaJivpNKea2HxaSWqZNCJQMUM4CcmeWVnUfjCp8R8V5Pii6RY4MAd66MJLioPNnL9UQYyZ6eT64ncWhuoeLqC8yuESqcsxGRSRmR7cX6fASBoDZVEMxoQ9X4ct9Q2a9PWKivVkTReLZyEHHT4NTTWek13DawFDehydmDcWpLSUJKSmuFwKUisJSTfuzTsgqfSxKtp6KE2hMzVQ46PZpw5XSFqNUp4rGuTYYPcH2uF51wLKNQ8ABY6iXLAe6Lwri7C491RqKvKKM1xcUdSQNNKykNjVcq1pLZ4jKuf2idakmgfACytryMQxAeyJxxZ2d1pDmHxy2kwZTF8LW3quTnxHvaLroQJfr1vjFddfBhnnM4MRuwQnEwhmLcohPRncqcRroByhEwGugYw1XJMvyH8D8sP1MWm9SRKRxSz88QgGfGhtg8eGPVE5fZPnQY46JFUi7JyznxjBoRTjd472aCpP", + "programIdIndex": 14, + "stackHeight": null + } + ], + "recentBlockhash": "5ieYGqrkBLQBp5QgEw1qk9TSM7bh1agZF16RT5nJQsjj" + }, + "signatures": [ + "4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 25153, + "err": null, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN invoke [1]", + "Program log: Instruction: Click", + "Program log: Clicker 9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN consumed 25153 of 200000 compute units", + "Program turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN success" + ], + "postBalances": [ + 992550, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "postTokenBalances": [], + "preBalances": [ + 992600, + 11492, + 11492, + 14212, + 0, + 11152 + ], + "preTokenBalances": [], + "rewards": [], + "status": { + "Ok": null + } + }, + "transaction": { + "message": { + "accountKeys": [ + "9T5ntKpqFJKx32hM2sZrGtSKUzRj4iyq74LrYGsdM8Dp", + "5YDa9bxTHEBsWfERWRxNVAe7NgjGtpRmjtGuMSXjGhdu", + "4SCCH7gkNRBXtY2j1a6rwCfsWdgDTZDap7msk72Rkefo", + "9FXCusMeR26k1LkDixLF2dw1AnBX8SsB2cspSSi3BcKE", + "Sysvar1nstructions1111111111111111111111111", + "turboe9kMc3mSR8BosPkVzoHUfn5RVNzZhkrT2hdGxN" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 4, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [ + 2, + 1, + 3, + 0, + 4 + ], + "data": "9Yid3B3uRXy9", + "programIdIndex": 5, + "stackHeight": null + } + ], + "recentBlockhash": "3veDZBERK9bD5PzCuygjYquZ85aUnU24kRuUwWRzTtkc" + }, + "signatures": [ + "3sTCx7dEzUALDq3D2zkLyftawaxQZBpHaiqtkvSxkd6QUuuuyjgLUvnrhmkMt5j2rVooqqEscJUAEaQB2GHgXgAf" + ] + }, + "version": "legacy" + }, + { + "meta": { + "computeUnitsConsumed": 38067, + "err": { + "InstructionError": [ + 1, + { + "Custom": 5 + } + ] + }, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y invoke [1]", + "Program log: Custom program error: 0x5", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y consumed 38067 of 1400000 compute units", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y failed: custom program error: 0x5" + ], + "postBalances": [ + 3105342080, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "postTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "preBalances": [ + 3105342130, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "preTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "rewards": [], + "status": { + "Err": { + "InstructionError": [ + 1, + { + "Custom": 5 + } + ] + } + } + }, + "transaction": { + "message": { + "accountKeys": [ + "G5FM3UKwcBJ47PwLWLLY1RQpqNtTMgnqnd6nZGcJqaBp", + "2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf", + "5Py6bEKmK84Wp4Bm9fG9JnjoDazyDrEM4KRrLZLbLexR", + "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "CijxTbPs9JZxTUfo8Hmz2imxzHtKnDFD3kZP3RPy34uJ", + "GKkC5NTFvHkjkPprY4hWbtpsCAt4bhVG9zPx7N8rbSuA", + "11111111111111111111111111111111", + "ComputeBudget111111111111111111111111111111", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "AUiZ4KyQ25f9uRFPJ7GRaYLwFfd8TqL76xYfymWQ7H41", + "BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V", + "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", + "FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y", + "HRmKtAk47FtpiJuNvwZh66CmWkCFuXN18DN4z4b4cRzH", + "HXLdLtBLj3yn384tpZCdN3SMDdN9hDzBsvNxCND3gQCt" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 12, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "K1FDJ7", + "programIdIndex": 7, + "stackHeight": null + }, + { + "accounts": [ + 0, + 6, + 5, + 12, + 1, + 17, + 9, + 13, + 16, + 15, + 6, + 17, + 10, + 8, + 11, + 3, + 2, + 4 + ], + "data": "FTTpGG1B19Dvee6GQUXvdRAGVDD2KsGVzEYf41TUxTUZR4AtU9NZiyDkKioWpAgvXfTcn6B3JKbwvQy8n1bWorY2VvWnzwaJivpNKea2HxaSWqZNCJQMUM4CcmeWVnUfjCp8R8V5Pii6RY4MAd66MJLioPNnL9UQYyZ6eT64ncWhuoeLqC8yuESqcsxGRSRmR7cX6fASBoDZVEMxoQ9X4ct9Q2a9PWKivVkTReLZyEHHT4NTTWek13DawFDehydmDcWpLSUJKSmuFwKUisJSTfuzTsgqfSxKtp6KE2hMzVQ46PZpw5XSFqNUp4rGuTYYPcH2uF51wLKNQ8ABY6iXLAe6Lwri7C491RqKvKKM1xcUdSQNNKykNjVcq1pLZ4jKuf2idakmgfACytryMQxAeyJxxZ2d1pDmHxy2kwZTF8LW3quTnxHvaLroQJfr1vjFddfBhnnM4MRuwQnEwhmLcohPRncqcRroByhEwGugYw1XJMvyH8D8sP1MWm9SRKRxSz88QgGfGhtg8eGPVE5fZPnQY46JFUi7JyznxjBoRTjd472aCpP", + "programIdIndex": 14, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "5F5PUWAZcBmuGaejN4qr9BjbXCMNSY2ujQ2eUTmiftYaKEE3VoU5uowttiY73ksqpGM3R4CBB7TFKBP1j3R3EUM9" + ] + }, + "version": "legacy" + } + ] +} \ No newline at end of file diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_reverted_txn.json b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_reverted_txn.json new file mode 100644 index 0000000000..0001db5074 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/delivery_message_reverted_txn.json @@ -0,0 +1,175 @@ +{ + "blockTime": 1734974925, + "meta": { + "computeUnitsConsumed": 38067, + "err": { + "InstructionError": [ + 1, + { + "Custom": 5 + } + ] + }, + "fee": 50, + "innerInstructions": [], + "loadedAddresses": { + "readonly": [], + "writable": [] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y invoke [1]", + "Program log: Custom program error: 0x5", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y consumed 38067 of 1400000 compute units", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y failed: custom program error: 0x5" + ], + "postBalances": [ + 3105342080, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "postTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "preBalances": [ + 3105342130, + 12580, + 20264, + 41072, + 92638960, + 11832, + 1, + 1, + 11152, + 0, + 101150754, + 7277632, + 0, + 11152, + 11152, + 11152, + 78336, + 28492 + ], + "preTokenBalances": [ + { + "accountIndex": 2, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "80000000", + "decimals": 9, + "uiAmount": 0.08, + "uiAmountString": "0.08" + } + } + ], + "rewards": [], + "status": { + "Err": { + "InstructionError": [ + 1, + { + "Custom": 5 + } + ] + } + } + }, + "slot": 35781852, + "transaction": { + "message": { + "accountKeys": [ + "G5FM3UKwcBJ47PwLWLLY1RQpqNtTMgnqnd6nZGcJqaBp", + "2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf", + "5Py6bEKmK84Wp4Bm9fG9JnjoDazyDrEM4KRrLZLbLexR", + "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "CijxTbPs9JZxTUfo8Hmz2imxzHtKnDFD3kZP3RPy34uJ", + "GKkC5NTFvHkjkPprY4hWbtpsCAt4bhVG9zPx7N8rbSuA", + "11111111111111111111111111111111", + "ComputeBudget111111111111111111111111111111", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "6jyr2GWhaTbzjscMz8nNWRuD7Zkng3adCLp8QBeoUHVB", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "AUiZ4KyQ25f9uRFPJ7GRaYLwFfd8TqL76xYfymWQ7H41", + "BgG35GxoaMgmiam3EJzcwivwQ2DTYGPTLfUCg7bhiH6V", + "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", + "FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y", + "HRmKtAk47FtpiJuNvwZh66CmWkCFuXN18DN4z4b4cRzH", + "HXLdLtBLj3yn384tpZCdN3SMDdN9hDzBsvNxCND3gQCt" + ], + "header": { + "numReadonlySignedAccounts": 0, + "numReadonlyUnsignedAccounts": 12, + "numRequiredSignatures": 1 + }, + "instructions": [ + { + "accounts": [], + "data": "K1FDJ7", + "programIdIndex": 7, + "stackHeight": null + }, + { + "accounts": [ + 0, + 6, + 5, + 12, + 1, + 17, + 9, + 13, + 16, + 15, + 6, + 17, + 10, + 8, + 11, + 3, + 2, + 4 + ], + "data": "FTTpGG1B19Dvee6GQUXvdRAGVDD2KsGVzEYf41TUxTUZR4AtU9NZiyDkKioWpAgvXfTcn6B3JKbwvQy8n1bWorY2VvWnzwaJivpNKea2HxaSWqZNCJQMUM4CcmeWVnUfjCp8R8V5Pii6RY4MAd66MJLioPNnL9UQYyZ6eT64ncWhuoeLqC8yuESqcsxGRSRmR7cX6fASBoDZVEMxoQ9X4ct9Q2a9PWKivVkTReLZyEHHT4NTTWek13DawFDehydmDcWpLSUJKSmuFwKUisJSTfuzTsgqfSxKtp6KE2hMzVQ46PZpw5XSFqNUp4rGuTYYPcH2uF51wLKNQ8ABY6iXLAe6Lwri7C491RqKvKKM1xcUdSQNNKykNjVcq1pLZ4jKuf2idakmgfACytryMQxAeyJxxZ2d1pDmHxy2kwZTF8LW3quTnxHvaLroQJfr1vjFddfBhnnM4MRuwQnEwhmLcohPRncqcRroByhEwGugYw1XJMvyH8D8sP1MWm9SRKRxSz88QgGfGhtg8eGPVE5fZPnQY46JFUi7JyznxjBoRTjd472aCpP", + "programIdIndex": 14, + "stackHeight": null + } + ], + "recentBlockhash": "9RgfP18ApUKiWXyVv74ZBCoWX1X8pWb463FrVQCj4oM" + }, + "signatures": [ + "5F5PUWAZcBmuGaejN4qr9BjbXCMNSY2ujQ2eUTmiftYaKEE3VoU5uowttiY73ksqpGM3R4CBB7TFKBP1j3R3EUM9" + ] + }, + "version": "legacy" +} \ No newline at end of file diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_versioned_txn.json b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_versioned_txn.json new file mode 100644 index 0000000000..0fcd409407 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/dispatch_message_versioned_txn.json @@ -0,0 +1,565 @@ +{ + "blockTime": 1734978752, + "meta": { + "computeUnitsConsumed": 285017, + "err": null, + "fee": 50150, + "innerInstructions": [ + { + "index": 4, + "instructions": [ + { + "accounts": [ + 14 + ], + "data": "84eT", + "programIdIndex": 24, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 3 + ], + "data": "11112Um5QtBM9RVwhzeb2i4U2mPJ7krjBF48k17qACUVhhTNRzdmH1adRRGPABHBdaEx67", + "programIdIndex": 9, + "stackHeight": 2 + }, + { + "accounts": [ + 3 + ], + "data": "P", + "programIdIndex": 24, + "stackHeight": 2 + }, + { + "accounts": [ + 3, + 14 + ], + "data": "6U6TaA8c9FiMd3yMvYM3RZr5L251Z6XBhE7CZMpM6UqrA", + "programIdIndex": 24, + "stackHeight": 2 + } + ] + }, + { + "index": 5, + "instructions": [ + { + "accounts": [ + 1, + 22, + 16, + 0 + ], + "data": "iSvRA2gPzQThi", + "programIdIndex": 10, + "stackHeight": 2 + }, + { + "accounts": [ + 17, + 14, + 3, + 15 + ], + "data": "iQVR3BvfMWGrC", + "programIdIndex": 24, + "stackHeight": 2 + } + ] + }, + { + "index": 7, + "instructions": [ + { + "accounts": [ + 3, + 14, + 0, + 0 + ], + "data": "tBUevJEscuw5z", + "programIdIndex": 24, + "stackHeight": 2 + }, + { + "accounts": [ + 19, + 29, + 9, + 26, + 0, + 2, + 5 + ], + "data": "2cRRtjzqbhv2aDpjzg6LXy6C7SLpDEsUatfoywKz3m1ifhrSUVpNtpkHK1dj5rchz1z3j8CtHuW5T2ezWvBJVLET7tCge9vDB2AF5EM8LPUdk1EGpKZam3tQNV1W7xMmt4iDto9DAhMQrbR6uG1Vb66vdH6kjEbHWTMbhUim4BP661Gpk1yyPTHjQUB", + "programIdIndex": 28, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 19 + ], + "data": "3Bxs3zrfFUZbEPqZ", + "programIdIndex": 9, + "stackHeight": 3 + }, + { + "accounts": [ + 0, + 5 + ], + "data": "1111614MkWaU9KqTDJLQwrzvidXGxXXwfY2mfoKeoqQBJrMaZskjDkgQ6pE2yERkoudxWv", + "programIdIndex": 9, + "stackHeight": 3 + }, + { + "accounts": [ + 9, + 0, + 20, + 2, + 6, + 21, + 31 + ], + "data": "6ZKyf8sS97C2Z34TUpXiGQBLPqCXXtBbZ2gHBxwLacXBZ6P8XPoaBUwFzxs1H", + "programIdIndex": 30, + "stackHeight": 2 + }, + { + "accounts": [ + 0, + 21 + ], + "data": "3Bxs46hkTBuBteUP", + "programIdIndex": 9, + "stackHeight": 3 + }, + { + "accounts": [ + 0, + 6 + ], + "data": "11115GPcU8wJysz1fCGMm1QuqnxK4pGnpF8XeC1S6D1r5qH2HggEcqE6oAfk4xFS7paC4J", + "programIdIndex": 9, + "stackHeight": 3 + } + ] + } + ], + "loadedAddresses": { + "readonly": [ + "So11111111111111111111111111111111111111112", + "SysvarRent111111111111111111111111111111111", + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr", + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", + "HXLdLtBLj3yn384tpZCdN3SMDdN9hDzBsvNxCND3gQCt", + "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y", + "HP8WWjbxdeGhW3NRdBpWpARKgphEAQP5htG4AfbXqvRE", + "Hs7KVBU67nBnWhDPZkEFwWqrFMUfJbmY2DQ4gmCZfaZp", + "3Wp4qKkgf4tjXz1soGyTSndCgBPLZFSrZkiDZ8Qp9EEj" + ], + "writable": [ + "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "Du5B9P5uPhZ1nWubRTLrhoh6Va1kpuVXM1FpM7wJSPSu", + "FQjMvPVo9ReLZwbojjBkdjda4kSjdqoRjrARfN9qX9FJ", + "GgHsBMbgswDHEDoMvoYGhqsepjdsxCAjk2W22yEvz1Em", + "FKKDGYumoKjQjVEejff6MD1FpKuBs6SdgAobVdJdE21B", + "FvGvXJf6bd2wx8FxzsYNzd2uHaPy7JTkmuKiVvSTt7jm", + "ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK" + ] + }, + "logMessages": [ + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program ComputeBudget111111111111111111111111111111 invoke [1]", + "Program ComputeBudget111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [1]", + "Program 11111111111111111111111111111111 success", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]", + "Program log: Instruction: InitializeAccount", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3442 of 500000 compute units", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]", + "Program log: CreateIdempotent", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: GetAccountDataSize", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2941 of 488247 compute units", + "Program return: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb qgAAAAAAAAA=", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program 11111111111111111111111111111111 invoke [2]", + "Program 11111111111111111111111111111111 success", + "Program log: Initialize the associated token account", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: InitializeImmutableOwner", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 1924 of 480447 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: InitializeAccount3", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5175 of 476106 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 26000 of 496558 compute units", + "Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success", + "Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc invoke [1]", + "Program log: Instruction: SwapV2", + "Program log: fee_growth: 6962398081", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]", + "Program log: Instruction: TransferChecked", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6239 of 425251 compute units", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: TransferChecked", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 8356 of 410679 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc consumed 71018 of 470558 compute units", + "Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc success", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]", + "Program log: Instruction: CloseAccount", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 2914 of 399540 compute units", + "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y invoke [1]", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]", + "Program log: Instruction: BurnChecked", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 5921 of 376214 compute units", + "Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y invoke [2]", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Protocol fee of 0 paid from 7xkuDw5Lxs5nnVGQTBr65sdwXBRjgmuzXC2hsEfHBhRC to FKKDGYumoKjQjVEejff6MD1FpKuBs6SdgAobVdJdE21B", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Dispatched message to 1399811149, ID 0xdf5b603df4e3e3e318f222cf6c2ea3aea44893dab86ab34d3dd88f42c87b27d0", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y consumed 81465 of 365453 compute units", + "Program return: EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y 31tgPfTj4+MY8iLPbC6jrqRIk9q4arNNPdiPQsh7J9A=", + "Program EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y success", + "Program Hs7KVBU67nBnWhDPZkEFwWqrFMUfJbmY2DQ4gmCZfaZp invoke [2]", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program 11111111111111111111111111111111 invoke [3]", + "Program 11111111111111111111111111111111 success", + "Program log: Paid IGP ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK for 244000 gas for message 0xdf5b…27d0 to 1399811149", + "Program Hs7KVBU67nBnWhDPZkEFwWqrFMUfJbmY2DQ4gmCZfaZp consumed 56083 of 280947 compute units", + "Program Hs7KVBU67nBnWhDPZkEFwWqrFMUfJbmY2DQ4gmCZfaZp success", + "Program log: Warp route transfer completed to destination: 1399811149, recipient: 0x9a83…6889, remote_amount: 17884084", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y consumed 181643 of 396626 compute units", + "Program FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y success", + "Program 11111111111111111111111111111111 invoke [1]", + "Program 11111111111111111111111111111111 success" + ], + "postBalances": [ + 14487952, + 0, + 0, + 20264, + 687888, + 21896, + 18292, + 4187500, + 1, + 1, + 9076640, + 7277632, + 11152, + 11152, + 41072, + 53108, + 41900320071, + 19924, + 0, + 84796, + 9928, + 2660002254, + 1000000000, + 9860, + 11152, + 5095104, + 0, + 28492, + 11152, + 8704, + 11152, + 18700 + ], + "postTokenBalances": [ + { + "accountIndex": 3, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "7xkuDw5Lxs5nnVGQTBr65sdwXBRjgmuzXC2hsEfHBhRC", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "0", + "decimals": 9, + "uiAmount": null, + "uiAmountString": "0" + } + }, + { + "accountIndex": 16, + "mint": "So11111111111111111111111111111111111111112", + "owner": "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "uiTokenAmount": { + "amount": "41900300147", + "decimals": 9, + "uiAmount": 41.900300147, + "uiAmountString": "41.900300147" + } + }, + { + "accountIndex": 17, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "1100478938255", + "decimals": 9, + "uiAmount": 1100.478938255, + "uiAmountString": "1100.478938255" + } + } + ], + "preBalances": [ + 15923196, + 0, + 0, + 0, + 687888, + 0, + 0, + 4182500, + 1, + 1, + 9076640, + 7277632, + 11152, + 11152, + 41072, + 53108, + 41899325071, + 19924, + 0, + 84796, + 9928, + 2659677612, + 1000000000, + 9860, + 11152, + 5095104, + 0, + 28492, + 11152, + 8704, + 11152, + 18700 + ], + "preTokenBalances": [ + { + "accountIndex": 16, + "mint": "So11111111111111111111111111111111111111112", + "owner": "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "uiTokenAmount": { + "amount": "41899305147", + "decimals": 9, + "uiAmount": 41.899305147, + "uiAmountString": "41.899305147" + } + }, + { + "accountIndex": 17, + "mint": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "owner": "E6AFbRkMwidQyBQ872e9kbVT2ZqybmM6dJ2Zaa6sVxJq", + "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "uiTokenAmount": { + "amount": "1100496822339", + "decimals": 9, + "uiAmount": 1100.496822339, + "uiAmountString": "1100.496822339" + } + } + ], + "rewards": [], + "status": { + "Ok": null + } + }, + "slot": 35792433, + "transaction": { + "message": { + "accountKeys": [ + "7xkuDw5Lxs5nnVGQTBr65sdwXBRjgmuzXC2hsEfHBhRC", + "AHE9Hs4nZF9NM1VJZHg61jkFBx5cBVaabAYAJFzPAiCk", + "2xieFW4TnPYwRyCf1aT9m6Xry4rBeCRKyPsScByyiAAG", + "GZKxYbwFzZgPti86aMjFTVtFL3pP4wUq38TfQjpGHqg5", + "AkEJURpBDvPEaQcnDum3BywUB5vLHHLoBLm3z7jmMKtG", + "9g87Di4xiYVvBE5F8Atk8xorbbVD8yKqbdHRkFu5HEgw", + "gJRnC4X1pnctZEzdo67Pwx4wfRw5MLFdTa2ostjGv9C", + "BWbHzqYBnWmU6kRg8Upi61hq3gf5u8F3hB886MBhg7wh", + "ComputeBudget111111111111111111111111111111", + "11111111111111111111111111111111", + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "FJu4E1BDYKVg7aTWdwATZRUvytJZ8ZZ2gQuvPfMWAz9y" + ], + "addressTableLookups": [ + { + "accountKey": "F4omQWQnyM6Fny5CA9KY4xyyNemDrp87ZHXZDwME5M8q", + "readonlyIndexes": [ + 7, + 1, + 3, + 4, + 14, + 15, + 16, + 18, + 21, + 24 + ], + "writableIndexes": [ + 8, + 6, + 9, + 11, + 13, + 17, + 22, + 25 + ] + } + ], + "header": { + "numReadonlySignedAccounts": 1, + "numReadonlyUnsignedAccounts": 6, + "numRequiredSignatures": 3 + }, + "instructions": [ + { + "accounts": [], + "data": "EvSMNP", + "programIdIndex": 8, + "stackHeight": null + }, + { + "accounts": [], + "data": "3gJqkocMWaMm", + "programIdIndex": 8, + "stackHeight": null + }, + { + "accounts": [ + 0, + 1 + ], + "data": "111169tnWyB6yf7otj9gwMZ223az8WhRhw17kSToNJKZLqyX9pDi2Cd13sTA9NPWFfoQpx", + "programIdIndex": 9, + "stackHeight": null + }, + { + "accounts": [ + 1, + 22, + 0, + 23 + ], + "data": "2", + "programIdIndex": 10, + "stackHeight": null + }, + { + "accounts": [ + 0, + 3, + 0, + 14, + 9, + 24 + ], + "data": "2", + "programIdIndex": 11, + "stackHeight": null + }, + { + "accounts": [ + 10, + 24, + 25, + 0, + 15, + 22, + 14, + 1, + 16, + 3, + 17, + 4, + 4, + 4, + 18 + ], + "data": "4AoQRYXBdnCR4Ye4kfVqUSk92cVTu2wqdAePuVxcoJsMUVket7q7Sp2DCT1", + "programIdIndex": 12, + "stackHeight": null + }, + { + "accounts": [ + 1, + 0, + 0 + ], + "data": "A", + "programIdIndex": 10, + "stackHeight": null + }, + { + "accounts": [ + 9, + 26, + 27, + 28, + 19, + 29, + 0, + 2, + 5, + 30, + 20, + 6, + 31, + 21, + 24, + 14, + 3 + ], + "data": "RpjV6TtUSvsqoqZDmaVYK3Bu3EKPjEdZSC4i9viiVTSQ7fcSFrXZVvXuHzpQxzu8MT913h4XokFBcMrqJJrqDufh1zrzR885gUDpnk23", + "programIdIndex": 13, + "stackHeight": null + }, + { + "accounts": [ + 0, + 7 + ], + "data": "3Bxs4PckVVt51W8w", + "programIdIndex": 9, + "stackHeight": null + } + ], + "recentBlockhash": "9BcgXdeCcvL42fcsM9Gszs5Rjg4QvjyCTQZb2AAyrLaC" + }, + "signatures": [ + "Ku7gtQzEztksncHMHYkXq8PNst5rZsznrXMDmVqoQjc7SR4PsXz33qjNMckNcHriCxuhZJGZequo8moNsRP9GZK", + "3koYYZbZiHFBuNiUjFUqHGJw6hw8A8qxudK7v18TVvW9pwzER3XEcWWcMovYok83ihGxMhGxUdW6WbFcdajdWZUU", + "5e5xsKD3s4GWCHpiji2XmioRZG6SWKAYyQb5V7KoTjFueTYxKqbD8QYvWV7iLGJm2fVEZpDx9pY5cRV7Az8Vmk1w" + ] + }, + "version": 0 +} \ No newline at end of file diff --git a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs index d1097b1b08..3d666d3461 100644 --- a/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs +++ b/rust/main/chains/hyperlane-sealevel/src/log_meta_composer/tests.rs @@ -1,13 +1,16 @@ use std::fs; use std::path::PathBuf; -use solana_transaction_status::EncodedTransactionWithStatusMeta; +use hyperlane_core::{LogMeta, U256}; +use solana_transaction_status::{EncodedTransactionWithStatusMeta, UiConfirmedBlock}; use crate::log_meta_composer::{ is_interchain_payment_instruction, is_message_delivery_instruction, is_message_dispatch_instruction, search_transactions, }; -use crate::utils::decode_pubkey; +use crate::utils::{decode_h256, decode_h512, decode_pubkey}; + +use super::LogMetaComposer; #[test] pub fn test_search_dispatched_message_transaction() { @@ -29,6 +32,26 @@ pub fn test_search_dispatched_message_transaction() { assert!(!transaction_hashes.is_empty()); } +#[test] +pub fn test_search_dispatched_message_versioned_transaction() { + // given + let mailbox_program_id = decode_pubkey("EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y").unwrap(); + let dispatched_message_pda_account = + decode_pubkey("9g87Di4xiYVvBE5F8Atk8xorbbVD8yKqbdHRkFu5HEgw").unwrap(); + let transactions = transactions(&read_json("dispatch_message_versioned_txn.json")); + + // when + let transaction_hashes = search_transactions( + transactions, + &mailbox_program_id, + &dispatched_message_pda_account, + is_message_dispatch_instruction, + ); + + // then + assert!(!transaction_hashes.is_empty()); +} + #[test] pub fn test_search_delivered_message_transaction() { // given @@ -49,6 +72,27 @@ pub fn test_search_delivered_message_transaction() { assert!(!transaction_hashes.is_empty()); } +#[test] +pub fn test_search_delivered_message_reverted_transaction() { + // given + let mailbox_program_id = decode_pubkey("EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y").unwrap(); + // From the successful version of the delivery in https://eclipsescan.xyz/tx/4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb + let delivered_message_pda_account = + decode_pubkey("2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf").unwrap(); + let transactions = transactions(&read_json("delivery_message_reverted_txn.json")); + + // when + let transaction_hashes = search_transactions( + transactions, + &mailbox_program_id, + &delivered_message_pda_account, + is_message_delivery_instruction, + ); + + // then + assert!(transaction_hashes.is_empty()); +} + #[test] pub fn test_search_interchain_payment_transaction() { // given @@ -70,6 +114,48 @@ pub fn test_search_interchain_payment_transaction() { assert!(!transaction_hashes.is_empty()); } +#[test] +fn test_log_meta_block_with_multiple_txs_only_one_successful() { + // This test case uses an example of a block where delivery was attempted + // in 2 transactions, but only one was successful. + // Successful: https://eclipsescan.xyz/tx/4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb + // Reverted: https://eclipsescan.xyz/tx/5F5PUWAZcBmuGaejN4qr9BjbXCMNSY2ujQ2eUTmiftYaKEE3VoU5uowttiY73ksqpGM3R4CBB7TFKBP1j3R3EUM9 + + // given + let mailbox_program_id = decode_pubkey("EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y").unwrap(); + let composer = LogMetaComposer::new( + mailbox_program_id, + "message delivery".to_owned(), + is_message_delivery_instruction, + ); + // From the successful version of the delivery in https://eclipsescan.xyz/tx/4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb + let delivered_message_pda_account = + decode_pubkey("2BZdvWiiTfeeUZKAK9R8UPrV8s8HLNGbdEUtjED52ayf").unwrap(); + let block = serde_json::from_str::(&read_json( + "delivery_message_block_multiple_txs_one_successful.json", + )) + .unwrap(); + let log_index = U256::zero(); + let pda_slot = block.block_height.unwrap(); + let blockhash = decode_h256(&block.blockhash).unwrap(); + + // when + let log_meta = composer + .log_meta(block, log_index, &delivered_message_pda_account, &pda_slot) + .unwrap(); + + // then + assert_eq!(log_meta, LogMeta { + address: mailbox_program_id.to_bytes().into(), + block_number: pda_slot, + block_hash: blockhash, + // The successful transaction and its index in the block + transaction_id: decode_h512("4atym7S78qpT4k9mUFWc2tu7KAHcqUxDn8fxP7RL8utooTi6frJtq9xFbM6MSSqDffTGpRSmEAMtCYisRe5m8KXb").unwrap(), + transaction_index: 33, + log_index, + }); +} + fn read_json(path: &str) -> String { let relative = PathBuf::new().join("src/log_meta_composer/").join(path); let absolute = fs::canonicalize(relative).expect("cannot find path"); diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index f81a40bea3..6fa159c2cf 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -625,7 +625,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'd84d8da-20241217-172447', + tag: '3812453-20241224-020703', }, resources: scraperResources, }, From 8834a8c922027887597e5dfbf7715dbe6c5c6801 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 26 Dec 2024 16:02:54 +0000 Subject: [PATCH 11/81] feat: bump relayer memory usage to 20GB, start using new SVM submission in relayer (#5063) ### Description - deploys #4959 - Sets a small priority fee for Eclipse following some recent spikes there, https://discord.com/channels/935678348330434570/1320851852157255701 for context - Makes the relayer request 20GB of memory, forcing relayers to have their own node in our bigger node pool (capacity 29 GB) - Driveby to use G (Gigabytes) instead of Gi (Gibibytes) to match what GCP uses in their UI, also a bit more intuitive - Added a `--concurrency ` flag that can be used when deploying agents. Especially useful when releasing to all validators, which we have tons of now. - Concurrently refetching remote repositories on helm poses issues, so I made this not happen by default anymore. It's not configurable at the CLI level to enable it, but we have the ability to easily add it later. Because our agent deploy doesn't actually require any remote helm repos, it's not necessary - already rolled out ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .changeset/stupid-seahorses-yell.md | 5 ++++ .../config/environments/mainnet3/agent.ts | 23 +++++++++++---- typescript/infra/scripts/agent-utils.ts | 7 +++++ typescript/infra/scripts/agents/utils.ts | 22 +++++++++++---- typescript/infra/src/helloworld/kathy.ts | 8 ++++-- typescript/infra/src/utils/helm.ts | 28 ++++++++++++++++--- typescript/utils/src/async.ts | 2 ++ 7 files changed, 78 insertions(+), 17 deletions(-) create mode 100644 .changeset/stupid-seahorses-yell.md diff --git a/.changeset/stupid-seahorses-yell.md b/.changeset/stupid-seahorses-yell.md new file mode 100644 index 0000000000..61230350a4 --- /dev/null +++ b/.changeset/stupid-seahorses-yell.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/utils': patch +--- + +Require concurrency > 0 for concurrentMap diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 6fa159c2cf..32259150d6 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -414,6 +414,19 @@ const sealevelPriorityFeeOracleConfigGetter = ( // URL is auto populated by the external secrets in the helm chart url: '', }; + } else if (chain === 'eclipsemainnet') { + // As of Dec 23: + // Eclipse has recently seen some increased usage with their referral program, + // and we have had intermittent issues landing txs. Not many txs on Eclipse use + // priority fees, so we use a low priority fee. + return { + type: AgentSealevelPriorityFeeOracleType.Constant, + // 2000 micro lamports of ETH, which at a compute unit limit of 400K + // and an ETH price of $3450 (Dec 23, 2024) comes to about $0.00276 USD: + // >>> (((2000 / 1e6) * 400000) / 1e9) * 3450 + // 0.00276 + fee: '2000', + }; } // For all other chains, we use the constant fee oracle with a fee of 0 @@ -530,21 +543,21 @@ const metricAppContextsGetter = (): MetricAppContext[] => { const relayerResources = { requests: { cpu: '14000m', - memory: '15Gi', + memory: '20G', }, }; const validatorResources = { requests: { cpu: '500m', - memory: '1Gi', + memory: '1G', }, }; const scraperResources = { requests: { cpu: '2000m', - memory: '4Gi', + memory: '4G', }, }; @@ -605,7 +618,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '7c0c967-20241218-173053', + tag: 'e9911bb-20241223-211526', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, @@ -640,7 +653,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '7c0c967-20241218-173053', + tag: 'e9911bb-20241223-211526', }, blacklist, // We're temporarily (ab)using the RC relayer as a way to increase diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index e60d137f95..1832889cac 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -261,6 +261,13 @@ export function withConcurrentDeploy(args: Argv) { .default('concurrentDeploy', false); } +export function withConcurrency(args: Argv) { + return args + .describe('concurrency', 'Number of concurrent deploys') + .number('concurrency') + .default('concurrency', 1); +} + export function withRpcUrls(args: Argv) { return args .describe( diff --git a/typescript/infra/scripts/agents/utils.ts b/typescript/infra/scripts/agents/utils.ts index fa3a1da4ce..9621705a00 100644 --- a/typescript/infra/scripts/agents/utils.ts +++ b/typescript/infra/scripts/agents/utils.ts @@ -1,3 +1,5 @@ +import { concurrentMap } from '@hyperlane-xyz/utils'; + import { AgentHelmManager, RelayerHelmManager, @@ -7,12 +9,13 @@ import { import { RootAgentConfig } from '../../src/config/agent/agent.js'; import { EnvironmentConfig } from '../../src/config/environment.js'; import { Role } from '../../src/roles.js'; -import { HelmCommand } from '../../src/utils/helm.js'; +import { HelmCommand, HelmManager } from '../../src/utils/helm.js'; import { assertCorrectKubeContext, getArgs, withAgentRolesRequired, withChains, + withConcurrency, withContext, } from '../agent-utils.js'; import { getConfigsBasedOnArgs } from '../core-utils.js'; @@ -24,6 +27,7 @@ export class AgentCli { initialized = false; dryRun = false; chains?: string[]; + concurrency = 1; public async runHelmCommand(command: HelmCommand) { await this.init(); @@ -63,15 +67,20 @@ export class AgentCli { console.log('Dry run values:\n', JSON.stringify(values, null, 2)); } - for (const m of Object.values(managers)) { - await m.runHelmCommand(command, this.dryRun); - } + await concurrentMap( + this.concurrency, + Object.entries(managers), + async ([key, manager]) => { + console.log(`Running helm command for ${key}`); + await manager.runHelmCommand(command, { dryRun: this.dryRun }); + }, + ); } protected async init() { if (this.initialized) return; - const argv = await withChains( - withAgentRolesRequired(withContext(getArgs())), + const argv = await withConcurrency( + withChains(withAgentRolesRequired(withContext(getArgs()))), ) .describe('dry-run', 'Run through the steps without making any changes') .boolean('dry-run').argv; @@ -92,5 +101,6 @@ export class AgentCli { this.dryRun = argv.dryRun || false; this.initialized = true; this.chains = argv.chains; + this.concurrency = argv.concurrency; } } diff --git a/typescript/infra/src/helloworld/kathy.ts b/typescript/infra/src/helloworld/kathy.ts index 47dafc851c..dbb8aded61 100644 --- a/typescript/infra/src/helloworld/kathy.ts +++ b/typescript/infra/src/helloworld/kathy.ts @@ -15,6 +15,7 @@ import { import { Role } from '../roles.js'; import { HelmCommand, + HelmCommandOptions, HelmManager, HelmValues, helmifyValues, @@ -90,7 +91,10 @@ export class KathyHelmManager extends HelmManager { }; } - async runHelmCommand(action: HelmCommand, dryRun?: boolean): Promise { + async runHelmCommand( + action: HelmCommand, + options?: HelmCommandOptions, + ): Promise { // If using AWS keys, ensure the Kathy user and key has been created if (this.agentConfig.aws) { const awsUser = new AgentAwsUser( @@ -112,6 +116,6 @@ export class KathyHelmManager extends HelmManager { ); await kathyKey.createIfNotExists(); - super.runHelmCommand(action, dryRun); + await super.runHelmCommand(action, options); } } diff --git a/typescript/infra/src/utils/helm.ts b/typescript/infra/src/utils/helm.ts index 4ed4cb478f..4bd23f1047 100644 --- a/typescript/infra/src/utils/helm.ts +++ b/typescript/infra/src/utils/helm.ts @@ -90,8 +90,17 @@ export function getDeployableHelmChartName(helmChartConfig: HelmChartConfig) { return helmChartConfig.name; } -export function buildHelmChartDependencies(chartPath: string) { - return execCmd(`cd ${chartPath} && helm dependency build`, {}, false, true); +export function buildHelmChartDependencies( + chartPath: string, + updateRepoCache: boolean, +) { + const flags = updateRepoCache ? '' : '--skip-refresh'; + return execCmd( + `cd ${chartPath} && helm dependency build ${flags}`, + {}, + false, + true, + ); } // Convenience function to remove a helm release without having a HelmManger for it. @@ -101,6 +110,11 @@ export function removeHelmRelease(releaseName: string, namespace: string) { export type HelmValues = Record; +export interface HelmCommandOptions { + dryRun?: boolean; + updateRepoCache?: boolean; +} + export abstract class HelmManager { abstract readonly helmReleaseName: string; abstract readonly helmChartPath: string; @@ -112,7 +126,13 @@ export abstract class HelmManager { */ abstract helmValues(): Promise; - async runHelmCommand(action: HelmCommand, dryRun?: boolean): Promise { + async runHelmCommand( + action: HelmCommand, + options?: HelmCommandOptions, + ): Promise { + const dryRun = options?.dryRun ?? false; + const updateRepoCache = options?.updateRepoCache ?? false; + const cmd = ['helm', action]; if (dryRun) cmd.push('--dry-run'); @@ -142,7 +162,7 @@ export abstract class HelmManager { } } - await buildHelmChartDependencies(this.helmChartPath); + await buildHelmChartDependencies(this.helmChartPath, updateRepoCache); cmd.push( this.helmReleaseName, this.helmChartPath, diff --git a/typescript/utils/src/async.ts b/typescript/utils/src/async.ts index f9bda74eb1..505318e32a 100644 --- a/typescript/utils/src/async.ts +++ b/typescript/utils/src/async.ts @@ -1,4 +1,5 @@ import { rootLogger } from './logging.js'; +import { assert } from './validation.js'; /** * Return a promise that resolves in ms milliseconds. @@ -159,6 +160,7 @@ export async function concurrentMap( mapFn: (val: A, idx: number) => Promise, ): Promise { let res: B[] = []; + assert(concurrency > 0, 'concurrency must be greater than 0'); for (let i = 0; i < xs.length; i += concurrency) { const remaining = xs.length - i; const sliceSize = Math.min(remaining, concurrency); From ea9aeb1f78d985d275e868175f2b1e44aa53bc20 Mon Sep 17 00:00:00 2001 From: Kunal Arora <55632507+aroralanuk@users.noreply.github.com> Date: Thu, 26 Dec 2024 23:05:48 +0530 Subject: [PATCH 12/81] feat(relayer): relayer exposes latest tree index as metric (#5074) ### Description - Added `latest_tree_insertion_count` to CoreMetrics which can then be imported to Grafana. - In the `MerkleTreeProcessor`, we set this metric via `max_leaf_index_gauge` to reflect the latest leaf index processed and inserted locally to the tree. ### Drive-by changes none ### Related issues - fixes https://github.com/hyperlane-xyz/issues/issues/1390 ### Backward compatibility Yes ### Testing Manual --- .../relayer/src/merkle_tree/processor.rs | 20 ++++++++++--------- rust/main/agents/relayer/src/relayer.rs | 2 +- rust/main/hyperlane-base/src/metrics/core.rs | 20 +++++++++++++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/rust/main/agents/relayer/src/merkle_tree/processor.rs b/rust/main/agents/relayer/src/merkle_tree/processor.rs index 9ddcc2ee0c..e12a7fc343 100644 --- a/rust/main/agents/relayer/src/merkle_tree/processor.rs +++ b/rust/main/agents/relayer/src/merkle_tree/processor.rs @@ -7,7 +7,10 @@ use std::{ use async_trait::async_trait; use derive_new::new; use eyre::Result; -use hyperlane_base::db::{HyperlaneDb, HyperlaneRocksDB}; +use hyperlane_base::{ + db::{HyperlaneDb, HyperlaneRocksDB}, + CoreMetrics, +}; use hyperlane_core::{HyperlaneDomain, MerkleTreeInsertion}; use prometheus::IntGauge; use tokio::sync::RwLock; @@ -71,8 +74,9 @@ impl MerkleTreeProcessor { .retrieve_merkle_tree_insertion_by_leaf_index(&self.leaf_index)? { // Update the metrics + // we assume that leaves are inserted in order so this will be monotonically increasing self.metrics - .max_leaf_index_gauge + .latest_leaf_index_gauge .set(insertion.index() as i64); Some(insertion) } else { @@ -85,17 +89,15 @@ impl MerkleTreeProcessor { #[derive(Debug)] pub struct MerkleTreeProcessorMetrics { - max_leaf_index_gauge: IntGauge, + latest_leaf_index_gauge: IntGauge, } impl MerkleTreeProcessorMetrics { - pub fn new() -> Self { + pub fn new(metrics: &CoreMetrics, origin: &HyperlaneDomain) -> Self { Self { - max_leaf_index_gauge: IntGauge::new( - "max_leaf_index_gauge", - "The max merkle tree leaf index", - ) - .unwrap(), + latest_leaf_index_gauge: metrics + .latest_leaf_index() + .with_label_values(&[origin.name()]), } } } diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index 6bd1a63a8d..b1f013b6ae 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -587,7 +587,7 @@ impl Relayer { origin: &HyperlaneDomain, task_monitor: TaskMonitor, ) -> Instrumented> { - let metrics = MerkleTreeProcessorMetrics::new(); + let metrics = MerkleTreeProcessorMetrics::new(&self.core.metrics, origin); let merkle_tree_processor = MerkleTreeProcessor::new( self.dbs.get(origin).unwrap().clone(), metrics, diff --git a/rust/main/hyperlane-base/src/metrics/core.rs b/rust/main/hyperlane-base/src/metrics/core.rs index 5603ece225..d3cbaf3db4 100644 --- a/rust/main/hyperlane-base/src/metrics/core.rs +++ b/rust/main/hyperlane-base/src/metrics/core.rs @@ -38,6 +38,7 @@ pub struct CoreMetrics { span_counts: IntCounterVec, span_events: IntCounterVec, last_known_message_nonce: IntGaugeVec, + latest_leaf_index: IntGaugeVec, submitter_queue_length: IntGaugeVec, operations_processed_count: IntCounterVec, @@ -112,6 +113,16 @@ impl CoreMetrics { registry )?; + let latest_leaf_index = register_int_gauge_vec_with_registry!( + opts!( + namespaced!("latest_leaf_index"), + "Latest leaf index inserted into the merkle tree", + const_labels_ref + ), + &["origin"], + registry + )?; + let observed_validator_latest_index = register_int_gauge_vec_with_registry!( opts!( namespaced!("observed_validator_latest_index"), @@ -177,6 +188,7 @@ impl CoreMetrics { span_counts, span_events, last_known_message_nonce, + latest_leaf_index, submitter_queue_length, @@ -309,6 +321,14 @@ impl CoreMetrics { self.last_known_message_nonce.clone() } + /// Reports the current highest leaf index which was inserted into the merkle tree. + /// + /// Labels: + /// - `origin`: Origin chain the leaf index is being tracked at. + pub fn latest_leaf_index(&self) -> IntGaugeVec { + self.latest_leaf_index.clone() + } + /// Latest message nonce in the validator. /// /// Phase: From 234704da39388eaa036b540170ace9449644abb7 Mon Sep 17 00:00:00 2001 From: xeno097 Date: Thu, 26 Dec 2024 15:13:25 -0400 Subject: [PATCH 13/81] test: cli e2e warp init command tests (#5077) ### Description Adds e2e tests for the `warp init` command ### Drive-by changes - ### Related issues - ### Backward compatibility - YES ### Testing - E2E --- .github/workflows/test.yml | 1 + typescript/cli/src/tests/commands/helpers.ts | 45 +++- typescript/cli/src/tests/commands/warp.ts | 16 +- .../cli/src/tests/warp-init.e2e-test.ts | 205 ++++++++++++++++++ 4 files changed, 262 insertions(+), 5 deletions(-) create mode 100644 typescript/cli/src/tests/warp-init.e2e-test.ts diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d2e5f9a40b..5235c9dd16 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -130,6 +130,7 @@ jobs: - core-deploy - core-read - relay + - warp-init - warp-read - warp-apply - warp-deploy diff --git a/typescript/cli/src/tests/commands/helpers.ts b/typescript/cli/src/tests/commands/helpers.ts index 7853815459..66f8f2e7f4 100644 --- a/typescript/cli/src/tests/commands/helpers.ts +++ b/typescript/cli/src/tests/commands/helpers.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers'; -import { $ } from 'zx'; +import { $, ProcessPromise } from 'zx'; import { ERC20Test__factory, ERC4626Test__factory } from '@hyperlane-xyz/core'; import { ChainAddresses } from '@hyperlane-xyz/registry'; @@ -8,7 +8,7 @@ import { WarpCoreConfig, WarpCoreConfigSchema, } from '@hyperlane-xyz/sdk'; -import { Address } from '@hyperlane-xyz/utils'; +import { Address, sleep } from '@hyperlane-xyz/utils'; import { getContext } from '../../context/context.js'; import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js'; @@ -44,6 +44,39 @@ export const WARP_CORE_CONFIG_PATH_2 = `${REGISTRY_PATH}/deployments/warp_routes export const DEFAULT_E2E_TEST_TIMEOUT = 100_000; // Long timeout since these tests can take a while +export enum KeyBoardKeys { + ARROW_DOWN = '\x1b[B', + ARROW_UP = '\x1b[A', + ENTER = '\n', + TAB = '\t', +} + +export async function asyncStreamInputWrite( + stream: NodeJS.WritableStream, + data: string | Buffer, +): Promise { + stream.write(data); + // Adding a slight delay to allow the buffer to update the output + await sleep(500); +} + +export async function selectAnvil2AndAnvil3( + stream: ProcessPromise, +): Promise { + // Scroll down through the mainnet chains list and select anvil2 + await asyncStreamInputWrite( + stream.stdin, + `${KeyBoardKeys.ARROW_DOWN.repeat(3)}${KeyBoardKeys.TAB}`, + ); + // Scroll down through the mainnet chains list again and select anvil3 + await asyncStreamInputWrite( + stream.stdin, + `${KeyBoardKeys.ARROW_DOWN.repeat(2)}${KeyBoardKeys.TAB}${ + KeyBoardKeys.ENTER + }`, + ); +} + /** * Retrieves the deployed Warp address from the Warp core config. */ @@ -154,7 +187,11 @@ export async function getDomainId( return String(chainMetadata?.domainId); } -export async function deployToken(privateKey: string, chain: string) { +export async function deployToken( + privateKey: string, + chain: string, + decimals = 18, +) { const { multiProvider } = await getContext({ registryUri: REGISTRY_PATH, registryOverrideUri: '', @@ -166,7 +203,7 @@ export async function deployToken(privateKey: string, chain: string) { const token = await new ERC20Test__factory( multiProvider.getSigner(chain), - ).deploy('token', 'token', '100000000000000000000', 18); + ).deploy('token', 'token', '100000000000000000000', decimals); await token.deployed(); return token; diff --git a/typescript/cli/src/tests/commands/warp.ts b/typescript/cli/src/tests/commands/warp.ts index dc80b6ad24..467446e045 100644 --- a/typescript/cli/src/tests/commands/warp.ts +++ b/typescript/cli/src/tests/commands/warp.ts @@ -1,4 +1,4 @@ -import { $ } from 'zx'; +import { $, ProcessPromise } from 'zx'; import { WarpRouteDeployConfig } from '@hyperlane-xyz/sdk'; @@ -8,6 +8,20 @@ import { ANVIL_KEY, REGISTRY_PATH, getDeployedWarpAddress } from './helpers.js'; $.verbose = true; +/** + * Deploys the Warp route to the specified chain using the provided config. + */ +export function hyperlaneWarpInit(warpCorePath: string): ProcessPromise { + // --overrides is " " to allow local testing to work + return $`yarn workspace @hyperlane-xyz/cli run hyperlane warp init \ + --registry ${REGISTRY_PATH} \ + --overrides " " \ + --out ${warpCorePath} \ + --key ${ANVIL_KEY} \ + --verbosity debug \ + --yes`; +} + /** * Deploys the Warp route to the specified chain using the provided config. */ diff --git a/typescript/cli/src/tests/warp-init.e2e-test.ts b/typescript/cli/src/tests/warp-init.e2e-test.ts new file mode 100644 index 0000000000..b3314a30a9 --- /dev/null +++ b/typescript/cli/src/tests/warp-init.e2e-test.ts @@ -0,0 +1,205 @@ +import { expect } from 'chai'; +import { Wallet } from 'ethers'; + +import { ChainAddresses } from '@hyperlane-xyz/registry'; +import { + ChainMap, + ChainName, + TokenType, + WarpRouteDeployConfig, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { readYamlOrJson } from '../utils/files.js'; + +import { + ANVIL_KEY, + CHAIN_NAME_2, + CHAIN_NAME_3, + CORE_CONFIG_PATH, + DEFAULT_E2E_TEST_TIMEOUT, + KeyBoardKeys, + WARP_CONFIG_PATH_2, + asyncStreamInputWrite, + deployOrUseExistingCore, + deployToken, + selectAnvil2AndAnvil3, +} from './commands/helpers.js'; +import { hyperlaneWarpInit } from './commands/warp.js'; + +describe('hyperlane warp init e2e tests', async function () { + this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT); + + let chain2Addresses: ChainAddresses = {}; + let chain3Addresses: ChainAddresses = {}; + let initialOwnerAddress: Address; + let chainMapAddresses: ChainMap = {}; + + before(async function () { + [chain2Addresses, chain3Addresses] = await Promise.all([ + deployOrUseExistingCore(CHAIN_NAME_2, CORE_CONFIG_PATH, ANVIL_KEY), + deployOrUseExistingCore(CHAIN_NAME_3, CORE_CONFIG_PATH, ANVIL_KEY), + ]); + + chainMapAddresses = { + [CHAIN_NAME_2]: chain2Addresses, + [CHAIN_NAME_3]: chain3Addresses, + }; + + const wallet = new Wallet(ANVIL_KEY); + initialOwnerAddress = wallet.address; + }); + + describe('hyperlane warp init --yes', () => { + function assertWarpConfig( + warpConfig: WarpRouteDeployConfig, + chainMapAddresses: ChainMap, + chainName: ChainName, + ) { + expect(warpConfig[chainName]).not.to.be.undefined; + + const chain2TokenConfig = warpConfig[chainName]; + expect(chain2TokenConfig.mailbox).equal( + chainMapAddresses[chainName].mailbox, + ); + expect(chain2TokenConfig.owner).equal(initialOwnerAddress); + expect(chain2TokenConfig.type).equal(TokenType.native); + } + + it('it should generate a warp deploy config with a single chain', async function () { + const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); + + for await (const out of output.stdout) { + const currentLine: string = out.toString(); + + if ( + currentLine.includes('Creating a new warp route deployment config...') + ) { + // Select mainnet chains + await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); + } else if (currentLine.includes('--Mainnet Chains--')) { + // Scroll down through the mainnet chains list and select anvil2 + await asyncStreamInputWrite( + output.stdin, + `${KeyBoardKeys.ARROW_DOWN.repeat(3)}${KeyBoardKeys.TAB}${ + KeyBoardKeys.ENTER + }`, + ); + } else if (currentLine.includes('token type')) { + // Scroll up through the token type list and select native + await asyncStreamInputWrite( + output.stdin, + `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, + ); + } else if (currentLine.includes('Detected owner address as')) { + // Confirm owner prompts + await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); + } + } + + await output; + + const warpConfig: WarpRouteDeployConfig = + readYamlOrJson(WARP_CONFIG_PATH_2); + + assertWarpConfig(warpConfig, chainMapAddresses, CHAIN_NAME_2); + }); + + it('it should generate a warp deploy config with a 2 chains warp route (native->native)', async function () { + const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); + + for await (const out of output.stdout) { + const currentLine: string = out.toString(); + + if ( + currentLine.includes('Creating a new warp route deployment config...') + ) { + // Select mainnet chains + await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); + } else if (currentLine.includes('--Mainnet Chains--')) { + await selectAnvil2AndAnvil3(output); + } else if (currentLine.match(/Select .+?'s token type/)) { + // Scroll up through the token type list and select native + await asyncStreamInputWrite( + output.stdin, + `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, + ); + } else if (currentLine.includes('Detected owner address as')) { + // Confirm owner prompts + await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); + } + } + + await output; + + const warpConfig: WarpRouteDeployConfig = + readYamlOrJson(WARP_CONFIG_PATH_2); + + [CHAIN_NAME_2, CHAIN_NAME_3].map((chainName) => + assertWarpConfig(warpConfig, chainMapAddresses, chainName), + ); + }); + + it('it should generate a warp deploy config with a 2 chains warp route (collateral->synthetic)', async function () { + const erc20Token = await deployToken(ANVIL_KEY, CHAIN_NAME_2, 6); + + const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); + + let tokenStep = 0; + for await (const out of output.stdout) { + const currentLine: string = out.toString(); + + if ( + currentLine.includes('Creating a new warp route deployment config...') + ) { + // Select mainnet chains + await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); + } else if (currentLine.includes('--Mainnet Chains--')) { + await selectAnvil2AndAnvil3(output); + } else if ( + currentLine.includes('Enter the existing token address on chain') + ) { + await asyncStreamInputWrite( + output.stdin, + `${erc20Token.address}${KeyBoardKeys.ENTER}`, + ); + } else if (currentLine.match(/Select .+?'s token type/)) { + if (tokenStep === 0) { + // Scroll down through the token type list and select collateral + await asyncStreamInputWrite( + output.stdin, + `${KeyBoardKeys.ARROW_DOWN.repeat(4)}${KeyBoardKeys.ENTER}`, + ); + } else if (tokenStep === 1) { + // Select the synthetic token type + await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); + } + tokenStep++; + } else if (currentLine.includes('Detected owner address as')) { + // Confirm owner prompts + await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); + } + } + + await output; + + const warpConfig: WarpRouteDeployConfig = + readYamlOrJson(WARP_CONFIG_PATH_2); + + expect(warpConfig[CHAIN_NAME_2]).not.to.be.undefined; + + const chain2TokenConfig = warpConfig[CHAIN_NAME_2]; + expect(chain2TokenConfig.mailbox).equal(chain2Addresses.mailbox); + expect(chain2TokenConfig.owner).equal(initialOwnerAddress); + expect(chain2TokenConfig.type).equal(TokenType.collateral); + expect((chain2TokenConfig as any).token).equal(erc20Token.address); + + expect(warpConfig[CHAIN_NAME_3]).not.to.be.undefined; + + const chain3TokenConfig = warpConfig[CHAIN_NAME_3]; + expect(chain3TokenConfig.mailbox).equal(chain3Addresses.mailbox); + expect(chain3TokenConfig.owner).equal(initialOwnerAddress); + expect(chain3TokenConfig.type).equal(TokenType.synthetic); + }); + }); +}); From beaf8727e7d7a067b1e988c8bb0a46d7a235e7fe Mon Sep 17 00:00:00 2001 From: Kunal Arora <55632507+aroralanuk@users.noreply.github.com> Date: Sat, 28 Dec 2024 02:19:38 +0530 Subject: [PATCH 14/81] feat: RELAYER UPDATE - update hyperlane,neutron context to tag `234704d-20241226-192528` (#5082) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/agent.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 32259150d6..1cbc6d1d24 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -618,7 +618,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'e9911bb-20241223-211526', + tag: '234704d-20241226-192528', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, @@ -653,7 +653,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'e9911bb-20241223-211526', + tag: '234704d-20241226-192528', }, blacklist, // We're temporarily (ab)using the RC relayer as a way to increase @@ -687,7 +687,7 @@ const neutron: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '25a927d-20241114-171323', + tag: '234704d-20241226-192528', }, blacklist, gasPaymentEnforcement, From de119065659fe06325b1699e8de3342fa1cdda60 Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Fri, 27 Dec 2024 16:36:54 -0500 Subject: [PATCH 15/81] chore: Export missing token maps from the SDK (#5083) ### Description Export TOKEN_STANDARD_TO_PROVIDER_TYPE, XERC20_STANDARDS, and MINT_LIMITED_STANDARDS maps ### Backward compatibility Yes --- .changeset/spotty-bees-worry.md | 5 +++ typescript/sdk/src/index.ts | 55 +++++++++++++++++---------------- 2 files changed, 34 insertions(+), 26 deletions(-) create mode 100644 .changeset/spotty-bees-worry.md diff --git a/.changeset/spotty-bees-worry.md b/.changeset/spotty-bees-worry.md new file mode 100644 index 0000000000..7697c5fd9b --- /dev/null +++ b/.changeset/spotty-bees-worry.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': patch +--- + +Export TOKEN_STANDARD_TO_PROVIDER_TYPE, XERC20_STANDARDS, and MINT_LIMITED_STANDARDS maps diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index 87e524110e..68b7a6b338 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -19,12 +19,12 @@ export { } from './consts/multisigIsm.js'; export { SEALEVEL_SPL_NOOP_ADDRESS } from './consts/sealevel.js'; export { - TestChainName, multiProtocolTestChainMetadata, test1, test2, test3, testChainMetadata, + TestChainName, testChains, testCosmosChain, testSealevelChain, @@ -220,13 +220,13 @@ export { AgentSignerHexKey, AgentSignerKeyType, AgentSignerNode, + buildAgentConfig, GasPaymentEnforcement, GasPaymentEnforcementPolicyType, RelayerConfig, RpcConsensusType, ScraperConfig, ValidatorConfig, - buildAgentConfig, } from './metadata/agentConfig.js'; export { ChainMetadataManager, @@ -242,15 +242,15 @@ export { EthJsonRpcBlockParameterTag, ExplorerFamily, ExplorerFamilyValue, - NativeToken, - RpcUrl, - RpcUrlSchema, getChainIdNumber, getDomainId, getReorgPeriod, isValidChainMetadata, mergeChainMetadata, mergeChainMetadataMap, + NativeToken, + RpcUrl, + RpcUrlSchema, } from './metadata/chainMetadataTypes.js'; export { ZChainName, ZHash } from './metadata/customZodTypes.js'; export { @@ -305,9 +305,6 @@ export { MultiProviderOptions, } from './providers/MultiProvider.js'; export { - ProviderBuilderFn, - ProviderBuilderMap, - TypedProviderBuilderFn, defaultEthersV5ProviderBuilder, defaultFuelProviderBuilder, defaultProviderBuilder, @@ -315,6 +312,9 @@ export { defaultSolProviderBuilder, defaultViemProviderBuilder, protocolToDefaultProviderBuilder, + ProviderBuilderFn, + ProviderBuilderMap, + TypedProviderBuilderFn, } from './providers/providerBuilders.js'; export { CosmJsContract, @@ -354,9 +354,9 @@ export { HyperlaneEtherscanProvider } from './providers/SmartProvider/HyperlaneE export { HyperlaneJsonRpcProvider } from './providers/SmartProvider/HyperlaneJsonRpcProvider.js'; export { AllProviderMethods, + excludeProviderMethods, IProviderMethods, ProviderMethod, - excludeProviderMethods, } from './providers/SmartProvider/ProviderMethods.js'; export { HyperlaneSmartProvider } from './providers/SmartProvider/SmartProvider.js'; export { @@ -418,13 +418,14 @@ export { export { ChainGasOracleParams, GasPriceConfig, - NativeTokenPriceConfig, getCosmosChainGasPrice, getGasPrice, getLocalStorageGasOracleConfig, getTokenExchangeRateFromValues, + NativeTokenPriceConfig, } from './gas/utils.js'; export { GcpValidator } from './gcp/validator.js'; +export { EvmHookModule } from './hook/EvmHookModule.js'; export { DerivedIcaRouterConfig, DerivedIcaRouterConfigSchema, @@ -464,17 +465,17 @@ export { MailboxClientConfig, MailboxClientConfigSchema, ProxiedFactories, + proxiedFactories, ProxiedRouterConfig, RemoteRouters, RouterAddress, RouterConfig, RouterViolation, RouterViolationType, - proxiedFactories, } from './router/types.js'; export { - CosmIbcToWarpTokenAdapter, CosmIbcTokenAdapter, + CosmIbcToWarpTokenAdapter, CosmNativeTokenAdapter, } from './token/adapters/CosmosTokenAdapter.js'; export { @@ -497,8 +498,8 @@ export { export { IHypTokenAdapter, IHypXERC20Adapter, - ITokenAdapter, InterchainGasQuote, + ITokenAdapter, TransferParams, TransferRemoteParams, } from './token/adapters/ITokenAdapter.js'; @@ -511,9 +512,9 @@ export { SealevelTokenAdapter, } from './token/adapters/SealevelTokenAdapter.js'; export { - SealevelHypTokenInstruction, SealevelHyperlaneTokenData, SealevelHyperlaneTokenDataSchema, + SealevelHypTokenInstruction, SealevelTransferRemoteInstruction, SealevelTransferRemoteSchema, } from './token/adapters/serialization.js'; @@ -521,11 +522,11 @@ export { HypERC20App } from './token/app.js'; export { HypERC20Checker } from './token/checker.js'; export { TokenType } from './token/config.js'; export { + hypERC20contracts, HypERC20Factories, + hypERC20factories, HypERC721Factories, TokenFactories, - hypERC20contracts, - hypERC20factories, } from './token/contracts.js'; export { HypERC20Deployer, HypERC721Deployer } from './token/deploy.js'; export { EvmERC20WarpModule } from './token/EvmERC20WarpModule.js'; @@ -534,16 +535,17 @@ export { IToken, TokenArgs, TokenConfigSchema } from './token/IToken.js'; export { Token } from './token/Token.js'; export { TokenAmount } from './token/TokenAmount.js'; export { + getTokenConnectionId, HyperlaneTokenConnection, IbcToHyperlaneTokenConnection, IbcTokenConnection, + parseTokenConnectionId, TokenConnection, TokenConnectionConfigSchema, TokenConnectionType, - getTokenConnectionId, - parseTokenConnectionId, } from './token/TokenConnection.js'; export { + MINT_LIMITED_STANDARDS, PROTOCOL_TO_NATIVE_STANDARD, TOKEN_COLLATERALIZED_STANDARDS, TOKEN_COSMWASM_STANDARDS, @@ -551,8 +553,10 @@ export { TOKEN_MULTI_CHAIN_STANDARDS, TOKEN_NFT_STANDARDS, TOKEN_STANDARD_TO_PROTOCOL, + TOKEN_STANDARD_TO_PROVIDER_TYPE, TOKEN_TYPE_TO_STANDARD, TokenStandard, + XERC20_STANDARDS, } from './token/TokenStandard.js'; export { CollateralRebaseTokenConfigSchema, @@ -562,6 +566,12 @@ export { HypTokenConfigSchema, HypTokenRouterConfig, HypTokenRouterConfigSchema, + isCollateralRebaseTokenConfig, + isCollateralTokenConfig, + isNativeTokenConfig, + isSyntheticRebaseTokenConfig, + isSyntheticTokenConfig, + isTokenMetadata, NativeTokenConfig, NativeTokenConfigSchema, SyntheticRebaseTokenConfig, @@ -573,12 +583,6 @@ export { WarpRouteDeployConfig, WarpRouteDeployConfigSchema, WarpRouteDeployConfigSchemaErrors, - isCollateralRebaseTokenConfig, - isCollateralTokenConfig, - isNativeTokenConfig, - isSyntheticRebaseTokenConfig, - isSyntheticTokenConfig, - isTokenMetadata, } from './token/types.js'; export { ChainMap, @@ -616,9 +620,9 @@ export { multisigIsmVerificationCost, normalizeConfig } from './utils/ism.js'; export { MultiGeneric } from './utils/MultiGeneric.js'; export { isCompliant, validateZodResult } from './utils/schemas.js'; export { + getSealevelAccountDataSchema, SealevelAccountDataWrapper, SealevelInstructionWrapper, - getSealevelAccountDataSchema, } from './utils/sealevelSerialization.js'; export { getChainIdFromTxs } from './utils/transactions.js'; export { @@ -634,4 +638,3 @@ export { WarpTypedTransaction, } from './warp/types.js'; export { WarpCore, WarpCoreOptions } from './warp/WarpCore.js'; -export { EvmHookModule } from './hook/EvmHookModule.js'; From a7344833160d50ca635c46df5d8dc4021fa9e35b Mon Sep 17 00:00:00 2001 From: Mohammed Hussan Date: Sat, 28 Dec 2024 07:04:51 +0000 Subject: [PATCH 16/81] chore(funding): Set Morph desired balance to 0.1 (#5076) ### Description - Set Morph desired balance to 0.1 --- typescript/infra/config/environments/mainnet3/funding.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index e16bb07c90..f1fea75213 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -90,7 +90,7 @@ export const keyFunderConfig: KeyFunderConfig< mode: '0.2', molten: '3', moonbeam: '100', - morph: '0.05', + morph: '0.1', oortmainnet: '2000', optimism: '0.5', orderly: '0.05', From f929a429a0367f9a398cd25d010bb82e31788e58 Mon Sep 17 00:00:00 2001 From: Marco Date: Sat, 28 Dec 2024 23:56:58 +0200 Subject: [PATCH 17/81] chore: Fix typos in comments (#5088) This pull request addresses minor grammatical inconsistencies and corrects typos across multiple files in the repository. Specifically, it replaces incorrect usage of "a" with "an" where appropriate and corrects other minor typographical errors. These changes improve code readability and maintain grammatical accuracy. ### Changes - **incremental.rs**: Updated "a incremental" to "an incremental". - **MailboxClient.sol**: Updated "an Hyperlane" to "a Hyperlane". - **Router.sol**: Updated "a Application Router" to "an Application Router". - **AbstractMessageIdAuthorizedIsm.sol**: Updated "a authorized" to "an authorized". - **stakeRegistry.ts**: Updated "a expiry" to "an expiry". - **utils.ts**: Updated "an standard" to "a standard". - **ids.ts**: Updated "an Hyperlane ID" to "a Hyperlane ID". ### Drive-by Changes - No additional changes outside the scope of typo corrections. ### Related Issues - None. ### Backward Compatibility - These changes are backward compatible and do not affect functionality. ### Testing - All changes have been manually reviewed for grammatical correctness. - Verified correctness of usage within the context of each file. --- rust/main/hyperlane-core/src/accumulator/incremental.rs | 2 +- solidity/contracts/client/MailboxClient.sol | 2 +- solidity/contracts/client/Router.sol | 2 +- solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol | 2 +- typescript/cli/src/avs/stakeRegistry.ts | 2 +- typescript/infra/scripts/helloworld/utils.ts | 2 +- typescript/utils/src/ids.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rust/main/hyperlane-core/src/accumulator/incremental.rs b/rust/main/hyperlane-core/src/accumulator/incremental.rs index 5595bbc8cf..e71b9cbbe1 100644 --- a/rust/main/hyperlane-core/src/accumulator/incremental.rs +++ b/rust/main/hyperlane-core/src/accumulator/incremental.rs @@ -82,7 +82,7 @@ impl IncrementalMerkle { merkle_root_from_branch(item, &branch, 32, index) } - /// Verify a incremental merkle proof of inclusion + /// Verify an incremental merkle proof of inclusion pub fn verify(&self, proof: &Proof) -> bool { let computed = IncrementalMerkle::branch_root(proof.leaf, proof.path, proof.index); computed == self.root() diff --git a/solidity/contracts/client/MailboxClient.sol b/solidity/contracts/client/MailboxClient.sol index 9c986a0cce..d5359f1d77 100644 --- a/solidity/contracts/client/MailboxClient.sol +++ b/solidity/contracts/client/MailboxClient.sol @@ -58,7 +58,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { } /** - * @notice Only accept messages from an Hyperlane Mailbox contract + * @notice Only accept messages from a Hyperlane Mailbox contract */ modifier onlyMailbox() { require( diff --git a/solidity/contracts/client/Router.sol b/solidity/contracts/client/Router.sol index 5d98f2cb9c..9ae6310dc5 100644 --- a/solidity/contracts/client/Router.sol +++ b/solidity/contracts/client/Router.sol @@ -145,7 +145,7 @@ abstract contract Router is MailboxClient, IMessageRecipient { } /** - * @notice Assert that the given domain has a Application Router registered and return its address + * @notice Assert that the given domain has an Application Router registered and return its address * @param _domain The domain of the chain for which to get the Application Router * @return _router The address of the remote Application Router on _domain */ diff --git a/solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol b/solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol index a133de5d8d..ac5601125d 100644 --- a/solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol +++ b/solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol @@ -27,7 +27,7 @@ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Ini /** * @title AbstractMessageIdAuthorizedIsm - * @notice Uses external verification options to verify interchain messages which need a authorized caller + * @notice Uses external verification options to verify interchain messages which need an authorized caller */ abstract contract AbstractMessageIdAuthorizedIsm is IInterchainSecurityModule, diff --git a/typescript/cli/src/avs/stakeRegistry.ts b/typescript/cli/src/avs/stakeRegistry.ts index a9c50918da..bfe0157021 100644 --- a/typescript/cli/src/avs/stakeRegistry.ts +++ b/typescript/cli/src/avs/stakeRegistry.ts @@ -136,7 +136,7 @@ async function getOperatorSignature( // random salt is ok, because we register the operator right after const salt = utils.hexZeroPad(utils.randomBytes(32), 32); - // give a expiry timestamp 1 hour from now + // give an expiry timestamp 1 hour from now const expiry = utils.hexZeroPad( utils.hexlify(Math.floor(Date.now() / 1000) + 60 * 60), 32, diff --git a/typescript/infra/scripts/helloworld/utils.ts b/typescript/infra/scripts/helloworld/utils.ts index 729dd6a4fd..2d95e72d37 100644 --- a/typescript/infra/scripts/helloworld/utils.ts +++ b/typescript/infra/scripts/helloworld/utils.ts @@ -127,7 +127,7 @@ export async function getHelloWorldMultiProtocolApp( ); // TODO we need a MultiProtocolIgp - // Using an standard IGP for just evm chains for now + // Using a standard IGP for just evm chains for now // Unfortunately this requires hacking surgically around certain addresses const filteredAddresses = filterChainMapToProtocol( envAddresses, diff --git a/typescript/utils/src/ids.ts b/typescript/utils/src/ids.ts index ff7bca0420..c3f3296377 100644 --- a/typescript/utils/src/ids.ts +++ b/typescript/utils/src/ids.ts @@ -20,7 +20,7 @@ export function canonizeId(data: BytesLike): Uint8Array { } /** - * Converts an Hyperlane ID of 20 or 32 bytes to the corresponding EVM Address. + * Converts a Hyperlane ID of 20 or 32 bytes to the corresponding EVM Address. * * For 32-byte IDs this enforces the EVM convention of using the LAST 20 bytes. * From f73dcc302b59707489e5eeba9a957ec05e604489 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Sun, 29 Dec 2024 15:30:09 +0000 Subject: [PATCH 18/81] feat: remove polygon tx overrides (#5084) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/main/config/mainnet_config.json | 6 +----- .../infra/config/environments/mainnet3/chains.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index e7704ff783..8f81beeec4 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -2318,11 +2318,7 @@ "validatorAnnounce": "0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5", "staticMerkleRootWeightedMultisigIsmFactory": "0x07CE1B0cFfa436AE2fb7Fbd7318648774FdA53f9", "staticMessageIdWeightedMultisigIsmFactory": "0x9e22945bE593946618383B108CC5bce09eBA4C26", - "technicalStack": "other", - "transactionOverrides": { - "maxFeePerGas": 800000000000, - "maxPriorityFeePerGas": 50000000000 - } + "technicalStack": "other" }, "polygonzkevm": { "aggregationHook": "0x8464aF853363B8d6844070F68b0AB34Cb6523d0F", diff --git a/typescript/infra/config/environments/mainnet3/chains.ts b/typescript/infra/config/environments/mainnet3/chains.ts index 62c5dffdad..7cdc82abd0 100644 --- a/typescript/infra/config/environments/mainnet3/chains.ts +++ b/typescript/infra/config/environments/mainnet3/chains.ts @@ -18,14 +18,6 @@ export const chainMetadataOverrides: ChainMap> = { gasPrice: 3 * 10 ** 9, // 3 gwei }, }, - polygon: { - transactionOverrides: { - // A very high max fee per gas is used as Polygon is susceptible - // to large swings in gas prices. - maxFeePerGas: 800 * 10 ** 9, // 800 gwei - maxPriorityFeePerGas: 50 * 10 ** 9, // 50 gwei - }, - }, polygonzkevm: { transactionOverrides: { gasPrice: 1 * 10 ** 9, // 1 gwei @@ -91,6 +83,14 @@ export const chainMetadataOverrides: ChainMap> = { // maxPriorityFeePerGas: 10 * 10 ** 9, // 10 gwei // }, // }, + // polygon: { + // transactionOverrides: { + // // A very high max fee per gas is used as Polygon is susceptible + // // to large swings in gas prices. + // maxFeePerGas: 800 * 10 ** 9, // 800 gwei + // maxPriorityFeePerGas: 50 * 10 ** 9, // 50 gwei + // }, + // }, }; export const getRegistry = async ( From e3f5a0a3746375345ac01ea43732233a7f896dfc Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Mon, 30 Dec 2024 11:44:58 -0500 Subject: [PATCH 19/81] fix: Allow empty data field in ethers5TxToWagmiTx (#5081) ### Description Widgets lib fix: Allow empty data field in ethers5TxToWagmiTx ### Backward compatibility Yes --- .changeset/serious-beers-lay.md | 5 +++++ typescript/widgets/src/walletIntegrations/utils.ts | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .changeset/serious-beers-lay.md diff --git a/.changeset/serious-beers-lay.md b/.changeset/serious-beers-lay.md new file mode 100644 index 0000000000..6f8fbffc34 --- /dev/null +++ b/.changeset/serious-beers-lay.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/widgets': patch +--- + +Allow empty data field in ethers5TxToWagmiTx diff --git a/typescript/widgets/src/walletIntegrations/utils.ts b/typescript/widgets/src/walletIntegrations/utils.ts index b0a994f1d8..6c2d485857 100644 --- a/typescript/widgets/src/walletIntegrations/utils.ts +++ b/typescript/widgets/src/walletIntegrations/utils.ts @@ -11,11 +11,10 @@ export function ethers5TxToWagmiTx( tx: Ethers5Transaction, ): SendTransactionParameters { if (!tx.to) throw new Error('No tx recipient address specified'); - if (!tx.data) throw new Error('No tx data specified'); return { to: tx.to as `0x${string}`, value: ethersBnToBigInt(tx.value || EthersBN.from('0')), - data: tx.data as `0x{string}`, + data: tx.data as `0x{string}` | undefined, nonce: tx.nonce, chainId: tx.chainId, gas: tx.gasLimit ? ethersBnToBigInt(tx.gasLimit) : undefined, From b09f97eca0fc953e8fa93bce02afd5b3897c1f29 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Mon, 30 Dec 2024 17:57:53 +0000 Subject: [PATCH 20/81] chore: update relayer image (#5091) ### Description - update image in config to the current relayer image tag - add USDC/ethereum-inevm test tx to blacklist https://explorer.hyperlane.xyz/message/0x998746dc822dc15332b8683fb8a29aec22ed3e2f2fb8245c40f56303c5cb6032 top ### Drive-by changes ### Related issues ### Backward compatibility ### Testing Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com> --- typescript/infra/config/environments/mainnet3/agent.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 1cbc6d1d24..f886bd802b 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -602,6 +602,10 @@ const blacklistedMessageIds = [ // txs between unenrolled routers of // USDT/arbitrum-ethereum-mantle-mode-polygon-scroll-zeronetwork '0x10159bf1b5b2142b882cb060d1da9f9123d82974ca265ba432138221e52c2a27', + + // test tx when route was first deployed, no merkle tree insertion + // USDC/ethereum-inevm + '0x998746dc822dc15332b8683fb8a29aec22ed3e2f2fb8245c40f56303c5cb6032', ]; // Blacklist matching list intended to be used by all contexts. @@ -618,7 +622,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '234704d-20241226-192528', + tag: 'f73dcc3-20241229-154524', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, From cd6558eaaf777f9df7ee68b8b426d0cf11c79f95 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 30 Dec 2024 20:27:24 +0000 Subject: [PATCH 21/81] feat: deploy JitoSOL and kySOL warp route monitors (#5085) ### Description - Deployed the JitoSOL and kySOL warp route monitors - Ensured ATA payer balances are sufficient - Also deployed the relayer with the new app contexts - Drive-by to lower the ethereum gas price (applied onchain) ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/gasPrices.json | 2 +- typescript/infra/config/environments/mainnet3/warp/warpIds.ts | 2 ++ typescript/infra/src/warp/helm.ts | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index b260dfee48..c9698725ad 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -132,7 +132,7 @@ "decimals": 9 }, "ethereum": { - "amount": "32.059172476", + "amount": "10.0", "decimals": 9 }, "everclear": { diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 1cd98d1c8d..58d8c7912e 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -14,6 +14,8 @@ export enum WarpRouteIds { EclipseEthereumWeETHs = 'weETHs/eclipsemainnet-ethereum', EclipseSolanaEzSOL = 'EZSOL/eclipsemainnet-solanamainnet', EclipseSolanaORCA = 'ORCA/eclipsemainnet-solanamainnet', + EclipseSolanaJitoSOL = 'jitoSOL/eclipsemainnet-solanamainnet', + EclipseSolanaKySOL = 'kySOL/eclipsemainnet-solanamainnet', EclipseSolanaSOL = 'SOL/eclipsemainnet-solanamainnet', EclipseSolanaWIF = 'WIF/eclipsemainnet-solanamainnet', EclipseStrideSTTIA = 'stTIA/eclipsemainnet-stride', diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 1d0f43585a..4c7ddf60ef 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '3cacafd-20241220-092417', + tag: 'de11906-20241227-214834', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From a7abf47d20649ba1459203ebbabef2a87ec26b39 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 30 Dec 2024 21:31:08 +0000 Subject: [PATCH 22/81] feat: retry program deployments in SVM tooling with higher fees (#4904) ### Description - A common failure case on Solana has been having trouble getting program deployment txs to land. Parts of the program bytecode are written to a buffer in hundreds of different txs, and some of these fail. Now we will: - specify a buffer account - automatically retry with the same buffer account (building upon any successful writes to it) and with a higher compute unit price What will probably follow at some point: - programmatically decide what fees to start using ### Drive-by changes - Always use existing keys if they are present, removing some code complexity here ### Related issues ### Backward compatibility ### Testing --- rust/main/utils/run-locally/src/solana.rs | 5 +- rust/sealevel/client/src/cmd_utils.rs | 152 ++++++++++++------ rust/sealevel/client/src/core.rs | 49 ++---- rust/sealevel/client/src/igp.rs | 20 +-- rust/sealevel/client/src/main.rs | 2 - rust/sealevel/client/src/multisig_ism.rs | 20 +-- rust/sealevel/client/src/router.rs | 17 +- ...sealevel_token-sealeveltest2-keypair.json} | 0 ...l_token_native-sealeveltest1-keypair.json} | 0 9 files changed, 144 insertions(+), 121 deletions(-) rename rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/{hyperlane_sealevel_token-sealeveltest2.json => hyperlane_sealevel_token-sealeveltest2-keypair.json} (100%) rename rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/{hyperlane_sealevel_token_native-sealeveltest1.json => hyperlane_sealevel_token_native-sealeveltest1-keypair.json} (100%) diff --git a/rust/main/utils/run-locally/src/solana.rs b/rust/main/utils/run-locally/src/solana.rs index 022d086a65..6dd137857f 100644 --- a/rust/main/utils/run-locally/src/solana.rs +++ b/rust/main/utils/run-locally/src/solana.rs @@ -159,7 +159,7 @@ pub fn build_solana_programs(solana_cli_tools_path: PathBuf) -> PathBuf { .working_dir(&out_path) .run() .join(); - log!("Remove temporary solana files"); + log!("Removing temporary solana files"); fs::remove_file(concat_path(&out_path, "spl.tar.gz")) .expect("Failed to remove solana program archive"); @@ -232,8 +232,7 @@ pub fn start_solana_test_validator( .arg("environment", SOLANA_ENV_NAME) .arg("environments-dir", SOLANA_ENVS_DIR) .arg("built-so-dir", SBF_OUT_PATH) - .arg("overhead-config-file", SOLANA_OVERHEAD_CONFIG_FILE) - .flag("use-existing-keys"); + .arg("overhead-config-file", SOLANA_OVERHEAD_CONFIG_FILE); sealevel_client_deploy_core .clone() diff --git a/rust/sealevel/client/src/cmd_utils.rs b/rust/sealevel/client/src/cmd_utils.rs index f387d3c4fd..4b8da171e1 100644 --- a/rust/sealevel/client/src/cmd_utils.rs +++ b/rust/sealevel/client/src/cmd_utils.rs @@ -1,14 +1,17 @@ use std::{ collections::HashMap, fs::File, - io::Write, + io::{self, Write}, path::{Path, PathBuf}, process::{Command, Stdio}, thread::sleep, time::Duration, }; -use solana_client::{client_error::ClientError, rpc_client::RpcClient}; +use solana_client::{ + client_error::{ClientError, ClientErrorKind}, + rpc_client::RpcClient, +}; use solana_sdk::{ commitment_config::CommitmentConfig, pubkey::Pubkey, @@ -44,37 +47,91 @@ pub(crate) fn account_exists(client: &RpcClient, account: &Pubkey) -> Result Result<(), ClientError> { +) -> Result { + let (program_keypair, program_keypair_path) = create_or_get_keypair( + program_key_dir, + format!("{}-keypair.json", program_name).as_str(), + ); + let program_id = program_keypair.pubkey(); + let client = RpcClient::new(url.to_string()); - if !account_exists(&client, &program_keypair.pubkey())? { - deploy_program( + if account_exists(&client, &program_keypair.pubkey())? { + println!("Program {} already deployed", program_keypair.pubkey()); + return Ok(program_id); + } + + let (buffer_keypair, buffer_keypair_path) = create_or_get_keypair( + program_key_dir, + format!("{}-buffer.json", program_name).as_str(), + ); + + let mut compute_unit_price = get_compute_unit_price_micro_lamports_for_id(local_domain); + + for attempt in 0..10 { + println!("Attempting program deploy Program ID: {}, buffer pubkey: {}, compute unit price: {}, attempt number {}", program_id, buffer_keypair.pubkey(), compute_unit_price, attempt); + + if attempt > 0 { + println!( + "As this is not the first deploy attempt, the buffer {} is re-used", + buffer_keypair.pubkey() + ); + } + + if attempt_program_deploy( payer_keypair_path, - program_keypair_path, + program_name, program_path, + &program_keypair_path, + &buffer_keypair_path, url, - local_domain, + compute_unit_price, + ) + .is_ok() + { + // Success! + return Ok(program_id); + } + + // Failed to deploy program, try again with a higher compute unit price + + println!( + "Failed to deploy program with compute unit price {}", + compute_unit_price ); - } else { - println!("Program {} already deployed", program_keypair.pubkey()); + + // Bump by 10% each time if non-zero, otherwise start at 1000 micro lamports + compute_unit_price = if compute_unit_price > 0 { + compute_unit_price * 11 / 10 + } else { + 1000 + }; + + println!( + "Sleeping 1s, then retrying with new compute unit price {}", + compute_unit_price + ); + sleep(Duration::from_secs(1)); } - Ok(()) + Err(ClientErrorKind::Custom(format!("Failed to deploy program {}", program_name)).into()) } -pub(crate) fn deploy_program( +fn attempt_program_deploy( payer_keypair_path: &str, - program_keypair_path: &str, + program_name: &str, program_path: &str, + program_keypair_path: &Path, + buffer_keypair_path: &Path, url: &str, - local_domain: u32, -) { + compute_unit_price: u64, +) -> Result<(), ClientError> { let mut command = vec![ "solana", "--url", @@ -87,19 +144,28 @@ pub(crate) fn deploy_program( "--upgrade-authority", payer_keypair_path, "--program-id", - program_keypair_path, + program_keypair_path.to_str().unwrap(), + "--buffer", + buffer_keypair_path.to_str().unwrap(), ]; - let compute_unit_price = get_compute_unit_price_micro_lamports_for_id(local_domain).to_string(); - if local_domain.eq(&SOLANA_DOMAIN) { - command.extend(vec!["--with-compute-unit-price", &compute_unit_price]); - } + let compute_unit_price_str = compute_unit_price.to_string(); + command.extend(vec!["--with-compute-unit-price", &compute_unit_price_str]); - build_cmd(command.as_slice(), None, None); + // Success! + if let Ok(true) = run_cmd(command.as_slice(), None, None) { + // TODO: use commitment level instead of just sleeping here? + println!("Sleeping for 2 seconds to fully allow program to be deployed"); + sleep(Duration::from_secs(2)); + + return Ok(()); + } - // TODO: use commitment level instead of just sleeping here? - println!("Sleeping for 2 seconds to allow program to be deployed"); - sleep(Duration::from_secs(2)); + Err(ClientErrorKind::Custom(format!( + "Attempted program deploy failed for {}", + program_name + )) + .into()) } pub(crate) fn create_new_directory(parent_dir: &Path, name: &str) -> PathBuf { @@ -109,20 +175,14 @@ pub(crate) fn create_new_directory(parent_dir: &Path, name: &str) -> PathBuf { path } -pub(crate) fn create_and_write_keypair( - key_dir: &Path, - key_name: &str, - use_existing_key: bool, -) -> (Keypair, PathBuf) { +pub(crate) fn create_or_get_keypair(key_dir: &Path, key_name: &str) -> (Keypair, PathBuf) { let path = key_dir.join(key_name); - if use_existing_key { - if let Ok(file) = File::open(path.clone()) { - println!("Using existing key at path {}", path.display()); - let keypair_bytes: Vec = serde_json::from_reader(file).unwrap(); - let keypair = Keypair::from_bytes(&keypair_bytes[..]).unwrap(); - return (keypair, path); - } + if let Ok(file) = File::open(path.clone()) { + println!("Using existing key at path {}", path.display()); + let keypair_bytes: Vec = serde_json::from_reader(file).unwrap(); + let keypair = Keypair::from_bytes(&keypair_bytes[..]).unwrap(); + return (keypair, path); } let keypair = Keypair::new(); @@ -136,8 +196,14 @@ pub(crate) fn create_and_write_keypair( (keypair, path) } -fn build_cmd(cmd: &[&str], wd: Option<&str>, env: Option<&HashMap<&str, &str>>) { +fn run_cmd(cmd: &[&str], wd: Option<&str>, env: Option<&HashMap<&str, &str>>) -> io::Result { assert!(!cmd.is_empty(), "Must specify a command!"); + if cmd.is_empty() { + return Err(io::Error::new( + io::ErrorKind::Other, + "Must specify a command!", + )); + } let mut c = Command::new(cmd[0]); c.args(&cmd[1..]); c.stdout(Stdio::inherit()); @@ -149,10 +215,6 @@ fn build_cmd(cmd: &[&str], wd: Option<&str>, env: Option<&HashMap<&str, &str>>) c.envs(env); } println!("Running command: {:?}", c); - let status = c.status().expect("Failed to run command"); - assert!( - status.success(), - "Command returned non-zero exit code: {}", - cmd.join(" ") - ); + let status = c.status()?; + Ok(status.success()) } diff --git a/rust/sealevel/client/src/core.rs b/rust/sealevel/client/src/core.rs index e3abedf035..72ecfcb5ca 100644 --- a/rust/sealevel/client/src/core.rs +++ b/rust/sealevel/client/src/core.rs @@ -3,7 +3,6 @@ use hyperlane_sealevel_mailbox::protocol_fee::ProtocolFee; use serde::{Deserialize, Serialize}; use solana_program::pubkey::Pubkey; -use solana_sdk::signature::Signer; use solana_sdk::{compute_budget, compute_budget::ComputeBudgetInstruction}; use std::collections::HashMap; @@ -13,7 +12,7 @@ use crate::cmd_utils::get_compute_unit_price_micro_lamports_for_chain_name; use crate::ONE_SOL_IN_LAMPORTS; use crate::{ artifacts::{read_json, write_json}, - cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, + cmd_utils::{create_new_directory, deploy_program}, multisig_ism::deploy_multisig_ism_message_id, Context, CoreCmd, CoreDeploy, CoreSubCmd, }; @@ -89,7 +88,6 @@ pub(crate) fn process_core_cmd(mut ctx: Context, cmd: CoreCmd) { let ism_program_id = deploy_multisig_ism_message_id( &mut ctx, &core.built_so_dir, - core.use_existing_keys, &key_dir, core.local_domain, ); @@ -123,23 +121,18 @@ fn deploy_mailbox( default_ism: Pubkey, local_domain: u32, ) -> Pubkey { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_mailbox-keypair.json", - core.use_existing_keys, - ); - let program_id = keypair.pubkey(); - - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_mailbox", core.built_so_dir .join("hyperlane_sealevel_mailbox.so") .to_str() .unwrap(), &ctx.client.url(), local_domain, - ); + ) + .unwrap(); println!("Deployed Mailbox at program ID {}", program_id); @@ -182,23 +175,18 @@ fn deploy_validator_announce( key_dir: &Path, mailbox_program_id: Pubkey, ) -> Pubkey { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_validator_announce-keypair.json", - core.use_existing_keys, - ); - let program_id = keypair.pubkey(); - - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_validator_announce", core.built_so_dir .join("hyperlane_sealevel_validator_announce.so") .to_str() .unwrap(), &ctx.client.url(), core.local_domain, - ); + ) + .unwrap(); println!("Deployed ValidatorAnnounce at program ID {}", program_id); @@ -225,13 +213,6 @@ fn deploy_igp(ctx: &mut Context, core: &CoreDeploy, key_dir: &Path) -> (Pubkey, instruction::{GasOracleConfig, GasOverheadConfig}, }; - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_igp-keypair.json", - core.use_existing_keys, - ); - let program_id = keypair.pubkey(); - let mut gas_oracle_configs = core .gas_oracle_config_file .as_deref() @@ -275,16 +256,18 @@ fn deploy_igp(ctx: &mut Context, core: &CoreDeploy, key_dir: &Path) -> (Pubkey, .into_values() .collect::>(); - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_igp", core.built_so_dir .join("hyperlane_sealevel_igp.so") .to_str() .unwrap(), &ctx.client.url(), core.local_domain, - ); + ) + .unwrap(); println!("Deployed IGP at program ID {}", program_id); diff --git a/rust/sealevel/client/src/igp.rs b/rust/sealevel/client/src/igp.rs index 0d4c5c0e9e..cf9d6042b2 100644 --- a/rust/sealevel/client/src/igp.rs +++ b/rust/sealevel/client/src/igp.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use crate::{ artifacts::{read_json, try_read_json, write_json, SingularProgramIdArtifact}, - cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, + cmd_utils::{create_new_directory, deploy_program}, read_core_program_ids, router::ChainMetadata, Context, GasOverheadSubCmd, GetSetCmd, IgpCmd, IgpSubCmd, @@ -75,7 +75,7 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { .expect("Invalid chain name"); let program_id = - deploy_igp_program(&mut ctx, &deploy.built_so_dir, true, &key_dir, local_domain); + deploy_igp_program(&mut ctx, &deploy.built_so_dir, &key_dir, local_domain); write_json::( &chain_dir.join("program-ids.json"), @@ -413,27 +413,21 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { fn deploy_igp_program( ctx: &mut Context, built_so_dir: &Path, - use_existing_keys: bool, key_dir: &Path, local_domain: u32, ) -> Pubkey { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_igp-keypair.json", - use_existing_keys, - ); - let program_id = keypair.pubkey(); - - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_igp", built_so_dir .join("hyperlane_sealevel_igp.so") .to_str() .unwrap(), &ctx.client.url(), local_domain, - ); + ) + .unwrap(); println!("Deployed IGP at program ID {}", program_id); diff --git a/rust/sealevel/client/src/main.rs b/rust/sealevel/client/src/main.rs index bf014785c1..4b76a7cf0a 100644 --- a/rust/sealevel/client/src/main.rs +++ b/rust/sealevel/client/src/main.rs @@ -184,8 +184,6 @@ struct CoreDeploy { overhead_config_file: Option, #[arg(long)] chain: String, - #[arg(long)] - use_existing_keys: bool, #[arg(long, num_args = 1.., value_delimiter = ',')] remote_domains: Vec, #[arg(long)] diff --git a/rust/sealevel/client/src/multisig_ism.rs b/rust/sealevel/client/src/multisig_ism.rs index 9f1f2c5c89..753e89c7ab 100644 --- a/rust/sealevel/client/src/multisig_ism.rs +++ b/rust/sealevel/client/src/multisig_ism.rs @@ -3,11 +3,10 @@ use std::{fs::File, path::Path}; use serde::{Deserialize, Serialize}; use solana_program::pubkey::Pubkey; -use solana_sdk::signature::Signer; use crate::{ artifacts::{write_json, SingularProgramIdArtifact}, - cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, + cmd_utils::{create_new_directory, deploy_program}, router::ChainMetadata, Context, MultisigIsmMessageIdCmd, MultisigIsmMessageIdSubCmd, }; @@ -64,7 +63,6 @@ pub(crate) fn process_multisig_ism_message_id_cmd(mut ctx: Context, cmd: Multisi let ism_program_id = deploy_multisig_ism_message_id( &mut ctx, &deploy.built_so_dir, - true, &key_dir, local_domain, ); @@ -168,27 +166,21 @@ pub(crate) fn process_multisig_ism_message_id_cmd(mut ctx: Context, cmd: Multisi pub(crate) fn deploy_multisig_ism_message_id( ctx: &mut Context, built_so_dir: &Path, - use_existing_keys: bool, key_dir: &Path, local_domain: u32, ) -> Pubkey { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - "hyperlane_sealevel_multisig_ism_message_id-keypair.json", - use_existing_keys, - ); - let program_id = keypair.pubkey(); - - deploy_program( + let program_id = deploy_program( ctx.payer_keypair_path(), - keypair_path.to_str().unwrap(), + key_dir, + "hyperlane_sealevel_multisig_ism_message_id", built_so_dir .join("hyperlane_sealevel_multisig_ism_message_id.so") .to_str() .unwrap(), &ctx.client.url(), local_domain, - ); + ) + .unwrap(); println!( "Deployed Multisig ISM Message ID at program ID {}", diff --git a/rust/sealevel/client/src/router.rs b/rust/sealevel/client/src/router.rs index ad7ee36950..2b75ea5cae 100644 --- a/rust/sealevel/client/src/router.rs +++ b/rust/sealevel/client/src/router.rs @@ -8,7 +8,7 @@ use std::{ use solana_client::rpc_client::RpcClient; use solana_program::instruction::Instruction; -use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey, signature::Signer}; +use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey}; use account_utils::DiscriminatorData; use hyperlane_sealevel_connection_client::router::RemoteRouterConfig; @@ -17,7 +17,7 @@ use hyperlane_sealevel_igp::accounts::{Igp, InterchainGasPaymasterType, Overhead use crate::{ adjust_gas_price_if_needed, artifacts::{write_json, HexAndBase58ProgramIdArtifact}, - cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program_idempotent}, + cmd_utils::{create_new_directory, deploy_program}, read_core_program_ids, warp_route, Context, CoreProgramIds, }; @@ -183,17 +183,12 @@ pub(crate) trait RouterDeployer: }) }) .unwrap_or_else(|| { - let (keypair, keypair_path) = create_and_write_keypair( - key_dir, - format!("{}-{}.json", program_name, chain_config.name).as_str(), - true, - ); - let program_id = keypair.pubkey(); + let chain_program_name = format!("{}-{}", program_name, chain_config.name); - deploy_program_idempotent( + let program_id = deploy_program( ctx.payer_keypair_path(), - &keypair, - keypair_path.to_str().unwrap(), + key_dir, + &chain_program_name, built_so_dir .join(format!("{}.so", program_name)) .to_str() diff --git a/rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token-sealeveltest2.json b/rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token-sealeveltest2-keypair.json similarity index 100% rename from rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token-sealeveltest2.json rename to rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token-sealeveltest2-keypair.json diff --git a/rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token_native-sealeveltest1.json b/rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token_native-sealeveltest1-keypair.json similarity index 100% rename from rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token_native-sealeveltest1.json rename to rust/sealevel/environments/local-e2e/warp-routes/testwarproute/keys/hyperlane_sealevel_token_native-sealeveltest1-keypair.json From c15257662840419cb6131360543e58af5c401eeb Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 2 Jan 2025 14:18:31 +0000 Subject: [PATCH 23/81] chore(relayer): add middleware logs, instrumentation cleanup (#5089) ### Description - Instruments all ether-rs middleware (except for the Metrics one) to improve observability of evm tx submission flow. ethers-rs diff: https://github.com/hyperlane-xyz/ethers-rs/compare/edf703a6e515266245b88bb4f1daad24f7c6566c...31653ac8c54ae3fe78b91bf5d92a1ab71604d07e Screenshot_2024-12-30_at_00 07 55 - Reduces noisiness of log fields where possible ### Related issues ### Backward compatibility ### Testing E2E and RC --- rust/main/Cargo.lock | 21 ++++++++++--------- rust/main/Cargo.toml | 10 ++++----- .../agents/relayer/src/msg/pending_message.rs | 2 +- .../src/contracts/mailbox.rs | 2 +- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index c14e211f03..4f728ab69f 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -2901,7 +2901,7 @@ dependencies = [ [[package]] name = "ethers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "ethers-addressbook", "ethers-contract", @@ -2915,7 +2915,7 @@ dependencies = [ [[package]] name = "ethers-addressbook" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "ethers-core", "once_cell", @@ -2926,7 +2926,7 @@ dependencies = [ [[package]] name = "ethers-contract" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -2944,7 +2944,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "Inflector", "cfg-if", @@ -2968,7 +2968,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -2982,7 +2982,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "arrayvec", "bytes", @@ -3012,7 +3012,7 @@ dependencies = [ [[package]] name = "ethers-etherscan" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "ethers-core", "getrandom 0.2.15", @@ -3028,7 +3028,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "async-trait", "auto_impl 0.5.0", @@ -3047,6 +3047,7 @@ dependencies = [ "tokio", "tracing", "tracing-futures", + "tracing-test", "url", ] @@ -3076,7 +3077,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "async-trait", "auto_impl 1.2.0", @@ -3112,7 +3113,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-16#c5c2a74660675ab968cf585893325e2faa807d14" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" dependencies = [ "async-trait", "coins-bip32 0.7.0", diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index 55cfc1573a..8b1a9b58e0 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -198,27 +198,27 @@ overflow-checks = true [workspace.dependencies.ethers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2024-12-30" [workspace.dependencies.ethers-contract] features = ["legacy"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2024-12-30" [workspace.dependencies.ethers-core] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2024-12-30" [workspace.dependencies.ethers-providers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2024-12-30" [workspace.dependencies.ethers-signers] features = ["aws"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-16" +tag = "2024-12-30" [patch.crates-io.curve25519-dalek] branch = "v3.2.2-relax-zeroize" diff --git a/rust/main/agents/relayer/src/msg/pending_message.rs b/rust/main/agents/relayer/src/msg/pending_message.rs index d63b7b03f3..3c03094fc5 100644 --- a/rust/main/agents/relayer/src/msg/pending_message.rs +++ b/rust/main/agents/relayer/src/msg/pending_message.rs @@ -338,7 +338,7 @@ impl PendingOperation for PendingMessage { PendingOperationResult::Success } - #[instrument] + #[instrument(skip(self), fields(id=?self.id(), domain=%self.destination_domain()))] async fn submit(&mut self) -> PendingOperationResult { if self.submitted { // this message has already been submitted, possibly not by us diff --git a/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs b/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs index 1e9bfaa041..85a709223b 100644 --- a/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs +++ b/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs @@ -496,7 +496,7 @@ where .into()) } - #[instrument(skip(self), fields(metadata=%bytes_to_hex(metadata)))] + #[instrument(skip(self, message, metadata), fields(metadata=%bytes_to_hex(metadata)))] async fn process( &self, message: &HyperlaneMessage, From 03a91236b2723785b0e2362ce0478b47d03e4684 Mon Sep 17 00:00:00 2001 From: xeno097 Date: Thu, 2 Jan 2025 11:37:04 -0400 Subject: [PATCH 24/81] test(cli): core commands e2e tests (#5090) ### Description Adds more E2E tests to the core commands in the CLI ### Drive-by changes - Removes the unused `--skip-confirmation` from the `core deploy` command - Updates the `warp init` tests to use the `handlePrompts` function - Moves the core e2e tests into the `test/core` folder ### Related issues - #5080 ### Backward compatibility - YES ### Testing - Manual - E2E --- .github/workflows/test.yml | 5 + typescript/cli/src/commands/core.ts | 2 - typescript/cli/src/tests/commands/core.ts | 98 +++++- typescript/cli/src/tests/commands/helpers.ts | 99 +++++- .../cli/src/tests/core-deploy.e2e-test.ts | 108 ------- .../tests/{ => core}/core-apply.e2e-test.ts | 7 +- .../cli/src/tests/core/core-check.e2e-test.ts | 93 ++++++ .../src/tests/core/core-deploy.e2e-test.ts | 286 ++++++++++++++++++ .../cli/src/tests/core/core-init.e2e-test.ts | 216 +++++++++++++ .../tests/{ => core}/core-read.e2e-test.ts | 7 +- .../cli/src/tests/warp-init.e2e-test.ts | 159 +++++----- 11 files changed, 854 insertions(+), 226 deletions(-) delete mode 100644 typescript/cli/src/tests/core-deploy.e2e-test.ts rename typescript/cli/src/tests/{ => core}/core-apply.e2e-test.ts (98%) create mode 100644 typescript/cli/src/tests/core/core-check.e2e-test.ts create mode 100644 typescript/cli/src/tests/core/core-deploy.e2e-test.ts create mode 100644 typescript/cli/src/tests/core/core-init.e2e-test.ts rename typescript/cli/src/tests/{ => core}/core-read.e2e-test.ts (90%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5235c9dd16..7f491f8f11 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -126,10 +126,15 @@ jobs: fail-fast: false matrix: test: + # Core Commands - core-apply + - core-check - core-deploy + - core-init - core-read + # Other commands - relay + # Warp Commands - warp-init - warp-read - warp-apply diff --git a/typescript/cli/src/commands/core.ts b/typescript/cli/src/commands/core.ts index a75f6ae61e..51801d9db0 100644 --- a/typescript/cli/src/commands/core.ts +++ b/typescript/cli/src/commands/core.ts @@ -35,7 +35,6 @@ import { fromAddressCommandOption, inputFileCommandOption, outputFileCommandOption, - skipConfirmationOption, } from './options.js'; /** @@ -117,7 +116,6 @@ export const deploy: CommandModuleWithWriteContext<{ ), 'dry-run': dryRunCommandOption, 'from-address': fromAddressCommandOption, - 'skip-confirmation': skipConfirmationOption, }, handler: async ({ context, chain, config: configFilePath, dryRun }) => { logCommandHeader(`Hyperlane Core deployment${dryRun ? ' dry-run' : ''}`); diff --git a/typescript/cli/src/tests/commands/core.ts b/typescript/cli/src/tests/commands/core.ts index 5feabbe2cb..e1cbe0cb59 100644 --- a/typescript/cli/src/tests/commands/core.ts +++ b/typescript/cli/src/tests/commands/core.ts @@ -1,11 +1,45 @@ -import { $ } from 'zx'; +import { $, ProcessPromise } from 'zx'; import { DerivedCoreConfig } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; import { readYamlOrJson } from '../../utils/files.js'; import { ANVIL_KEY, REGISTRY_PATH } from './helpers.js'; +/** + * Deploys the Hyperlane core contracts to the specified chain using the provided config. + */ +export function hyperlaneCoreDeployRaw( + coreInputPath: string, + privateKey?: string, + skipConfirmationPrompts?: boolean, + hypKey?: string, +): ProcessPromise { + if (hypKey) { + return $`HYP_KEY=${hypKey} yarn workspace @hyperlane-xyz/cli run hyperlane core deploy \ + --registry ${REGISTRY_PATH} \ + --config ${coreInputPath} \ + --verbosity debug \ + ${skipConfirmationPrompts ? '--yes' : ''}`; + } + + if (privateKey) { + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core deploy \ + --registry ${REGISTRY_PATH} \ + --config ${coreInputPath} \ + --key ${privateKey} \ + --verbosity debug \ + ${skipConfirmationPrompts ? '--yes' : ''}`; + } + + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core deploy \ + --registry ${REGISTRY_PATH} \ + --config ${coreInputPath} \ + --verbosity debug \ + ${skipConfirmationPrompts ? '--yes' : ''}`; +} + /** * Deploys the Hyperlane core contracts to the specified chain using the provided config. */ @@ -34,6 +68,68 @@ export async function hyperlaneCoreRead(chain: string, coreOutputPath: string) { --yes`; } +/** + * Verifies that a Hyperlane core deployment matches the provided config on the specified chain. + */ +export function hyperlaneCoreCheck( + chain: string, + coreOutputPath: string, + mailbox?: Address, +): ProcessPromise { + if (mailbox) { + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core check \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --chain ${chain} \ + --mailbox ${mailbox} \ + --verbosity debug \ + --yes`; + } + + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core check \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --chain ${chain} \ + --verbosity debug \ + --yes`; +} + +/** + * Creates a Hyperlane core deployment config + */ +export function hyperlaneCoreInit( + coreOutputPath: string, + privateKey?: string, + hyp_key?: string, +): ProcessPromise { + if (hyp_key) { + return $`${ + hyp_key ? `HYP_KEY=${hyp_key}` : '' + } yarn workspace @hyperlane-xyz/cli run hyperlane core init \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --verbosity debug \ + --yes`; + } + + if (privateKey) { + return $`${ + hyp_key ? 'HYP_KEY=${hyp_key}' : '' + } yarn workspace @hyperlane-xyz/cli run hyperlane core init \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --verbosity debug \ + --key ${privateKey} \ + --yes`; + } + + return $`yarn workspace @hyperlane-xyz/cli run hyperlane core init \ + --registry ${REGISTRY_PATH} \ + --config ${coreOutputPath} \ + --verbosity debug \ + --yes`; +} + /** * Updates a Hyperlane core deployment on the specified chain using the provided config. */ diff --git a/typescript/cli/src/tests/commands/helpers.ts b/typescript/cli/src/tests/commands/helpers.ts index 66f8f2e7f4..7fdb407324 100644 --- a/typescript/cli/src/tests/commands/helpers.ts +++ b/typescript/cli/src/tests/commands/helpers.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers'; -import { $, ProcessPromise } from 'zx'; +import { $, ProcessOutput, ProcessPromise } from 'zx'; import { ERC20Test__factory, ERC4626Test__factory } from '@hyperlane-xyz/core'; import { ChainAddresses } from '@hyperlane-xyz/registry'; @@ -34,6 +34,7 @@ export const CHAIN_NAME_3 = 'anvil3'; export const EXAMPLES_PATH = './examples'; export const CORE_CONFIG_PATH = `${EXAMPLES_PATH}/core-config.yaml`; +export const CORE_CONFIG_PATH_2 = `${TEMP_PATH}/${CHAIN_NAME_2}/core-config.yaml`; export const CORE_READ_CONFIG_PATH_2 = `${TEMP_PATH}/${CHAIN_NAME_2}/core-config-read.yaml`; export const CHAIN_2_METADATA_PATH = `${REGISTRY_PATH}/chains/${CHAIN_NAME_2}/metadata.yaml`; export const CHAIN_3_METADATA_PATH = `${REGISTRY_PATH}/chains/${CHAIN_NAME_3}/metadata.yaml`; @@ -60,23 +61,89 @@ export async function asyncStreamInputWrite( await sleep(500); } -export async function selectAnvil2AndAnvil3( - stream: ProcessPromise, -): Promise { - // Scroll down through the mainnet chains list and select anvil2 - await asyncStreamInputWrite( - stream.stdin, - `${KeyBoardKeys.ARROW_DOWN.repeat(3)}${KeyBoardKeys.TAB}`, - ); - // Scroll down through the mainnet chains list again and select anvil3 - await asyncStreamInputWrite( - stream.stdin, - `${KeyBoardKeys.ARROW_DOWN.repeat(2)}${KeyBoardKeys.TAB}${ - KeyBoardKeys.ENTER - }`, - ); +export type TestPromptAction = { + check: (currentOutput: string) => boolean; + input: string; +}; + +/** + * Takes a {@link ProcessPromise} and a list of inputs that will be supplied + * in the provided order when the check in the {@link TestPromptAction} matches the output + * of the {@link ProcessPromise}. + */ +export async function handlePrompts( + processPromise: Readonly, + actions: TestPromptAction[], +): Promise { + let expectedStep = 0; + for await (const out of processPromise.stdout) { + const currentLine: string = out.toString(); + + const currentAction = actions[expectedStep]; + if (currentAction && currentAction.check(currentLine)) { + // Select mainnet chains + await asyncStreamInputWrite(processPromise.stdin, currentAction.input); + expectedStep++; + } + } + + return processPromise; } +export const SELECT_ANVIL_2_FROM_MULTICHAIN_PICKER = `${KeyBoardKeys.ARROW_DOWN.repeat( + 3, +)}${KeyBoardKeys.TAB}`; + +export const SELECT_ANVIL_3_AFTER_ANVIL_2_FROM_MULTICHAIN_PICKER = `${KeyBoardKeys.ARROW_DOWN.repeat( + 2, +)}${KeyBoardKeys.TAB}`; + +export const SELECT_MAINNET_CHAIN_TYPE_STEP: TestPromptAction = { + check: (currentOutput: string) => + currentOutput.includes('Select network type'), + // Select mainnet chains + input: KeyBoardKeys.ENTER, +}; + +export const SELECT_ANVIL_2_AND_ANVIL_3_STEPS: ReadonlyArray = + [ + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + input: `${SELECT_ANVIL_2_FROM_MULTICHAIN_PICKER}`, + }, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + input: `${SELECT_ANVIL_3_AFTER_ANVIL_2_FROM_MULTICHAIN_PICKER}${KeyBoardKeys.ENTER}`, + }, + ]; + +export const CONFIRM_DETECTED_OWNER_STEP: Readonly = { + check: (currentOutput: string) => + currentOutput.includes('Detected owner address as'), + input: KeyBoardKeys.ENTER, +}; + +export const SETUP_CHAIN_SIGNERS_MANUALLY_STEPS: ReadonlyArray = + [ + { + check: (currentOutput) => + currentOutput.includes('Please enter the private key for chain'), + input: `${ANVIL_KEY}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Please enter the private key for chain'), + input: `${ANVIL_KEY}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Please enter the private key for chain'), + input: `${ANVIL_KEY}${KeyBoardKeys.ENTER}`, + }, + ]; + /** * Retrieves the deployed Warp address from the Warp core config. */ diff --git a/typescript/cli/src/tests/core-deploy.e2e-test.ts b/typescript/cli/src/tests/core-deploy.e2e-test.ts deleted file mode 100644 index 192f0121b4..0000000000 --- a/typescript/cli/src/tests/core-deploy.e2e-test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { expect } from 'chai'; -import { Signer, Wallet, ethers } from 'ethers'; - -import { - ChainMetadata, - CoreConfig, - ProtocolFeeHookConfig, - randomAddress, -} from '@hyperlane-xyz/sdk'; -import { Address } from '@hyperlane-xyz/utils'; - -import { readYamlOrJson, writeYamlOrJson } from '../utils/files.js'; - -import { hyperlaneCoreDeploy, readCoreConfig } from './commands/core.js'; -import { - ANVIL_KEY, - CHAIN_2_METADATA_PATH, - CHAIN_NAME_2, - CORE_CONFIG_PATH, - CORE_READ_CONFIG_PATH_2, - DEFAULT_E2E_TEST_TIMEOUT, -} from './commands/helpers.js'; - -describe('hyperlane core deploy e2e tests', async function () { - this.timeout(DEFAULT_E2E_TEST_TIMEOUT); - - let signer: Signer; - let initialOwnerAddress: Address; - - before(async () => { - const chainMetadata: ChainMetadata = readYamlOrJson(CHAIN_2_METADATA_PATH); - - const provider = new ethers.providers.JsonRpcProvider( - chainMetadata.rpcUrls[0].http, - ); - - const wallet = new Wallet(ANVIL_KEY); - signer = wallet.connect(provider); - - initialOwnerAddress = await signer.getAddress(); - }); - - it('should create a core deployment with the signer as the mailbox owner', async () => { - await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_CONFIG_PATH); - - const coreConfig: CoreConfig = await readCoreConfig( - CHAIN_NAME_2, - CORE_READ_CONFIG_PATH_2, - ); - - expect(coreConfig.owner).to.equal(initialOwnerAddress); - expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); - // Assuming that the ProtocolFeeHook is used for deployment - expect((coreConfig.requiredHook as ProtocolFeeHookConfig).owner).to.equal( - initialOwnerAddress, - ); - }); - - it('should create a core deployment with the mailbox owner set to the address in the config', async () => { - const coreConfig: CoreConfig = await readYamlOrJson(CORE_CONFIG_PATH); - - const newOwner = randomAddress().toLowerCase(); - - coreConfig.owner = newOwner; - writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); - - // Deploy the core contracts with the updated mailbox owner - await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); - - // Verify that the owner has been set correctly without modifying any other owner values - const updatedConfig: CoreConfig = await readCoreConfig( - CHAIN_NAME_2, - CORE_READ_CONFIG_PATH_2, - ); - - expect(updatedConfig.owner.toLowerCase()).to.equal(newOwner); - expect(updatedConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); - // Assuming that the ProtocolFeeHook is used for deployment - expect( - (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, - ).to.equal(initialOwnerAddress); - }); - - it('should create a core deployment with ProxyAdmin owner of the mailbox set to the address in the config', async () => { - const coreConfig: CoreConfig = await readYamlOrJson(CORE_CONFIG_PATH); - - const newOwner = randomAddress().toLowerCase(); - - coreConfig.proxyAdmin = { owner: newOwner }; - writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); - - // Deploy the core contracts with the updated mailbox owner - await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); - - // Verify that the owner has been set correctly without modifying any other owner values - const updatedConfig: CoreConfig = await readCoreConfig( - CHAIN_NAME_2, - CORE_READ_CONFIG_PATH_2, - ); - - expect(updatedConfig.owner).to.equal(initialOwnerAddress); - expect(updatedConfig.proxyAdmin?.owner.toLowerCase()).to.equal(newOwner); - // Assuming that the ProtocolFeeHook is used for deployment - expect( - (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, - ).to.equal(initialOwnerAddress); - }); -}); diff --git a/typescript/cli/src/tests/core-apply.e2e-test.ts b/typescript/cli/src/tests/core/core-apply.e2e-test.ts similarity index 98% rename from typescript/cli/src/tests/core-apply.e2e-test.ts rename to typescript/cli/src/tests/core/core-apply.e2e-test.ts index 27667fd719..c062d5b43b 100644 --- a/typescript/cli/src/tests/core-apply.e2e-test.ts +++ b/typescript/cli/src/tests/core/core-apply.e2e-test.ts @@ -11,13 +11,12 @@ import { } from '@hyperlane-xyz/sdk'; import { Address, Domain, addressToBytes32 } from '@hyperlane-xyz/utils'; -import { readYamlOrJson, writeYamlOrJson } from '../utils/files.js'; - +import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js'; import { hyperlaneCoreApply, hyperlaneCoreDeploy, readCoreConfig, -} from './commands/core.js'; +} from '../commands/core.js'; import { ANVIL_KEY, CHAIN_2_METADATA_PATH, @@ -28,7 +27,7 @@ import { CORE_READ_CONFIG_PATH_2, DEFAULT_E2E_TEST_TIMEOUT, TEMP_PATH, -} from './commands/helpers.js'; +} from '../commands/helpers.js'; const CORE_READ_CHAIN_2_CONFIG_PATH = `${TEMP_PATH}/${CHAIN_NAME_2}/core-config-read.yaml`; const CORE_READ_CHAIN_3_CONFIG_PATH = `${TEMP_PATH}/${CHAIN_NAME_3}/core-config-read.yaml`; diff --git a/typescript/cli/src/tests/core/core-check.e2e-test.ts b/typescript/cli/src/tests/core/core-check.e2e-test.ts new file mode 100644 index 0000000000..f1dd609914 --- /dev/null +++ b/typescript/cli/src/tests/core/core-check.e2e-test.ts @@ -0,0 +1,93 @@ +import { expect } from 'chai'; +import { $ } from 'zx'; + +import { randomAddress } from '@hyperlane-xyz/sdk'; + +import { writeYamlOrJson } from '../../utils/files.js'; +import { + hyperlaneCoreCheck, + hyperlaneCoreDeploy, + readCoreConfig, +} from '../commands/core.js'; +import { + ANVIL_KEY, + CHAIN_NAME_2, + CORE_CONFIG_PATH, + CORE_READ_CONFIG_PATH_2, + DEFAULT_E2E_TEST_TIMEOUT, + REGISTRY_PATH, + deployOrUseExistingCore, +} from '../commands/helpers.js'; + +describe('hyperlane core check e2e tests', async function () { + this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT); + + before(async () => { + await deployOrUseExistingCore(CHAIN_NAME_2, CORE_CONFIG_PATH, ANVIL_KEY); + }); + + it('should throw an error if the --chain param is not provided', async () => { + const wrongCommand = + $`yarn workspace @hyperlane-xyz/cli run hyperlane core check \ + --registry ${REGISTRY_PATH} \ + --config ${CORE_CONFIG_PATH} \ + --verbosity debug \ + --yes`.nothrow(); + + const output = await wrongCommand; + + expect(output.exitCode).to.equal(1); + expect(output.text().includes('Missing required argument: chain')).to.be + .true; + }); + + it('should successfully run the core check command', async () => { + await readCoreConfig(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); + + const output = await hyperlaneCoreCheck( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + + expect(output.exitCode).to.equal(0); + expect(output.text().includes('No violations found')).to.be.true; + }); + + it('should find differences between the local and onchain config', async () => { + const coreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + coreConfig.owner = randomAddress(); + writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); + const expectedDiffText = `EXPECTED: "${coreConfig.owner}"\n`; + const expectedActualText = `ACTUAL: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"\n`; + + const output = await hyperlaneCoreCheck( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ).nothrow(); + + expect(output.exitCode).to.equal(1); + expect(output.text().includes(expectedDiffText)).to.be.true; + expect(output.text().includes(expectedActualText)).to.be.true; + }); + + it('should successfully check the config when provided with a custom mailbox', async () => { + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_CONFIG_PATH); + const coreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + expect(coreConfig.interchainAccountRouter?.mailbox).not.to.be.undefined; + + const output = await hyperlaneCoreCheck( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + coreConfig.interchainAccountRouter!.mailbox, + ); + + expect(output.exitCode).to.equal(0); + expect(output.text().includes('No violations found')).to.be.true; + }); +}); diff --git a/typescript/cli/src/tests/core/core-deploy.e2e-test.ts b/typescript/cli/src/tests/core/core-deploy.e2e-test.ts new file mode 100644 index 0000000000..f7544fc8f7 --- /dev/null +++ b/typescript/cli/src/tests/core/core-deploy.e2e-test.ts @@ -0,0 +1,286 @@ +import { expect } from 'chai'; +import { Signer, Wallet, ethers } from 'ethers'; + +import { + ChainMetadata, + CoreConfig, + HookType, + ProtocolFeeHookConfig, + randomAddress, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js'; +import { + hyperlaneCoreDeploy, + hyperlaneCoreDeployRaw, + readCoreConfig, +} from '../commands/core.js'; +import { + ANVIL_KEY, + CHAIN_2_METADATA_PATH, + CHAIN_NAME_2, + CORE_CONFIG_PATH, + CORE_READ_CONFIG_PATH_2, + DEFAULT_E2E_TEST_TIMEOUT, + KeyBoardKeys, + SELECT_MAINNET_CHAIN_TYPE_STEP, + SETUP_CHAIN_SIGNERS_MANUALLY_STEPS, + TestPromptAction, + handlePrompts, +} from '../commands/helpers.js'; + +describe('hyperlane core deploy e2e tests', async function () { + this.timeout(DEFAULT_E2E_TEST_TIMEOUT); + + let signer: Signer; + let initialOwnerAddress: Address; + + before(async () => { + const chainMetadata: ChainMetadata = readYamlOrJson(CHAIN_2_METADATA_PATH); + + const provider = new ethers.providers.JsonRpcProvider( + chainMetadata.rpcUrls[0].http, + ); + + const wallet = new Wallet(ANVIL_KEY); + signer = wallet.connect(provider); + + initialOwnerAddress = await signer.getAddress(); + }); + + describe('hyperlane core deploy', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + const steps: TestPromptAction[] = [ + ...SETUP_CHAIN_SIGNERS_MANUALLY_STEPS, + SELECT_MAINNET_CHAIN_TYPE_STEP, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + // Scroll down through the mainnet chains list and select anvil2 + input: `${KeyBoardKeys.ARROW_DOWN.repeat(2)}}${KeyBoardKeys.ENTER}`, + }, + { + // When running locally the e2e tests, the chains folder might already have the chain contracts + check: (currentOutput) => + currentOutput.includes('Mailbox already exists at') || + currentOutput.includes('Is this deployment plan correct?'), + input: `yes${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Is this deployment plan correct?'), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreDeployRaw(CORE_CONFIG_PATH).stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + const requiredHookConfig = coreConfig.requiredHook as Exclude< + CoreConfig['requiredHook'], + string + >; + expect(requiredHookConfig.type).to.equal(HookType.PROTOCOL_FEE); + expect((requiredHookConfig as ProtocolFeeHookConfig).owner).to.equal( + initialOwnerAddress, + ); + }); + }); + + describe('hyperlane core deploy --yes', () => { + it('should fail if the --chain flag is not provided but the --yes flag is', async () => { + const steps: TestPromptAction[] = [...SETUP_CHAIN_SIGNERS_MANUALLY_STEPS]; + + const output = hyperlaneCoreDeployRaw(CORE_CONFIG_PATH, undefined, true) + .nothrow() + .stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(1); + expect(finalOutput.text().includes('No chain provided')).to.be.true; + }); + }); + + describe('hyperlane core deploy --key ...', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + // Scroll down through the mainnet chains list and select anvil2 + input: `${KeyBoardKeys.ARROW_DOWN.repeat(2)}}${KeyBoardKeys.ENTER}`, + }, + { + // When running locally the e2e tests, the chains folder might already have the chain contracts + check: (currentOutput) => + currentOutput.includes('Mailbox already exists at') || + currentOutput.includes('Is this deployment plan correct?'), + input: `yes${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Is this deployment plan correct?'), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreDeployRaw(CORE_CONFIG_PATH, ANVIL_KEY).stdio( + 'pipe', + ); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + const requiredHookConfig = coreConfig.requiredHook as Exclude< + CoreConfig['requiredHook'], + string + >; + expect(requiredHookConfig.type).to.equal(HookType.PROTOCOL_FEE); + expect((requiredHookConfig as ProtocolFeeHookConfig).owner).to.equal( + initialOwnerAddress, + ); + }); + }); + + describe('HYP_KEY= ... hyperlane core deploy', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), + // Scroll down through the mainnet chains list and select anvil2 + input: `${KeyBoardKeys.ARROW_DOWN.repeat(2)}}${KeyBoardKeys.ENTER}`, + }, + { + // When running locally the e2e tests, the chains folder might already have the chain contracts + check: (currentOutput) => + currentOutput.includes('Mailbox already exists at') || + currentOutput.includes('Is this deployment plan correct?'), + input: `yes${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Is this deployment plan correct?'), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreDeployRaw( + CORE_CONFIG_PATH, + undefined, + undefined, + ANVIL_KEY, + ).stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + expect(coreConfig.owner).to.equal(initialOwnerAddress); + expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + const requiredHookConfig = coreConfig.requiredHook as Exclude< + CoreConfig['requiredHook'], + string + >; + expect(requiredHookConfig.type).to.equal(HookType.PROTOCOL_FEE); + expect((requiredHookConfig as ProtocolFeeHookConfig).owner).to.equal( + initialOwnerAddress, + ); + }); + }); + + describe('hyperlane core deploy --yes --key ...', () => { + it('should create a core deployment with the signer as the mailbox owner', async () => { + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_CONFIG_PATH); + + const coreConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + + expect(coreConfig.owner).to.equal(initialOwnerAddress); + expect(coreConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + expect((coreConfig.requiredHook as ProtocolFeeHookConfig).owner).to.equal( + initialOwnerAddress, + ); + }); + + it('should create a core deployment with the mailbox owner set to the address in the config', async () => { + const coreConfig: CoreConfig = await readYamlOrJson(CORE_CONFIG_PATH); + + const newOwner = randomAddress().toLowerCase(); + + coreConfig.owner = newOwner; + writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); + + // Deploy the core contracts with the updated mailbox owner + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); + + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + + expect(updatedConfig.owner.toLowerCase()).to.equal(newOwner); + expect(updatedConfig.proxyAdmin?.owner).to.equal(initialOwnerAddress); + // Assuming that the ProtocolFeeHook is used for deployment + expect( + (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, + ).to.equal(initialOwnerAddress); + }); + + it('should create a core deployment with ProxyAdmin owner of the mailbox set to the address in the config', async () => { + const coreConfig: CoreConfig = await readYamlOrJson(CORE_CONFIG_PATH); + + const newOwner = randomAddress().toLowerCase(); + + coreConfig.proxyAdmin = { owner: newOwner }; + writeYamlOrJson(CORE_READ_CONFIG_PATH_2, coreConfig); + + // Deploy the core contracts with the updated mailbox owner + await hyperlaneCoreDeploy(CHAIN_NAME_2, CORE_READ_CONFIG_PATH_2); + + // Verify that the owner has been set correctly without modifying any other owner values + const updatedConfig: CoreConfig = await readCoreConfig( + CHAIN_NAME_2, + CORE_READ_CONFIG_PATH_2, + ); + + expect(updatedConfig.owner).to.equal(initialOwnerAddress); + expect(updatedConfig.proxyAdmin?.owner.toLowerCase()).to.equal(newOwner); + // Assuming that the ProtocolFeeHook is used for deployment + expect( + (updatedConfig.requiredHook as ProtocolFeeHookConfig).owner, + ).to.equal(initialOwnerAddress); + }); + }); +}); diff --git a/typescript/cli/src/tests/core/core-init.e2e-test.ts b/typescript/cli/src/tests/core/core-init.e2e-test.ts new file mode 100644 index 0000000000..5c308df4a5 --- /dev/null +++ b/typescript/cli/src/tests/core/core-init.e2e-test.ts @@ -0,0 +1,216 @@ +import { expect } from 'chai'; +import { Wallet } from 'ethers'; + +import { + CoreConfig, + HookType, + MerkleTreeHookConfig, + ProtocolFeeHookConfig, + randomAddress, +} from '@hyperlane-xyz/sdk'; +import { Address, normalizeAddress } from '@hyperlane-xyz/utils'; + +import { readYamlOrJson } from '../../utils/files.js'; +import { hyperlaneCoreInit } from '../commands/core.js'; +import { + ANVIL_KEY, + CONFIRM_DETECTED_OWNER_STEP, + CORE_CONFIG_PATH_2, + DEFAULT_E2E_TEST_TIMEOUT, + KeyBoardKeys, + TestPromptAction, + handlePrompts, +} from '../commands/helpers.js'; + +describe('hyperlane core init e2e tests', async function () { + this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT); + + function assertCoreInitConfig( + coreConfig: CoreConfig, + owner: Address, + feeHookOwner: Address = owner, + feeHookBeneficiary: Address = feeHookOwner, + ): void { + expect(coreConfig.owner).to.equal(owner); + expect(coreConfig.proxyAdmin?.owner).to.equal(owner); + + const defaultHookConfig = coreConfig.defaultHook as MerkleTreeHookConfig; + expect(defaultHookConfig.type).to.equal(HookType.MERKLE_TREE); + + const requiredHookConfig = coreConfig.requiredHook as ProtocolFeeHookConfig; + expect(requiredHookConfig.type).to.equal(HookType.PROTOCOL_FEE); + expect(normalizeAddress(requiredHookConfig.owner)).to.equal(feeHookOwner); + expect(normalizeAddress(requiredHookConfig.beneficiary)).to.equal( + feeHookBeneficiary, + ); + } + + describe('hyperlane core init', () => { + it('should successfully generate the core contract deployment config', async () => { + const output = hyperlaneCoreInit(CORE_CONFIG_PATH_2).stdio('pipe'); + + const owner = normalizeAddress(randomAddress()); + const feeHookOwner = normalizeAddress(randomAddress()); + const steps: TestPromptAction[] = [ + { + check: (currentOutput) => + currentOutput.includes('Enter the desired owner address:'), + input: `${owner}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes( + 'For trusted relayer ISM, enter relayer address:', + ), + input: `${owner}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes( + 'For Protocol Fee Hook, enter owner address:', + ), + input: `${feeHookOwner}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: KeyBoardKeys.ENTER, + }, + ]; + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig(deploymentCoreConfig, owner, feeHookOwner); + }); + }); + + describe('HYP_KEY=... hyperlane core init', () => { + it('should successfully generate the core contract deployment config when confirming owner prompts', async () => { + const owner = new Wallet(ANVIL_KEY).address; + const steps: TestPromptAction[] = [ + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreInit( + CORE_CONFIG_PATH_2, + undefined, + ANVIL_KEY, + ).stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig(deploymentCoreConfig, owner); + }); + + it('should successfully generate the core contract deployment config when not confirming owner prompts', async () => { + const owner = new Wallet(ANVIL_KEY).address; + const feeHookOwner = normalizeAddress(randomAddress()); + const steps: TestPromptAction[] = [ + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: `no${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Enter beneficiary address for'), + input: `${feeHookOwner}${KeyBoardKeys.ENTER}`, + }, + ]; + + const output = hyperlaneCoreInit( + CORE_CONFIG_PATH_2, + undefined, + ANVIL_KEY, + ).stdio('pipe'); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig( + deploymentCoreConfig, + owner, + undefined, + feeHookOwner, + ); + }); + }); + + describe('hyperlane core init --key ...', () => { + it('should successfully generate the core contract deployment config when confirming owner prompts', async () => { + const owner = new Wallet(ANVIL_KEY).address; + const steps: TestPromptAction[] = [ + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: KeyBoardKeys.ENTER, + }, + ]; + + const output = hyperlaneCoreInit(CORE_CONFIG_PATH_2, ANVIL_KEY).stdio( + 'pipe', + ); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig(deploymentCoreConfig, owner); + }); + + it('should successfully generate the core contract deployment config when not confirming owner prompts', async () => { + const owner = new Wallet(ANVIL_KEY).address; + const feeHookOwner = normalizeAddress(randomAddress()); + const steps: TestPromptAction[] = [ + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput) => + !!currentOutput.match(/Use this same address \((.*?)\) for/), + input: `no${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput) => + currentOutput.includes('Enter beneficiary address for'), + input: `${feeHookOwner}${KeyBoardKeys.ENTER}`, + }, + ]; + + const output = hyperlaneCoreInit(CORE_CONFIG_PATH_2, ANVIL_KEY).stdio( + 'pipe', + ); + + const finalOutput = await handlePrompts(output, steps); + + expect(finalOutput.exitCode).to.equal(0); + + const deploymentCoreConfig: CoreConfig = + readYamlOrJson(CORE_CONFIG_PATH_2); + assertCoreInitConfig( + deploymentCoreConfig, + owner, + undefined, + feeHookOwner, + ); + }); + }); +}); diff --git a/typescript/cli/src/tests/core-read.e2e-test.ts b/typescript/cli/src/tests/core/core-read.e2e-test.ts similarity index 90% rename from typescript/cli/src/tests/core-read.e2e-test.ts rename to typescript/cli/src/tests/core/core-read.e2e-test.ts index 7390e8dca4..9ed0a3ca01 100644 --- a/typescript/cli/src/tests/core-read.e2e-test.ts +++ b/typescript/cli/src/tests/core/core-read.e2e-test.ts @@ -8,9 +8,8 @@ import { } from '@hyperlane-xyz/sdk'; import { Address } from '@hyperlane-xyz/utils'; -import { readYamlOrJson } from '../utils/files.js'; - -import { hyperlaneCoreDeploy, readCoreConfig } from './commands/core.js'; +import { readYamlOrJson } from '../../utils/files.js'; +import { hyperlaneCoreDeploy, readCoreConfig } from '../commands/core.js'; import { ANVIL_KEY, CHAIN_2_METADATA_PATH, @@ -18,7 +17,7 @@ import { CORE_CONFIG_PATH, CORE_READ_CONFIG_PATH_2, DEFAULT_E2E_TEST_TIMEOUT, -} from './commands/helpers.js'; +} from '../commands/helpers.js'; describe('hyperlane core read e2e tests', async function () { this.timeout(DEFAULT_E2E_TEST_TIMEOUT); diff --git a/typescript/cli/src/tests/warp-init.e2e-test.ts b/typescript/cli/src/tests/warp-init.e2e-test.ts index b3314a30a9..66cfa3bfc7 100644 --- a/typescript/cli/src/tests/warp-init.e2e-test.ts +++ b/typescript/cli/src/tests/warp-init.e2e-test.ts @@ -16,14 +16,18 @@ import { ANVIL_KEY, CHAIN_NAME_2, CHAIN_NAME_3, + CONFIRM_DETECTED_OWNER_STEP, CORE_CONFIG_PATH, DEFAULT_E2E_TEST_TIMEOUT, KeyBoardKeys, + SELECT_ANVIL_2_AND_ANVIL_3_STEPS, + SELECT_ANVIL_2_FROM_MULTICHAIN_PICKER, + SELECT_MAINNET_CHAIN_TYPE_STEP, + TestPromptAction, WARP_CONFIG_PATH_2, - asyncStreamInputWrite, deployOrUseExistingCore, deployToken, - selectAnvil2AndAnvil3, + handlePrompts, } from './commands/helpers.js'; import { hyperlaneWarpInit } from './commands/warp.js'; @@ -67,37 +71,26 @@ describe('hyperlane warp init e2e tests', async function () { } it('it should generate a warp deploy config with a single chain', async function () { - const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); - - for await (const out of output.stdout) { - const currentLine: string = out.toString(); - - if ( - currentLine.includes('Creating a new warp route deployment config...') - ) { - // Select mainnet chains - await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); - } else if (currentLine.includes('--Mainnet Chains--')) { + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + { + check: (currentOutput: string) => + currentOutput.includes('--Mainnet Chains--'), // Scroll down through the mainnet chains list and select anvil2 - await asyncStreamInputWrite( - output.stdin, - `${KeyBoardKeys.ARROW_DOWN.repeat(3)}${KeyBoardKeys.TAB}${ - KeyBoardKeys.ENTER - }`, - ); - } else if (currentLine.includes('token type')) { + input: `${SELECT_ANVIL_2_FROM_MULTICHAIN_PICKER}${KeyBoardKeys.ENTER}`, + }, + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), // Scroll up through the token type list and select native - await asyncStreamInputWrite( - output.stdin, - `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, - ); - } else if (currentLine.includes('Detected owner address as')) { - // Confirm owner prompts - await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); - } - } - - await output; + input: `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, + }, + ]; + + const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); + + await handlePrompts(output, steps); const warpConfig: WarpRouteDeployConfig = readYamlOrJson(WARP_CONFIG_PATH_2); @@ -106,31 +99,26 @@ describe('hyperlane warp init e2e tests', async function () { }); it('it should generate a warp deploy config with a 2 chains warp route (native->native)', async function () { + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + ...SELECT_ANVIL_2_AND_ANVIL_3_STEPS, + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + input: `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, + }, + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + input: `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, + }, + ]; + const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); - for await (const out of output.stdout) { - const currentLine: string = out.toString(); - - if ( - currentLine.includes('Creating a new warp route deployment config...') - ) { - // Select mainnet chains - await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); - } else if (currentLine.includes('--Mainnet Chains--')) { - await selectAnvil2AndAnvil3(output); - } else if (currentLine.match(/Select .+?'s token type/)) { - // Scroll up through the token type list and select native - await asyncStreamInputWrite( - output.stdin, - `${KeyBoardKeys.ARROW_UP.repeat(2)}${KeyBoardKeys.ENTER}`, - ); - } else if (currentLine.includes('Detected owner address as')) { - // Confirm owner prompts - await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); - } - } - - await output; + await handlePrompts(output, steps); const warpConfig: WarpRouteDeployConfig = readYamlOrJson(WARP_CONFIG_PATH_2); @@ -142,46 +130,35 @@ describe('hyperlane warp init e2e tests', async function () { it('it should generate a warp deploy config with a 2 chains warp route (collateral->synthetic)', async function () { const erc20Token = await deployToken(ANVIL_KEY, CHAIN_NAME_2, 6); + const steps: TestPromptAction[] = [ + SELECT_MAINNET_CHAIN_TYPE_STEP, + ...SELECT_ANVIL_2_AND_ANVIL_3_STEPS, + // First chain token config + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + // Scroll down through the token type list and select collateral + input: `${KeyBoardKeys.ARROW_DOWN.repeat(4)}${KeyBoardKeys.ENTER}`, + }, + { + check: (currentOutput: string) => + currentOutput.includes('Enter the existing token address on chain'), + input: `${erc20Token.address}${KeyBoardKeys.ENTER}`, + }, + // Other chain token config + CONFIRM_DETECTED_OWNER_STEP, + { + check: (currentOutput: string) => + !!currentOutput.match(/Select .+?'s token type/), + // Select the synthetic token type + input: `${KeyBoardKeys.ENTER}`, + }, + ]; const output = hyperlaneWarpInit(WARP_CONFIG_PATH_2).stdio('pipe'); - let tokenStep = 0; - for await (const out of output.stdout) { - const currentLine: string = out.toString(); - - if ( - currentLine.includes('Creating a new warp route deployment config...') - ) { - // Select mainnet chains - await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); - } else if (currentLine.includes('--Mainnet Chains--')) { - await selectAnvil2AndAnvil3(output); - } else if ( - currentLine.includes('Enter the existing token address on chain') - ) { - await asyncStreamInputWrite( - output.stdin, - `${erc20Token.address}${KeyBoardKeys.ENTER}`, - ); - } else if (currentLine.match(/Select .+?'s token type/)) { - if (tokenStep === 0) { - // Scroll down through the token type list and select collateral - await asyncStreamInputWrite( - output.stdin, - `${KeyBoardKeys.ARROW_DOWN.repeat(4)}${KeyBoardKeys.ENTER}`, - ); - } else if (tokenStep === 1) { - // Select the synthetic token type - await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); - } - tokenStep++; - } else if (currentLine.includes('Detected owner address as')) { - // Confirm owner prompts - await asyncStreamInputWrite(output.stdin, KeyBoardKeys.ENTER); - } - } - - await output; + await handlePrompts(output, steps); const warpConfig: WarpRouteDeployConfig = readYamlOrJson(WARP_CONFIG_PATH_2); From a5ece3b308afa13f60f8755b09d9000020aa30fb Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion <131957285+ljankovic-txfusion@users.noreply.github.com> Date: Thu, 2 Jan 2025 18:38:14 +0100 Subject: [PATCH 25/81] feat: Add chain technical stack configuration to registry init (#5049) ### Description The PR adds support for specifying chain technical stacks during registry initialization, with special handling for Arbitrum Nitro chains. ### Drive-by changes - Add technical stack selector during chain configuration to `hyperlane registry init` CLI command - Add special handling for Arbitrum Nitro chains with` index.from `parameter - Update chain metadata schema to include technical stack information ### Related issues None ### Backward compatibility Yes ### Testing Manual testing of `registry init` --------- Co-authored-by: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Co-authored-by: mshojaei-txfusion <138107084+mshojaei-txfusion@users.noreply.github.com> --- .changeset/two-jeans-sin.md | 5 +++++ typescript/cli/src/config/chain.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 .changeset/two-jeans-sin.md diff --git a/.changeset/two-jeans-sin.md b/.changeset/two-jeans-sin.md new file mode 100644 index 0000000000..2cc997f9bb --- /dev/null +++ b/.changeset/two-jeans-sin.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Add chain technical stack selector with Arbitrum Nitro support to `hyperlane registry init` command diff --git a/typescript/cli/src/config/chain.ts b/typescript/cli/src/config/chain.ts index e710b6cf00..07064b5e87 100644 --- a/typescript/cli/src/config/chain.ts +++ b/typescript/cli/src/config/chain.ts @@ -5,6 +5,7 @@ import { stringify as yamlStringify } from 'yaml'; import { ChainMetadata, ChainMetadataSchema, + ChainTechnicalStack, EthJsonRpcBlockParameterTag, ExplorerFamily, ZChainName, @@ -87,14 +88,40 @@ export async function createChainConfig({ 'Is this chain a testnet (a chain used for testing & development)?', }); + const technicalStack = (await select({ + choices: Object.entries(ChainTechnicalStack).map(([_, value]) => ({ + value, + })), + message: 'Select the chain technical stack', + pageSize: 10, + })) as ChainTechnicalStack; + + const arbitrumNitroMetadata: Pick = {}; + if (technicalStack === ChainTechnicalStack.ArbitrumNitro) { + const indexFrom = await detectAndConfirmOrPrompt( + async () => { + return (await provider.getBlockNumber()).toString(); + }, + `Enter`, + 'starting block number for indexing', + 'JSON RPC provider', + ); + + arbitrumNitroMetadata.index = { + from: parseInt(indexFrom), + }; + } + const metadata: ChainMetadata = { name, displayName, chainId, domainId: chainId, protocol: ProtocolType.Ethereum, + technicalStack, rpcUrls: [{ http: rpcUrl }], isTestnet, + ...arbitrumNitroMetadata, }; await addBlockExplorerConfig(metadata); From d35502fa7c607539bd640169c9d0b7230f039c90 Mon Sep 17 00:00:00 2001 From: xeno097 Date: Thu, 2 Jan 2025 17:32:55 -0400 Subject: [PATCH 26/81] feat: better chain selection for single chain (#4824) ### Description This PR updates the single chain selection prompt to use a search prompt instead of a select one. ### Drive-by changes - Adds missing `:` where the `runSingleChainSelectionStep` is used. - Installs the `@inquirer/search` package ### Related issues - Fixes #4823 ### Backward compatibility - Yes ### Testing - Manual --------- Co-authored-by: Lee <6251863+ltyu@users.noreply.github.com> --- .changeset/yellow-icons-do.md | 5 +++ typescript/cli/package.json | 1 + typescript/cli/src/config/hooks.ts | 2 +- typescript/cli/src/deploy/agent.ts | 2 +- typescript/cli/src/send/message.ts | 4 +- typescript/cli/src/send/transfer.ts | 4 +- typescript/cli/src/status/message.ts | 2 +- typescript/cli/src/utils/chains.ts | 23 ++++++++++-- yarn.lock | 55 ++++++++++++++++++++++++++++ 9 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 .changeset/yellow-icons-do.md diff --git a/.changeset/yellow-icons-do.md b/.changeset/yellow-icons-do.md new file mode 100644 index 0000000000..c8e5a583ed --- /dev/null +++ b/.changeset/yellow-icons-do.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Update single chain selection to be searchable instead of a simple select diff --git a/typescript/cli/package.json b/typescript/cli/package.json index 3a249e154c..c8f53b25df 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -11,6 +11,7 @@ "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", "@inquirer/prompts": "3.3.2", + "@inquirer/search": "^3.0.1", "ansi-escapes": "^7.0.0", "asn1.js": "^5.4.1", "bignumber.js": "^9.1.1", diff --git a/typescript/cli/src/config/hooks.ts b/typescript/cli/src/config/hooks.ts index 5ad005dc24..1ca07a9a70 100644 --- a/typescript/cli/src/config/hooks.ts +++ b/typescript/cli/src/config/hooks.ts @@ -270,7 +270,7 @@ async function getOwnerAndBeneficiary( async function selectIgpChains(context: CommandContext) { const localChain = await runSingleChainSelectionStep( context.chainMetadata, - 'Select local chain for IGP hook', + 'Select local chain for IGP hook:', ); const isTestnet = context.chainMetadata[localChain].isTestnet; const remoteChains = await runMultiChainSelectionStep({ diff --git a/typescript/cli/src/deploy/agent.ts b/typescript/cli/src/deploy/agent.ts index a36955a3f3..034a2e5136 100644 --- a/typescript/cli/src/deploy/agent.ts +++ b/typescript/cli/src/deploy/agent.ts @@ -25,7 +25,7 @@ export async function runKurtosisAgentDeploy({ if (!originChain) { originChain = await runSingleChainSelectionStep( context.chainMetadata, - 'Select the origin chain', + 'Select the origin chain:', ); } if (!relayChains) { diff --git a/typescript/cli/src/send/message.ts b/typescript/cli/src/send/message.ts index f7d5eb4e15..e43d08fe2c 100644 --- a/typescript/cli/src/send/message.ts +++ b/typescript/cli/src/send/message.ts @@ -33,14 +33,14 @@ export async function sendTestMessage({ if (!origin) { origin = await runSingleChainSelectionStep( chainMetadata, - 'Select the origin chain', + 'Select the origin chain:', ); } if (!destination) { destination = await runSingleChainSelectionStep( chainMetadata, - 'Select the destination chain', + 'Select the destination chain:', ); } diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index 2929b09c6e..134eb9b3b3 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -53,14 +53,14 @@ export async function sendTestTransfer({ if (!origin) { origin = await runSingleChainSelectionStep( chainMetadata, - 'Select the origin chain', + 'Select the origin chain:', ); } if (!destination) { destination = await runSingleChainSelectionStep( chainMetadata, - 'Select the destination chain', + 'Select the destination chain:', ); } diff --git a/typescript/cli/src/status/message.ts b/typescript/cli/src/status/message.ts index b5051b4c92..a63caa4e3e 100644 --- a/typescript/cli/src/status/message.ts +++ b/typescript/cli/src/status/message.ts @@ -24,7 +24,7 @@ export async function checkMessageStatus({ if (!origin) { origin = await runSingleChainSelectionStep( context.chainMetadata, - 'Select the origin chain', + 'Select the origin chain:', ); } diff --git a/typescript/cli/src/utils/chains.ts b/typescript/cli/src/utils/chains.ts index 7e2eaccd0a..7f2f88fad8 100644 --- a/typescript/cli/src/utils/chains.ts +++ b/typescript/cli/src/utils/chains.ts @@ -1,4 +1,5 @@ import { Separator, confirm } from '@inquirer/prompts'; +import search from '@inquirer/search'; import select from '@inquirer/select'; import chalk from 'chalk'; @@ -23,9 +24,21 @@ export async function runSingleChainSelectionStep( chainMetadata, networkType, ); - const chain = (await select({ - message, - choices: [networkTypeSeparator, ...choices], + + const formattedMessage = message.endsWith(':') ? message : `${message}:`; + const options = [networkTypeSeparator, ...choices]; + const chain = (await search({ + message: formattedMessage, + source: (searchTerm) => { + if (!searchTerm) { + return options; + } + + return options.filter( + (value) => + Separator.isSeparator(value) || value.value.includes(searchTerm), + ); + }, pageSize: calculatePageSize(2), })) as string; handleNewChain([chain]); @@ -142,7 +155,9 @@ function getChainChoices( networkType: 'mainnet' | 'testnet', ) { const chainsToChoices = (chains: ChainMetadata[]) => - chains.map((c) => ({ name: c.name, value: c.name })); + chains + .map((c) => ({ name: c.name, value: c.name })) + .sort((a, b) => a.name.localeCompare(b.name)); const chains = Object.values(chainMetadata); const filteredChains = chains.filter((c) => diff --git a/yarn.lock b/yarn.lock index da261caf33..cace082811 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7326,6 +7326,7 @@ __metadata: "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" "@inquirer/prompts": "npm:3.3.2" + "@inquirer/search": "npm:^3.0.1" "@types/chai-as-promised": "npm:^8" "@types/mocha": "npm:^10.0.1" "@types/node": "npm:^18.14.5" @@ -7737,6 +7738,23 @@ __metadata: languageName: node linkType: hard +"@inquirer/core@npm:^10.1.2": + version: 10.1.2 + resolution: "@inquirer/core@npm:10.1.2" + dependencies: + "@inquirer/figures": "npm:^1.0.9" + "@inquirer/type": "npm:^3.0.2" + ansi-escapes: "npm:^4.3.2" + cli-width: "npm:^4.1.0" + mute-stream: "npm:^2.0.0" + signal-exit: "npm:^4.1.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^6.2.0" + yoctocolors-cjs: "npm:^2.1.2" + checksum: 10/e92ade5ba7dbcfd83629db2df7fb91877ac777a7f1e03a16b0d5c08621dafe09d321c5f14b37c2dca80a3db2d68e5a478f8eaeafcb62ed42c46e7349b7276094 + languageName: node + linkType: hard + "@inquirer/core@npm:^6.0.0": version: 6.0.0 resolution: "@inquirer/core@npm:6.0.0" @@ -7790,6 +7808,13 @@ __metadata: languageName: node linkType: hard +"@inquirer/figures@npm:^1.0.9": + version: 1.0.9 + resolution: "@inquirer/figures@npm:1.0.9" + checksum: 10/7ced1275a5826cdeb61797d6c068417e7d52aa87894de18cedd259f783f42d731226c3f8b92cab27b8e7b0e31ab1dd3cd77f16935b67ebe1cbb271e5972d7758 + languageName: node + linkType: hard + "@inquirer/input@npm:^1.2.16": version: 1.2.16 resolution: "@inquirer/input@npm:1.2.16" @@ -7841,6 +7866,20 @@ __metadata: languageName: node linkType: hard +"@inquirer/search@npm:^3.0.1": + version: 3.0.4 + resolution: "@inquirer/search@npm:3.0.4" + dependencies: + "@inquirer/core": "npm:^10.1.2" + "@inquirer/figures": "npm:^1.0.9" + "@inquirer/type": "npm:^3.0.2" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + checksum: 10/e2363f808e32983d659049cabc21f57e8b7dd7b591677b4bd1be0c45653e3d86f98f1772f3866bc97f14f63983399b259e8956eda181fafbe7eea07f8169bd95 + languageName: node + linkType: hard + "@inquirer/select@npm:^1.3.3": version: 1.3.3 resolution: "@inquirer/select@npm:1.3.3" @@ -7872,6 +7911,15 @@ __metadata: languageName: node linkType: hard +"@inquirer/type@npm:^3.0.2": + version: 3.0.2 + resolution: "@inquirer/type@npm:3.0.2" + peerDependencies: + "@types/node": ">=18" + checksum: 10/d1a2879b1baa357421cef441fc7b43181e110243933763ae922c55c2fc9af2d459ceaca8b71ed57e3dabd5077542fa0dd1d0ff0cf362ce054e61202386b545ed + languageName: node + linkType: hard + "@interchain-ui/react@npm:^1.23.28": version: 1.26.1 resolution: "@interchain-ui/react@npm:1.26.1" @@ -29046,6 +29094,13 @@ __metadata: languageName: node linkType: hard +"mute-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "mute-stream@npm:2.0.0" + checksum: 10/d2e4fd2f5aa342b89b98134a8d899d8ef9b0a6d69274c4af9df46faa2d97aeb1f2ce83d867880d6de63643c52386579b99139801e24e7526c3b9b0a6d1e18d6c + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" From 99c91d8da34e417af536100cb4b726eae08b14c4 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 3 Jan 2025 19:54:14 +0000 Subject: [PATCH 27/81] feat: bump overhead when sending to zkSync chains (#5103) ### Description Context: https://discord.com/channels/935678348330434570/1319115367167033399/1319442102454849639 zkSync chains have non standard EVM gas metering, and their eth_estimateGas RPC returns abnormally high estimates compared to the actual usage. As a semi-temporary workaround, we bump the overhead to result in more gas paid for. The impact of this is actually not meaningful when it comes to cost borne by users - because the zkSync chains are cheap, our min fee logic means that applying this still results in a ~20c cost to users ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/igp.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/typescript/infra/config/environments/mainnet3/igp.ts b/typescript/infra/config/environments/mainnet3/igp.ts index 2b388afdd2..3dbe6c775e 100644 --- a/typescript/infra/config/environments/mainnet3/igp.ts +++ b/typescript/infra/config/environments/mainnet3/igp.ts @@ -1,6 +1,7 @@ import { ChainMap, ChainName, + ChainTechnicalStack, HookType, IgpConfig, getTokenExchangeRateFromValues, @@ -14,6 +15,7 @@ import { getOverhead, } from '../../../src/config/gas-oracle.js'; import { mustGetChainNativeToken } from '../../../src/utils/utils.js'; +import { getChain } from '../../registry.js'; import { ethereumChainNames } from './chains.js'; import gasPrices from './gasPrices.json'; @@ -25,9 +27,15 @@ const tokenPrices: ChainMap = rawTokenPrices; export function getOverheadWithOverrides(local: ChainName, remote: ChainName) { let overhead = getOverhead(local, remote, ethereumChainNames); + // Moonbeam gas usage can be up to 4x higher than vanilla EVM if (remote === 'moonbeam') { overhead *= 4; } + // ZkSync gas usage is different from the EVM and tends to give high + // estimates. We double the overhead to help account for this. + if (getChain(remote).technicalStack === ChainTechnicalStack.ZkSync) { + overhead *= 2; + } return overhead; } From c5d4bd60384062ea66f3cf23ca2df952b0b6d5b0 Mon Sep 17 00:00:00 2001 From: Jeff Date: Mon, 6 Jan 2025 22:43:26 +0900 Subject: [PATCH 28/81] =?UTF-8?q?feat:=20add=20the=20#=20of=20messages=20p?= =?UTF-8?q?rioritized=20in=20the=20queue=20to=20the=20http=20resp=E2=80=A6?= =?UTF-8?q?=20(#5043)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Add a mpsc channel between relayer and message retry handler, so message retry handler knows the retry results from the relayer. `POST /message_retry` endpoint now returns a JSON with details on the retry request: ```rust #[derive(Clone, Debug, Deserialize, Serialize)] pub struct MessageRetryResponse { /// ID of the retry request pub uuid: String, /// how many pending operations were processed pub processed: usize, /// how many of the pending operations matched the retry request pattern pub matched: u64, } ``` ### Drive-by changes ### Related issues Fixes https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/4059 ### Backward compatibility ### Testing Updated unit tests to return a response so the handler is not blocked --- rust/main/Cargo.lock | 31 +- rust/main/Cargo.toml | 1 + rust/main/agents/relayer/Cargo.toml | 3 + rust/main/agents/relayer/src/lib.rs | 3 +- rust/main/agents/relayer/src/msg/op_queue.rs | 83 ++++- .../agents/relayer/src/msg/op_submitter.rs | 4 +- rust/main/agents/relayer/src/relayer.rs | 5 +- .../relayer/src/server/list_messages.rs | 1 + .../relayer/src/server/message_retry.rs | 286 ++++++++++++++---- rust/main/agents/relayer/src/server/mod.rs | 11 +- rust/main/utils/run-locally/Cargo.toml | 1 + rust/main/utils/run-locally/src/main.rs | 5 + rust/main/utils/run-locally/src/server.rs | 55 ++++ 13 files changed, 403 insertions(+), 86 deletions(-) create mode 100644 rust/main/utils/run-locally/src/server.rs diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index 4f728ab69f..47aec03422 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -512,6 +512,7 @@ checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", + "axum-macros", "bitflags 1.3.2", "bytes", "futures-util", @@ -553,6 +554,18 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-macros" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "backtrace" version = "0.3.71" @@ -7015,7 +7028,9 @@ dependencies = [ "tokio-test", "tracing", "tracing-futures", + "tracing-test", "typetag", + "uuid 1.11.0", ] [[package]] @@ -7150,7 +7165,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.10.0", + "uuid 1.11.0", ] [[package]] @@ -7250,6 +7265,7 @@ dependencies = [ "once_cell", "regex", "relayer", + "reqwest", "ripemd", "serde", "serde_json", @@ -7749,7 +7765,7 @@ dependencies = [ "time", "tracing", "url", - "uuid 1.10.0", + "uuid 1.11.0", ] [[package]] @@ -7810,7 +7826,7 @@ dependencies = [ "sea-query-derive", "serde_json", "time", - "uuid 1.10.0", + "uuid 1.11.0", ] [[package]] @@ -7826,7 +7842,7 @@ dependencies = [ "serde_json", "sqlx", "time", - "uuid 1.10.0", + "uuid 1.11.0", ] [[package]] @@ -9126,7 +9142,7 @@ dependencies = [ "time", "tokio-stream", "url", - "uuid 1.10.0", + "uuid 1.11.0", "whoami", ] @@ -10363,10 +10379,11 @@ dependencies = [ [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ + "getrandom 0.2.15", "serde", ] diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index 8b1a9b58e0..d9fee1663f 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -153,6 +153,7 @@ typetag = "0.2" uint = "0.9.5" ureq = { version = "2.4", default-features = false } url = "2.3" +uuid = { version = "1.11.0", features = ["v4"] } walkdir = "2" warp = "0.3" which = "4.3" diff --git a/rust/main/agents/relayer/Cargo.toml b/rust/main/agents/relayer/Cargo.toml index 5a891d912c..fcd89da771 100644 --- a/rust/main/agents/relayer/Cargo.toml +++ b/rust/main/agents/relayer/Cargo.toml @@ -44,6 +44,7 @@ tokio-metrics.workspace = true tracing-futures.workspace = true tracing.workspace = true typetag.workspace = true +uuid.workspace = true hyperlane-core = { path = "../../hyperlane-core", features = [ "agent", @@ -53,12 +54,14 @@ hyperlane-base = { path = "../../hyperlane-base", features = ["test-utils"] } hyperlane-ethereum = { path = "../../chains/hyperlane-ethereum" } [dev-dependencies] +axum = { workspace = true, features = ["macros"] } once_cell.workspace = true mockall.workspace = true tokio-test.workspace = true hyperlane-test = { path = "../../hyperlane-test" } hyperlane-base = { path = "../../hyperlane-base", features = ["test-utils"] } hyperlane-core = { path = "../../hyperlane-core", features = ["agent", "async", "test-utils"] } +tracing-test.workspace = true [features] default = ["color-eyre", "oneline-errors"] diff --git a/rust/main/agents/relayer/src/lib.rs b/rust/main/agents/relayer/src/lib.rs index 62b896d628..9a6e1e4147 100644 --- a/rust/main/agents/relayer/src/lib.rs +++ b/rust/main/agents/relayer/src/lib.rs @@ -3,8 +3,9 @@ mod msg; mod processor; mod prover; mod relayer; -mod server; mod settings; +pub mod server; + pub use msg::GAS_EXPENDITURE_LOG_MESSAGE; pub use relayer::*; diff --git a/rust/main/agents/relayer/src/msg/op_queue.rs b/rust/main/agents/relayer/src/msg/op_queue.rs index 99c9dde39f..d0640bc2a3 100644 --- a/rust/main/agents/relayer/src/msg/op_queue.rs +++ b/rust/main/agents/relayer/src/msg/op_queue.rs @@ -6,7 +6,7 @@ use prometheus::{IntGauge, IntGaugeVec}; use tokio::sync::{broadcast::Receiver, Mutex}; use tracing::{debug, info, instrument}; -use crate::settings::matching_list::MatchingList; +use crate::server::{MessageRetryRequest, MessageRetryResponse}; pub type OperationPriorityQueue = Arc>>>; @@ -16,7 +16,7 @@ pub type OperationPriorityQueue = Arc>> pub struct OpQueue { metrics: IntGaugeVec, queue_metrics_label: String, - retry_rx: Arc>>, + retry_receiver: Arc>>, #[new(default)] pub queue: OperationPriorityQueue, } @@ -72,27 +72,67 @@ impl OpQueue { // The other consideration is whether to put the channel receiver in the OpQueue or in a dedicated task // that also holds an Arc to the Mutex. For simplicity, we'll put it in the OpQueue for now. let mut message_retry_requests = vec![]; - while let Ok(message_id) = self.retry_rx.lock().await.try_recv() { - message_retry_requests.push(message_id); + + while let Ok(retry_request) = self.retry_receiver.lock().await.try_recv() { + let uuid = retry_request.uuid.clone(); + message_retry_requests.push(( + retry_request, + MessageRetryResponse { + uuid, + evaluated: 0, + matched: 0, + }, + )); } + if message_retry_requests.is_empty() { return; } + let mut queue = self.queue.lock().await; + let queue_length = queue.len(); + let mut reprioritized_queue: BinaryHeap<_> = queue .drain() .map(|Reverse(mut op)| { - if message_retry_requests.iter().any(|r| r.op_matches(&op)) { + let matched_requests: Vec<_> = message_retry_requests + .iter_mut() + .filter_map(|(retry_req, retry_response)| { + // update retry metrics + if retry_req.pattern.op_matches(&op) { + debug!(uuid = retry_req.uuid, "Matched request"); + retry_response.matched += 1; + Some(retry_req.uuid.clone()) + } else { + None + } + }) + .collect(); + + if !matched_requests.is_empty() { info!( operation = %op, queue_label = %self.queue_metrics_label, "Retrying OpQueue operation" ); - op.reset_attempts() + op.reset_attempts(); } Reverse(op) }) .collect(); + + for (retry_req, mut retry_response) in message_retry_requests { + retry_response.evaluated = queue_length; + tracing::debug!( + uuid = retry_response.uuid, + evaluated = retry_response.evaluated, + matched = retry_response.matched, + "Sending relayer retry response back" + ); + if let Err(err) = retry_req.transmitter.send(retry_response).await { + tracing::error!(?err, "Failed to send retry response"); + } + } queue.append(&mut reprioritized_queue); } @@ -115,7 +155,10 @@ impl OpQueue { #[cfg(test)] pub mod test { + use crate::{server::ENDPOINT_MESSAGES_QUEUE_SIZE, settings::matching_list::MatchingList}; + use super::*; + use hyperlane_core::{ HyperlaneDomain, HyperlaneDomainProtocol, HyperlaneDomainTechnicalStack, HyperlaneDomainType, HyperlaneMessage, KnownHyperlaneDomain, PendingOperationResult, @@ -127,7 +170,7 @@ pub mod test { str::FromStr, time::{Duration, Instant}, }; - use tokio::sync; + use tokio::sync::{self, mpsc}; #[derive(Debug, Clone, Serialize)] pub struct MockPendingOperation { @@ -320,6 +363,7 @@ pub mod test { async fn test_multiple_op_queues_message_id() { let (metrics, queue_metrics_label) = dummy_metrics_and_label(); let broadcaster = sync::broadcast::Sender::new(100); + let mut op_queue_1 = OpQueue::new( metrics.clone(), queue_metrics_label.clone(), @@ -364,12 +408,22 @@ pub mod test { .await; } + let (transmitter, _receiver) = mpsc::channel(ENDPOINT_MESSAGES_QUEUE_SIZE); + // Retry by message ids broadcaster - .send(MatchingList::with_message_id(op_ids[1])) + .send(MessageRetryRequest { + uuid: "0e92ace7-ba5d-4a1f-8501-51b6d9d500cf".to_string(), + pattern: MatchingList::with_message_id(op_ids[1]), + transmitter: transmitter.clone(), + }) .unwrap(); broadcaster - .send(MatchingList::with_message_id(op_ids[2])) + .send(MessageRetryRequest { + uuid: "59400966-e7fa-4fb9-9372-9a671d4392c3".to_string(), + pattern: MatchingList::with_message_id(op_ids[2]), + transmitter, + }) .unwrap(); // Pop elements from queue 1 @@ -399,6 +453,7 @@ pub mod test { async fn test_destination_domain() { let (metrics, queue_metrics_label) = dummy_metrics_and_label(); let broadcaster = sync::broadcast::Sender::new(100); + let mut op_queue = OpQueue::new( metrics.clone(), queue_metrics_label.clone(), @@ -425,11 +480,15 @@ pub mod test { .await; } + let (transmitter, _receiver) = mpsc::channel(ENDPOINT_MESSAGES_QUEUE_SIZE); + // Retry by domain broadcaster - .send(MatchingList::with_destination_domain( - destination_domain_2.id(), - )) + .send(MessageRetryRequest { + uuid: "a5b39473-7cc5-48a1-8bed-565454ba1037".to_string(), + pattern: MatchingList::with_destination_domain(destination_domain_2.id()), + transmitter, + }) .unwrap(); // Pop elements from queue diff --git a/rust/main/agents/relayer/src/msg/op_submitter.rs b/rust/main/agents/relayer/src/msg/op_submitter.rs index c1e295a24a..f35a991c45 100644 --- a/rust/main/agents/relayer/src/msg/op_submitter.rs +++ b/rust/main/agents/relayer/src/msg/op_submitter.rs @@ -32,7 +32,7 @@ use hyperlane_core::{ }; use crate::msg::pending_message::CONFIRM_DELAY; -use crate::settings::matching_list::MatchingList; +use crate::server::MessageRetryRequest; use super::op_queue::OpQueue; use super::op_queue::OperationPriorityQueue; @@ -105,7 +105,7 @@ impl SerialSubmitter { pub fn new( domain: HyperlaneDomain, rx: mpsc::UnboundedReceiver, - retry_op_transmitter: Sender, + retry_op_transmitter: Sender, metrics: SerialSubmitterMetrics, max_batch_size: u32, task_monitor: TaskMonitor, diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index b1f013b6ae..4c3d8d33bb 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -318,10 +318,11 @@ impl BaseAgent for Relayer { })); tasks.push(console_server.instrument(info_span!("Tokio console server"))); } - let sender = BroadcastSender::::new(ENDPOINT_MESSAGES_QUEUE_SIZE); + let sender = BroadcastSender::new(ENDPOINT_MESSAGES_QUEUE_SIZE); // send channels by destination chain let mut send_channels = HashMap::with_capacity(self.destination_chains.len()); let mut prep_queues = HashMap::with_capacity(self.destination_chains.len()); + for (dest_domain, dest_conf) in &self.destination_chains { let (send_channel, receive_channel) = mpsc::unbounded_channel::(); send_channels.insert(dest_domain.id(), send_channel); @@ -385,7 +386,7 @@ impl BaseAgent for Relayer { ); } // run server - let custom_routes = relayer_server::Server::new() + let custom_routes = relayer_server::Server::new(self.origin_chains.len()) .with_op_retry(sender.clone()) .with_message_queue(prep_queues) .routes(); diff --git a/rust/main/agents/relayer/src/server/list_messages.rs b/rust/main/agents/relayer/src/server/list_messages.rs index e21f39a5df..f6c92ba088 100644 --- a/rust/main/agents/relayer/src/server/list_messages.rs +++ b/rust/main/agents/relayer/src/server/list_messages.rs @@ -97,6 +97,7 @@ mod tests { fn setup_test_server() -> (SocketAddr, OperationPriorityQueue) { let (metrics, queue_metrics_label) = dummy_metrics_and_label(); let broadcaster = sync::broadcast::Sender::new(100); + let op_queue = OpQueue::new( metrics.clone(), queue_metrics_label.clone(), diff --git a/rust/main/agents/relayer/src/server/message_retry.rs b/rust/main/agents/relayer/src/server/message_retry.rs index 6d160355a5..255614b43e 100644 --- a/rust/main/agents/relayer/src/server/message_retry.rs +++ b/rust/main/agents/relayer/src/server/message_retry.rs @@ -1,32 +1,89 @@ use crate::settings::matching_list::MatchingList; + use axum::{extract::State, routing, Json, Router}; + use derive_new::new; -use tokio::sync::broadcast::Sender; +use serde::{Deserialize, Serialize}; +use tokio::sync::{broadcast::Sender, mpsc}; const MESSAGE_RETRY_API_BASE: &str = "/message_retry"; -#[derive(new, Clone)] +#[derive(Clone, Debug, new)] pub struct MessageRetryApi { - tx: Sender, + retry_request_transmitter: Sender, + relayer_chains: usize, +} + +#[derive(Clone, Debug)] +pub struct MessageRetryRequest { + pub uuid: String, + pub pattern: MatchingList, + pub transmitter: mpsc::Sender, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +pub struct MessageRetryResponse { + /// ID of the retry request + pub uuid: String, + /// how many pending operations were evaluated + pub evaluated: usize, + /// how many of the pending operations matched the retry request pattern + pub matched: u64, } async fn retry_message( - State(tx): State>, + State(state): State, Json(retry_req_payload): Json, -) -> String { - match tx.send(retry_req_payload) { - Ok(_) => "Moved message(s) to the front of the queue".to_string(), - // Technically it's bad practice to print the error message to the user, but - // this endpoint is for debugging purposes only. - Err(err) => format!("Failed to send retry request to the queue: {}", err), +) -> Result, String> { + let uuid = uuid::Uuid::new_v4(); + let uuid_string = uuid.to_string(); + + tracing::debug!(uuid = uuid_string, "Sending message retry request"); + + // This channel is only created to service this single + // retry request so we're expecting a single response + // from each transmitter end, hence we are using a channel of size 1 + let (transmitter, mut receiver) = mpsc::channel(state.relayer_chains); + state + .retry_request_transmitter + .send(MessageRetryRequest { + uuid: uuid_string.clone(), + pattern: retry_req_payload, + transmitter, + }) + .map_err(|err| { + // Technically it's bad practice to print the error message to the user, but + // this endpoint is for debugging purposes only. + format!("Failed to send retry request to the queue: {}", err) + })?; + + let mut resp = MessageRetryResponse { + uuid: uuid_string, + evaluated: 0, + matched: 0, + }; + + // Wait for responses from relayer + tracing::debug!(uuid = resp.uuid, "Waiting for response from relayer"); + while let Some(relayer_resp) = receiver.recv().await { + tracing::debug!( + uuid = resp.uuid, + evaluated = resp.evaluated, + matched = resp.matched, + "Submitter response to retry request" + ); + resp.evaluated += relayer_resp.evaluated; + resp.matched += relayer_resp.matched; } + + Ok(Json(resp)) } impl MessageRetryApi { pub fn router(&self) -> Router { Router::new() .route("/", routing::post(retry_message)) - .with_state(self.tx.clone()) + .with_state(self.clone()) } pub fn get_route(&self) -> (&'static str, Router) { @@ -41,13 +98,21 @@ mod tests { use super::*; use axum::http::StatusCode; use hyperlane_core::{HyperlaneMessage, QueueOperation}; + use serde::de::DeserializeOwned; use serde_json::json; use std::net::SocketAddr; use tokio::sync::broadcast::{Receiver, Sender}; - fn setup_test_server() -> (SocketAddr, Receiver) { - let broadcast_tx = Sender::::new(ENDPOINT_MESSAGES_QUEUE_SIZE); - let message_retry_api = MessageRetryApi::new(broadcast_tx.clone()); + #[derive(Debug)] + struct TestServerSetup { + pub socket_address: SocketAddr, + pub retry_req_rx: Receiver, + } + + fn setup_test_server() -> TestServerSetup { + let broadcast_tx = Sender::new(ENDPOINT_MESSAGES_QUEUE_SIZE); + + let message_retry_api = MessageRetryApi::new(broadcast_tx.clone(), 10); let (path, retry_router) = message_retry_api.get_route(); let app = Router::new().nest(path, retry_router); @@ -58,12 +123,51 @@ mod tests { let addr = server.local_addr(); tokio::spawn(server); - (addr, broadcast_tx.subscribe()) + let retry_req_rx = broadcast_tx.subscribe(); + + TestServerSetup { + socket_address: addr, + retry_req_rx, + } + } + + async fn send_retry_responses_future( + mut retry_request_receiver: Receiver, + pending_operations: Vec, + metrics: Vec<(usize, u64)>, + ) { + if let Ok(req) = retry_request_receiver.recv().await { + for (op, (evaluated, matched)) in pending_operations.iter().zip(metrics) { + // Check that the list received by the server matches the pending operation + assert!(req.pattern.op_matches(&op)); + let resp = MessageRetryResponse { + uuid: req.uuid.clone(), + evaluated, + matched, + }; + req.transmitter.send(resp).await.unwrap(); + } + } } + async fn parse_response_to_json(response: reqwest::Response) -> T { + let resp_body = response + .text() + .await + .expect("Failed to parse response body"); + let resp_json: T = + serde_json::from_str(&resp_body).expect("Failed to deserialize response body"); + resp_json + } + + #[tracing_test::traced_test] #[tokio::test] async fn test_message_id_retry() { - let (addr, mut rx) = setup_test_server(); + let TestServerSetup { + socket_address: addr, + retry_req_rx, + .. + } = setup_test_server(); let client = reqwest::Client::new(); // Create a random message with a random message ID @@ -75,25 +179,37 @@ mod tests { } ]); + // spawn a task to respond to message retry request + let respond_task = send_retry_responses_future( + retry_req_rx, + vec![Box::new(pending_operation.clone()) as QueueOperation], + vec![(1, 1)], + ); + // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send() - .await - .unwrap(); + .send(); + + let (_t1, response_res) = tokio::join!(respond_task, response); + let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let list = rx.try_recv().unwrap(); - // Check that the list received by the server matches the pending operation - assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); + let resp_json: MessageRetryResponse = parse_response_to_json(response).await; + assert_eq!(resp_json.evaluated, 1); + assert_eq!(resp_json.matched, 1); } #[tokio::test] async fn test_destination_domain_retry() { - let (addr, mut rx) = setup_test_server(); + let TestServerSetup { + socket_address: addr, + retry_req_rx, + .. + } = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage { @@ -108,25 +224,37 @@ mod tests { } ]); + // spawn a task to respond to message retry request + let respond_task = send_retry_responses_future( + retry_req_rx, + vec![Box::new(pending_operation.clone()) as QueueOperation], + vec![(1, 1)], + ); + // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send() - .await - .unwrap(); + .send(); + + let (_t1, response_res) = tokio::join!(respond_task, response); + let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let list = rx.try_recv().unwrap(); - // Check that the list received by the server matches the pending operation - assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); + let resp_json: MessageRetryResponse = parse_response_to_json(response).await; + assert_eq!(resp_json.evaluated, 1); + assert_eq!(resp_json.matched, 1); } #[tokio::test] async fn test_origin_domain_retry() { - let (addr, mut rx) = setup_test_server(); + let TestServerSetup { + socket_address: addr, + retry_req_rx, + .. + } = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage { @@ -141,25 +269,37 @@ mod tests { } ]); + // spawn a task to respond to message retry request + let respond_task = send_retry_responses_future( + retry_req_rx, + vec![Box::new(pending_operation.clone()) as QueueOperation], + vec![(1, 1)], + ); + // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send() - .await - .unwrap(); + .send(); + let (_t1, response_res) = tokio::join!(respond_task, response); + + let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let list = rx.try_recv().unwrap(); - // Check that the list received by the server matches the pending operation - assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); + let resp_json: MessageRetryResponse = parse_response_to_json(response).await; + assert_eq!(resp_json.evaluated, 1); + assert_eq!(resp_json.matched, 1); } #[tokio::test] async fn test_sender_address_retry() { - let (addr, mut rx) = setup_test_server(); + let TestServerSetup { + socket_address: addr, + retry_req_rx, + .. + } = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage::default(); @@ -170,25 +310,37 @@ mod tests { } ]); + // spawn a task to respond to message retry request + let respond_task = send_retry_responses_future( + retry_req_rx, + vec![Box::new(pending_operation.clone()) as QueueOperation], + vec![(1, 1)], + ); + // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send() - .await - .unwrap(); + .send(); + + let (_t1, response_res) = tokio::join!(respond_task, response); + let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let list = rx.try_recv().unwrap(); - // Check that the list received by the server matches the pending operation - assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); + let resp_json: MessageRetryResponse = parse_response_to_json(response).await; + assert_eq!(resp_json.evaluated, 1); + assert_eq!(resp_json.matched, 1); } #[tokio::test] async fn test_recipient_address_retry() { - let (addr, mut rx) = setup_test_server(); + let TestServerSetup { + socket_address: addr, + retry_req_rx, + .. + } = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage::default(); @@ -199,25 +351,37 @@ mod tests { } ]); + // spawn a task to respond to message retry request + let respond_task = send_retry_responses_future( + retry_req_rx, + vec![Box::new(pending_operation.clone()) as QueueOperation], + vec![(1, 1)], + ); + // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send() - .await - .unwrap(); + .send(); + let (_t1, response_res) = tokio::join!(respond_task, response); + + let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let list = rx.try_recv().unwrap(); - // Check that the list received by the server matches the pending operation - assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); + let resp_json: MessageRetryResponse = parse_response_to_json(response).await; + assert_eq!(resp_json.evaluated, 1); + assert_eq!(resp_json.matched, 1); } #[tokio::test] async fn test_multiple_retry() { - let (addr, mut rx) = setup_test_server(); + let TestServerSetup { + socket_address: addr, + retry_req_rx, + .. + } = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage { @@ -238,19 +402,27 @@ mod tests { } ]); + // spawn a task to respond to message retry request + let respond_task = send_retry_responses_future( + retry_req_rx, + vec![Box::new(pending_operation.clone()) as QueueOperation], + vec![(1, 1)], + ); + // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send() - .await - .unwrap(); + .send(); + + let (_t1, response_res) = tokio::join!(respond_task, response); + let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let list = rx.try_recv().unwrap(); - // Check that the list received by the server matches the pending operation - assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); + let resp_json: MessageRetryResponse = parse_response_to_json(response).await; + assert_eq!(resp_json.evaluated, 1); + assert_eq!(resp_json.matched, 1); } } diff --git a/rust/main/agents/relayer/src/server/mod.rs b/rust/main/agents/relayer/src/server/mod.rs index 083f8d94d2..8cc49a3f25 100644 --- a/rust/main/agents/relayer/src/server/mod.rs +++ b/rust/main/agents/relayer/src/server/mod.rs @@ -3,7 +3,7 @@ use derive_new::new; use std::collections::HashMap; use tokio::sync::broadcast::Sender; -use crate::{msg::op_queue::OperationPriorityQueue, settings::matching_list::MatchingList}; +use crate::msg::op_queue::OperationPriorityQueue; pub const ENDPOINT_MESSAGES_QUEUE_SIZE: usize = 100; @@ -15,14 +15,15 @@ mod message_retry; #[derive(new)] pub struct Server { + relayer_chains: usize, #[new(default)] - retry_transmitter: Option>, + retry_transmitter: Option>, #[new(default)] op_queues: Option>, } impl Server { - pub fn with_op_retry(mut self, transmitter: Sender) -> Self { + pub fn with_op_retry(mut self, transmitter: Sender) -> Self { self.retry_transmitter = Some(transmitter); self } @@ -36,8 +37,8 @@ impl Server { /// Can be extended with additional routes and feature flags to enable/disable individually. pub fn routes(self) -> Vec<(&'static str, Router)> { let mut routes = vec![]; - if let Some(retry_transmitter) = self.retry_transmitter { - routes.push(MessageRetryApi::new(retry_transmitter).get_route()); + if let Some(tx) = self.retry_transmitter { + routes.push(MessageRetryApi::new(tx, self.relayer_chains).get_route()); } if let Some(op_queues) = self.op_queues { routes.push(ListOperationsApi::new(op_queues).get_route()); diff --git a/rust/main/utils/run-locally/Cargo.toml b/rust/main/utils/run-locally/Cargo.toml index 9dedae9cea..a994324687 100644 --- a/rust/main/utils/run-locally/Cargo.toml +++ b/rust/main/utils/run-locally/Cargo.toml @@ -14,6 +14,7 @@ hyperlane-cosmos = { path = "../../chains/hyperlane-cosmos" } toml_edit.workspace = true k256.workspace = true jobserver.workspace = true +reqwest.workspace = true ripemd.workspace = true sha2.workspace = true serde.workspace = true diff --git a/rust/main/utils/run-locally/src/main.rs b/rust/main/utils/run-locally/src/main.rs index 4686c15446..8855a08d86 100644 --- a/rust/main/utils/run-locally/src/main.rs +++ b/rust/main/utils/run-locally/src/main.rs @@ -51,6 +51,7 @@ mod invariants; mod logging; mod metrics; mod program; +mod server; mod solana; mod utils; @@ -483,6 +484,10 @@ fn main() -> ExitCode { // give things a chance to fully start. sleep(Duration::from_secs(10)); + // test retry request + let resp = server::run_retry_request().expect("Failed to process retry request"); + assert!(resp.matched > 0); + if !post_startup_invariants(&checkpoints_dirs) { log!("Failure: Post startup invariants are not met"); return report_test_result(true); diff --git a/rust/main/utils/run-locally/src/server.rs b/rust/main/utils/run-locally/src/server.rs new file mode 100644 index 0000000000..4df7df78f0 --- /dev/null +++ b/rust/main/utils/run-locally/src/server.rs @@ -0,0 +1,55 @@ +use std::io; + +use reqwest::Url; + +use relayer::server::MessageRetryResponse; + +use crate::RELAYER_METRICS_PORT; + +/// create tokio runtime to send a retry request to +/// relayer to retry all existing messages in the queues +pub fn run_retry_request() -> io::Result { + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build(); + runtime + .unwrap() + .block_on(async { call_retry_request().await }) +} + +/// sends a request to relayer to retry all existing messages +/// in the queues +async fn call_retry_request() -> io::Result { + let client = reqwest::Client::new(); + + let url = Url::parse(&format!( + "http://0.0.0.0:{RELAYER_METRICS_PORT}/message_retry" + )) + .map_err(|err| { + eprintln!("Failed to parse url: {err}"); + io::Error::new(io::ErrorKind::InvalidInput, err.to_string()) + })?; + + let body = vec![serde_json::json!({ + "message_id": "*" + })]; + let retry_response = client.post(url).json(&body).send().await.map_err(|err| { + eprintln!("Failed to send request: {err}"); + io::Error::new(io::ErrorKind::InvalidData, err.to_string()) + })?; + + let response_text = retry_response.text().await.map_err(|err| { + eprintln!("Failed to parse response body: {err}"); + io::Error::new(io::ErrorKind::InvalidData, err.to_string()) + })?; + + println!("Retry Request Response: {:?}", response_text); + + let response_json: MessageRetryResponse = + serde_json::from_str(&response_text).map_err(|err| { + eprintln!("Failed to parse response body to json: {err}"); + io::Error::new(io::ErrorKind::InvalidData, err.to_string()) + })?; + + Ok(response_json) +} From 71aefa03e6f6526694954cc017e67e521c0bafc8 Mon Sep 17 00:00:00 2001 From: Jason Guo <33064781+Xaroz@users.noreply.github.com> Date: Tue, 7 Jan 2025 15:08:41 -0600 Subject: [PATCH 29/81] feat: export metadata builder (#5117) ### Description Export `BaseMetadaBuilder` from sdk ### Drive-by changes No ### Related issues ### Backward compatibility Yes ### Testing --- .changeset/happy-steaks-approve.md | 5 +++++ typescript/sdk/src/index.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/happy-steaks-approve.md diff --git a/.changeset/happy-steaks-approve.md b/.changeset/happy-steaks-approve.md new file mode 100644 index 0000000000..dc1df18b82 --- /dev/null +++ b/.changeset/happy-steaks-approve.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': patch +--- + +export BaseMetadataBuilder diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index 68b7a6b338..ce71e653c6 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -166,6 +166,7 @@ export { } from './hook/types.js'; export { DerivedIsmConfig, EvmIsmReader } from './ism/EvmIsmReader.js'; export { HyperlaneIsmFactory } from './ism/HyperlaneIsmFactory.js'; +export { BaseMetadataBuilder } from './ism/metadata/builder.js'; export { decodeIsmMetadata } from './ism/metadata/decode.js'; export { buildAggregationIsmConfigs, From 3c4bc1cca96dadcac8c37b3aa5ca2252a653a71a Mon Sep 17 00:00:00 2001 From: Lee <6251863+ltyu@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:28:41 -0500 Subject: [PATCH 30/81] feat: hyperlane warp send all chains (#5118) ### Description Update `hyperlane warp send` to send a round trip transfer to all chains in WarpCoreConfig, if `--origin` and/or `--destination` is not provided. ### Backward compatibility Yes ### Testing Manual --- .changeset/lovely-snakes-cross.md | 5 +++ typescript/cli/src/commands/send.ts | 4 ++ typescript/cli/src/commands/warp.ts | 41 ++++++++++++++++-- typescript/cli/src/send/transfer.ts | 64 ++++++++++++----------------- 4 files changed, 72 insertions(+), 42 deletions(-) create mode 100644 .changeset/lovely-snakes-cross.md diff --git a/.changeset/lovely-snakes-cross.md b/.changeset/lovely-snakes-cross.md new file mode 100644 index 0000000000..924c55e7de --- /dev/null +++ b/.changeset/lovely-snakes-cross.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Update hyperlane warp send to send a round trip transfer to all chains in WarpCoreConfig, if --origin and/or --destination is not provided. diff --git a/typescript/cli/src/commands/send.ts b/typescript/cli/src/commands/send.ts index 7879523a19..cddd85810a 100644 --- a/typescript/cli/src/commands/send.ts +++ b/typescript/cli/src/commands/send.ts @@ -50,6 +50,10 @@ export const messageSendOptions: { [k: string]: Options } = { type: 'string', description: 'Destination chain to send message to', }, + 'round-trip': { + type: 'boolean', + description: 'Send test transfers to all chains in WarpCoreConfig', + }, }; export interface MessageOptionsArgTypes { diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index 5d09047617..d762197206 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -1,7 +1,8 @@ import { stringify as yamlStringify } from 'yaml'; import { CommandModule } from 'yargs'; -import { ChainSubmissionStrategySchema } from '@hyperlane-xyz/sdk'; +import { ChainName, ChainSubmissionStrategySchema } from '@hyperlane-xyz/sdk'; +import { objFilter } from '@hyperlane-xyz/utils'; import { runWarpRouteCheck } from '../check/warp.js'; import { @@ -14,9 +15,10 @@ import { } from '../context/types.js'; import { evaluateIfDryRunFailure } from '../deploy/dry-run.js'; import { runWarpRouteApply, runWarpRouteDeploy } from '../deploy/warp.js'; -import { log, logCommandHeader, logGreen } from '../logger.js'; +import { log, logBlue, logCommandHeader, logGreen } from '../logger.js'; import { runWarpRouteRead } from '../read/warp.js'; import { sendTestTransfer } from '../send/transfer.js'; +import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson, readYamlOrJson, @@ -275,6 +277,7 @@ const send: CommandModuleWithWriteContext< warp, amount, recipient, + roundTrip, }) => { const warpCoreConfig = await getWarpCoreConfigOrExit({ symbol, @@ -282,17 +285,47 @@ const send: CommandModuleWithWriteContext< context, }); + let chains: ChainName[] = warpCoreConfig.tokens.map((t) => t.chainName); + if (roundTrip) { + // Appends the reverse of the array, excluding the 1st (e.g. [1,2,3] becomes [1,2,3,2,1]) + const reversed = [...chains].reverse().slice(1, chains.length + 1); // We make a copy because .reverse() is mutating + chains.push(...reversed); + } else { + // Assume we want to use use `--origin` and `--destination` params, prompt as needed. + const chainMetadata = objFilter( + context.chainMetadata, + (key, _metadata): _metadata is any => chains.includes(key), + ); + + if (!origin) + origin = await runSingleChainSelectionStep( + chainMetadata, + 'Select the origin chain:', + ); + + if (!destination) + destination = await runSingleChainSelectionStep( + chainMetadata, + 'Select the destination chain:', + ); + + chains = chains.filter((c) => c === origin || c === destination); + } + + logBlue(`🚀 Sending a message for chains: ${chains.join(' ➡️ ')}`); await sendTestTransfer({ context, warpCoreConfig, - origin, - destination, + chains, amount, recipient, timeoutSec: timeout, skipWaitForDelivery: quick, selfRelay: relay, }); + logGreen( + `✅ Successfully sent messages for chains: ${chains.join(' ➡️ ')}`, + ); process.exit(0); }, }; diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index 134eb9b3b3..8aa4cca59b 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -18,7 +18,6 @@ import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { log, logBlue, logGreen, logRed } from '../logger.js'; -import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson } from '../utils/files.js'; import { stubMerkleTreeConfig } from '../utils/relay.js'; import { runTokenSelectionStep } from '../utils/tokens.js'; @@ -30,8 +29,7 @@ export const WarpSendLogs = { export async function sendTestTransfer({ context, warpCoreConfig, - origin, - destination, + chains, amount, recipient, timeoutSec, @@ -40,51 +38,41 @@ export async function sendTestTransfer({ }: { context: WriteCommandContext; warpCoreConfig: WarpCoreConfig; - origin?: ChainName; // resolved in signerMiddleware - destination?: ChainName; // resolved in signerMiddleware + chains: ChainName[]; amount: string; recipient?: string; timeoutSec: number; skipWaitForDelivery: boolean; selfRelay?: boolean; }) { - const { chainMetadata } = context; - - if (!origin) { - origin = await runSingleChainSelectionStep( - chainMetadata, - 'Select the origin chain:', - ); - } - - if (!destination) { - destination = await runSingleChainSelectionStep( - chainMetadata, - 'Select the destination chain:', - ); - } - await runPreflightChecksForChains({ context, - chains: [origin, destination], - chainsToGasCheck: [origin], + chains, minGas: MINIMUM_TEST_SEND_GAS, }); - await timeout( - executeDelivery({ - context, - origin, - destination, - warpCoreConfig, - amount, - recipient, - skipWaitForDelivery, - selfRelay, - }), - timeoutSec * 1000, - 'Timed out waiting for messages to be delivered', - ); + for (let i = 0; i < chains.length; i++) { + const origin = chains[i]; + const destination = chains[i + 1]; + + if (destination) { + logBlue(`Sending a message from ${origin} to ${destination}`); + await timeout( + executeDelivery({ + context, + origin, + destination, + warpCoreConfig, + amount, + recipient, + skipWaitForDelivery, + selfRelay, + }), + timeoutSec * 1000, + 'Timed out waiting for messages to be delivered', + ); + } + } } async function executeDelivery({ @@ -199,5 +187,5 @@ async function executeDelivery({ // Max wait 10 minutes await core.waitForMessageProcessed(transferTxReceipt, 10000, 60); - logGreen(`Transfer sent to destination chain!`); + logGreen(`Transfer sent to ${destination} chain!`); } From d25f3916f121f75b8e24623a875a0a3801f980a7 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 7 Jan 2025 22:23:36 +0000 Subject: [PATCH 31/81] feat: deploy SOON and warp routes (#5110) ### Description - core and SOL / Bonk warp routes on SOON ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .registryrc | 2 +- rust/main/config/mainnet_config.json | 48 +- rust/sealevel/client/src/cmd_utils.rs | 4 +- rust/sealevel/client/src/router.rs | 2 + .../environments/mainnet3/chain-config.json | 1108 ++++++++++++++++- .../solanamainnet/rc/multisig-config.json | 1047 ++++++++++++++++ .../solanamainnet/rc/program-ids.json | 3 + .../soon/hyperlane/multisig-config.json | 1051 ++++++++++++++++ .../gas-oracle-configs-solanamainnet.json | 9 + .../mainnet3/soon/core/program-ids.json | 8 + .../soon/gas-oracle-configs-soon.json | 20 + .../Bonk-solanamainnet-soon/program-ids.json | 10 + .../Bonk-solanamainnet-soon/token-config.json | 18 + .../SOL-solanamainnet-soon/program-ids.json | 10 + .../SOL-solanamainnet-soon/token-config.json | 16 + .../config/environments/mainnet3/agent.ts | 7 +- .../mainnet3/aw-validators/hyperlane.json | 3 + .../config/environments/mainnet3/funding.ts | 3 + .../environments/mainnet3/gasPrices.json | 4 + .../mainnet3/supportedChainNames.ts | 1 + .../environments/mainnet3/tokenPrices.json | 1 + .../environments/mainnet3/validators.ts | 10 + typescript/sdk/src/consts/multisigIsm.ts | 10 + 23 files changed, 3340 insertions(+), 55 deletions(-) create mode 100644 rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json create mode 100644 rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/multisig-ism-message-id/soon/hyperlane/multisig-config.json create mode 100644 rust/sealevel/environments/mainnet3/soon/core/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json diff --git a/.registryrc b/.registryrc index 7c11b8020a..b89b5c5401 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -207a4ffe96b0f33701ca6f92d8ca4905a8a0233a +d01becffba3dd2d0a053a25bffc3d97bde70129a diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 8f81beeec4..1f34be9f8a 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -2481,7 +2481,7 @@ "domainRoutingIsm": "0x494415e823236A05c608D6b777bC80082cED6A2E", "domainRoutingIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", "fallbackRoutingHook": "0xDd1CddEd982e4d271d4D6Bc4cdE8d4F3338733B5", - "gasCurrencyCoinGeckoId": "real-ether", + "gasCurrencyCoinGeckoId": "ethereum", "index": { "from": 363159 }, @@ -7249,6 +7249,52 @@ "index": { "from": 378761707 } + }, + "soon": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.soo.network/", + "family": "other", + "name": "SOON Explorer", + "url": "https://explorer.soo.network/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.05, + "reorgPeriod": 0 + }, + "chainId": 50075007, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "SOON", + "domainId": 50075007, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 1, + "mode": "sequence", + "chunk": 20 + }, + "name": "soon", + "nativeToken": { + "decimals": 9, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://rpc.mainnet.soo.network/rpc" + } + ], + "technicalStack": "other", + "interchainGasPaymaster": "Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ", + "interchainSecurityModule": "4fPoa26ayqY1cwY3AcqUPvdLLNHpjJGdDQevtnTLAAnH", + "mailbox": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", + "merkleTreeHook": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", + "validatorAnnounce": "GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz" } }, "defaultRpcConsensusType": "fallback" diff --git a/rust/sealevel/client/src/cmd_utils.rs b/rust/sealevel/client/src/cmd_utils.rs index 4b8da171e1..f8e20b4d64 100644 --- a/rust/sealevel/client/src/cmd_utils.rs +++ b/rust/sealevel/client/src/cmd_utils.rs @@ -155,8 +155,8 @@ fn attempt_program_deploy( // Success! if let Ok(true) = run_cmd(command.as_slice(), None, None) { // TODO: use commitment level instead of just sleeping here? - println!("Sleeping for 2 seconds to fully allow program to be deployed"); - sleep(Duration::from_secs(2)); + println!("Sleeping for 5 seconds to fully allow program to be deployed"); + sleep(Duration::from_secs(5)); return Ok(()); } diff --git a/rust/sealevel/client/src/router.rs b/rust/sealevel/client/src/router.rs index 2b75ea5cae..80b3e7e970 100644 --- a/rust/sealevel/client/src/router.rs +++ b/rust/sealevel/client/src/router.rs @@ -599,6 +599,8 @@ fn enroll_all_remote_routers< .collect::>(); if !router_configs.is_empty() { + adjust_gas_price_if_needed(chain_name.as_str(), ctx); + ctx.new_txn() .add_with_description( deployer.enroll_remote_routers_instruction( diff --git a/rust/sealevel/environments/mainnet3/chain-config.json b/rust/sealevel/environments/mainnet3/chain-config.json index 37408c6995..0688d72632 100644 --- a/rust/sealevel/environments/mainnet3/chain-config.json +++ b/rust/sealevel/environments/mainnet3/chain-config.json @@ -37,7 +37,7 @@ ], "technicalStack": "opstack" }, - "alephzeroevm": { + "alephzeroevmmainnet": { "blockExplorers": [ { "apiUrl": "https://evm-explorer.alephzero.org/api", @@ -58,12 +58,12 @@ }, "displayName": "Aleph Zero EVM", "displayNameShort": "Aleph Zero EVM", - "domainId": 41455, + "domainId": 1000041455, "gasCurrencyCoinGeckoId": "aleph-zero", "index": { - "from": 3421962 + "from": 4243354 }, - "name": "alephzeroevm", + "name": "alephzeroevmmainnet", "nativeToken": { "decimals": 18, "name": "AZERO", @@ -119,6 +119,45 @@ ], "technicalStack": "arbitrumnitro" }, + "appchain": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.appchain.xyz/api", + "family": "blockscout", + "name": "AppChain Explorer", + "url": "https://explorer.appchain.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 0 + }, + "chainId": 466, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "AppChain", + "domainId": 466, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 190 + }, + "name": "appchain", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://appchain.calderachain.xyz/http" + } + ], + "technicalStack": "arbitrumnitro" + }, "arbitrum": { "blockExplorers": [ { @@ -204,6 +243,45 @@ ], "technicalStack": "arbitrumnitro" }, + "arthera": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.arthera.net/api", + "family": "blockscout", + "name": "Arthera Explorer", + "url": "https://explorer.arthera.net" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 10242, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Arthera", + "domainId": 10242, + "gasCurrencyCoinGeckoId": "arthera", + "name": "arthera", + "nativeToken": { + "decimals": 18, + "name": "Arthera", + "symbol": "AA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.arthera.net", + "pagination": { + "maxBlockRange": 10000 + } + } + ], + "technicalStack": "other" + }, "astar": { "blockExplorers": [ { @@ -279,6 +357,81 @@ ], "technicalStack": "polygoncdk" }, + "aurora": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.mainnet.aurora.dev/api", + "family": "blockscout", + "name": "Aurora Explorer", + "url": "https://explorer.mainnet.aurora.dev" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 1313161554, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Aurora", + "domainId": 1313161554, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "aurora", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.aurora.dev" + }, + { + "http": "https://aurora.drpc.org" + } + ], + "technicalStack": "other" + }, + "flame": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.flame.astria.org/api", + "family": "blockscout", + "name": "Astria Flame Explorer", + "url": "https://explorer.flame.astria.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 253368190, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Flame", + "domainId": 253368190, + "gasCurrencyCoinGeckoId": "celestia", + "name": "flame", + "nativeToken": { + "decimals": 18, + "name": "Celestia", + "symbol": "TIA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.flame.astria.org" + } + ], + "technicalStack": "other" + }, "avalanche": { "blockExplorers": [ { @@ -369,7 +522,7 @@ } ], "blocks": { - "confirmations": 1, + "confirmations": 3, "estimateBlockTime": 2, "reorgPeriod": 10 }, @@ -466,7 +619,7 @@ "displayName": "Blast", "domainId": 81457, "gasCurrencyCoinGeckoId": "ethereum", - "gnosisSafeTransactionServiceUrl": "https://transaction.blast-safe.io", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-blast.safe.global", "name": "blast", "nativeToken": { "decimals": 18, @@ -521,6 +674,42 @@ ], "technicalStack": "opstack" }, + "boba": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/288/etherscan/api", + "family": "routescan", + "name": "bobascan", + "url": "https://bobascan.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 288, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Boba Mainnet", + "domainId": 288, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "boba", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.boba.network" + } + ], + "technicalStack": "opstack" + }, "bsc": { "blockExplorers": [ { @@ -568,6 +757,51 @@ "gasPrice": 3000000000 } }, + "bsquared": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.bsquared.network/api", + "family": "etherscan", + "name": "B² Network Explorer", + "url": "https://explorer.bsquared.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 5 + }, + "chainId": 223, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "B² Network", + "domainId": 223, + "gasCurrencyCoinGeckoId": "bitcoin", + "name": "bsquared", + "nativeToken": { + "decimals": 18, + "name": "Bitcoin", + "symbol": "BTC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.bsquared.network" + }, + { + "http": "https://rpc.ankr.com/b2" + }, + { + "http": "https://mainnet.b2-rpc.com" + }, + { + "http": "https://b2-mainnet.alt.technology" + } + ], + "technicalStack": "other" + }, "celo": { "blockExplorers": [ { @@ -651,7 +885,7 @@ ], "technicalStack": "arbitrumnitro" }, - "chiliz": { + "chilizmainnet": { "blockExplorers": [ { "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/88888/etherscan/api", @@ -671,9 +905,9 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Chiliz", - "domainId": 88888, + "domainId": 1000088888, "gasCurrencyCoinGeckoId": "chiliz", - "name": "chiliz", + "name": "chilizmainnet", "nativeToken": { "decimals": 18, "name": "Chiliz", @@ -693,6 +927,87 @@ "maxPriorityFeePerGas": 1000000000 } }, + "conflux": { + "blockExplorers": [ + { + "apiUrl": "https://evmapi.confluxscan.net/api", + "family": "blockscout", + "name": "ConfluxScan eSpace", + "url": "https://evm.confluxscan.net" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 10 + }, + "chainId": 1030, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Conflux eSpace", + "domainId": 1030, + "gasCurrencyCoinGeckoId": "conflux-token", + "name": "conflux", + "nativeToken": { + "decimals": 18, + "name": "Ethereum", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://evm.confluxrpc.com" + }, + { + "http": "https://conflux-espace-public.unifra.io" + }, + { + "http": "https://conflux-espace.blockpi.network/v1/rpc/public" + } + ], + "technicalStack": "other" + }, + "conwai": { + "blockExplorers": [ + { + "apiUrl": "https://conwai.calderaexplorer.xyz/api", + "family": "blockscout", + "name": "Conwai Explorer", + "url": "https://conwai.calderaexplorer.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 0 + }, + "chainId": 668668, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Conwai", + "domainId": 668668, + "gasCurrencyCoinGeckoId": "conwai", + "index": { + "from": 73 + }, + "name": "conwai", + "nativeToken": { + "decimals": 18, + "name": "Conwai", + "symbol": "CNW" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://conwai.calderachain.xyz/http" + } + ], + "technicalStack": "arbitrumnitro" + }, "coredao": { "blockExplorers": [ { @@ -741,6 +1056,51 @@ ], "technicalStack": "other" }, + "corn": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/21000000/etherscan/api", + "family": "routescan", + "name": "Cornscan", + "url": "https://cornscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 20, + "reorgPeriod": 5 + }, + "chainId": 21000000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Corn", + "domainId": 21000000, + "gasCurrencyCoinGeckoId": "bitcoin", + "index": { + "from": 55636 + }, + "name": "corn", + "nativeToken": { + "decimals": 18, + "name": "Bitcorn", + "symbol": "BTCN" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.corn-rpc.com" + }, + { + "http": "https://maizenet-rpc.usecorn.com" + }, + { + "http": "https://rpc.ankr.com/corn_maizenet" + } + ], + "technicalStack": "arbitrumnitro" + }, "cyber": { "blockExplorers": [ { @@ -855,6 +1215,48 @@ ], "technicalStack": "polygoncdk" }, + "duckchain": { + "blockExplorers": [ + { + "apiUrl": "https://scan.duckchain.io/api", + "family": "blockscout", + "name": "DuckChain Explorer", + "url": "https://scan.duckchain.io" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 5545, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "DuckChain", + "domainId": 5545, + "gasCurrencyCoinGeckoId": "the-open-network", + "index": { + "from": 1149918 + }, + "name": "duckchain", + "nativeToken": { + "decimals": 18, + "name": "Toncoin", + "symbol": "TON" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.duckchain.io" + }, + { + "http": "https://rpc-hk.duckchain.io" + } + ], + "technicalStack": "arbitrumnitro" + }, "eclipsemainnet": { "blockExplorers": [ { @@ -965,6 +1367,9 @@ }, "protocol": "ethereum", "rpcUrls": [ + { + "http": "https://rpc.ankr.com/eth" + }, { "http": "https://ethereum.publicnode.com" }, @@ -1013,6 +1418,51 @@ ], "technicalStack": "arbitrumnitro" }, + "evmos": { + "blockExplorers": [ + { + "apiUrl": "https://www.mintscan.io/evmos/api", + "family": "other", + "name": "Mintscan", + "url": "https://www.mintscan.io/evmos" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 9001, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Evmos EVM", + "domainId": 9001, + "gasCurrencyCoinGeckoId": "evmos", + "name": "evmos", + "nativeToken": { + "decimals": 18, + "name": "Evmos", + "symbol": "EVMOS" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://evmos.lava.build" + }, + { + "http": "https://evmos-json-rpc.stakely.io" + }, + { + "http": "https://rpc-evm.evmos.dragonstake.io" + }, + { + "http": "https://evmos.drpc.org" + } + ], + "technicalStack": "other" + }, "fantom": { "blockExplorers": [ { @@ -1109,7 +1559,7 @@ ], "technicalStack": "other" }, - "flow": { + "flowmainnet": { "blockExplorers": [ { "apiUrl": "https://evm.flowscan.io/api", @@ -1129,10 +1579,10 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "EVM on Flow", - "domainId": 747, + "domainId": 1000000747, "gasCurrencyCoinGeckoId": "flow", "isTestnet": false, - "name": "flow", + "name": "flowmainnet", "nativeToken": { "decimals": 18, "name": "Flow", @@ -1149,6 +1599,42 @@ "gasPrice": 100000000 } }, + "form": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.form.network/api", + "family": "blockscout", + "name": "Form Explorer", + "url": "https://explorer.form.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 478, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Form", + "domainId": 478, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "form", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.form.network/http" + } + ], + "technicalStack": "opstack" + }, "fraxtal": { "blockExplorers": [ { @@ -1361,7 +1847,7 @@ ], "technicalStack": "other" }, - "immutablezkevm": { + "immutablezkevmmainnet": { "blockExplorers": [ { "apiUrl": "https://explorer.immutable.com/api/eth-rpc", @@ -1381,9 +1867,9 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Immutable zkEVM", - "domainId": 13371, + "domainId": 1000013371, "gasCurrencyCoinGeckoId": "immutable-x", - "name": "immutablezkevm", + "name": "immutablezkevmmainnet", "nativeToken": { "decimals": 18, "name": "Immutable", @@ -1447,11 +1933,47 @@ ], "technicalStack": "arbitrumnitro" }, + "ink": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.inkonchain.com/api", + "family": "blockscout", + "name": "Ink Explorer", + "url": "https://explorer.inkonchain.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 57073, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Ink", + "domainId": 57073, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "ink", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc-qnd.inkonchain.com" + } + ], + "technicalStack": "opstack" + }, "injective": { "bech32Prefix": "inj", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/injective", + "apiUrl": "https://apis.mintscan.io/v1/injective", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/injective" @@ -1606,7 +2128,7 @@ "displayName": "Linea", "domainId": 59144, "gasCurrencyCoinGeckoId": "ethereum", - "gnosisSafeTransactionServiceUrl": "https://transaction.safe.linea.build", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-linea.safe.global", "name": "linea", "nativeToken": { "decimals": 18, @@ -1730,6 +2252,9 @@ "displayName": "Lumia Prism", "domainId": 994873017, "gasCurrencyCoinGeckoId": "orion-protocol", + "index": { + "from": 1923136 + }, "name": "lumia", "nativeToken": { "decimals": 18, @@ -1739,8 +2264,41 @@ "protocol": "ethereum", "rpcUrls": [ { - "http": "https://994873017.rpc.thirdweb.com" - }, + "http": "https://mainnet-rpc.lumia.org" + } + ], + "technicalStack": "polygoncdk" + }, + "lumiaprism": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.lumia.org/api/eth-rpc", + "family": "blockscout", + "name": "Lumia Prism Explorer", + "url": "https://explorer.lumia.org" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 4, + "reorgPeriod": 5 + }, + "chainId": 994873017, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Lumia Prism", + "domainId": 1000073017, + "gasCurrencyCoinGeckoId": "lumia", + "name": "lumiaprism", + "nativeToken": { + "decimals": 18, + "name": "Lumia", + "symbol": "LUMIA" + }, + "protocol": "ethereum", + "rpcUrls": [ { "http": "https://mainnet-rpc.lumia.org" } @@ -1865,7 +2423,7 @@ ], "technicalStack": "polygoncdk" }, - "metall2": { + "metal": { "blockExplorers": [ { "apiUrl": "https://explorer.metall2.com/api", @@ -1885,10 +2443,10 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Metal L2", - "domainId": 1750, + "domainId": 1000001750, "gasCurrencyCoinGeckoId": "ethereum", "isTestnet": false, - "name": "metall2", + "name": "metal", "nativeToken": { "decimals": 18, "name": "Ether", @@ -1944,7 +2502,7 @@ "mint": { "blockExplorers": [ { - "apiUrl": "https://explorer.mintchain.io/api/eth-rpc", + "apiUrl": "https://explorer.mintchain.io/api", "family": "blockscout", "name": "Mint Explorer", "url": "https://explorer.mintchain.io" @@ -2138,7 +2696,7 @@ "bech32Prefix": "neutron", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/neutron", + "apiUrl": "https://apis.mintscan.io/v1/neutron", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/neutron" @@ -2315,7 +2873,7 @@ "bech32Prefix": "osmo", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/osmosis", + "apiUrl": "https://apis.mintscan.io/v1/osmosis", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/osmosis" @@ -2415,11 +2973,7 @@ "http": "https://rpc.ankr.com/polygon" } ], - "technicalStack": "other", - "transactionOverrides": { - "maxFeePerGas": 800000000000, - "maxPriorityFeePerGas": 50000000000 - } + "technicalStack": "other" }, "polygonzkevm": { "blockExplorers": [ @@ -2465,7 +3019,7 @@ "gasPrice": 1000000000 } }, - "polynomial": { + "polynomialfi": { "blockExplorers": [ { "apiUrl": "https://polynomialscan.io/api", @@ -2485,9 +3039,9 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Polynomial", - "domainId": 8008, + "domainId": 1000008008, "gasCurrencyCoinGeckoId": "ethereum", - "name": "polynomial", + "name": "polynomialfi", "nativeToken": { "decimals": 18, "name": "Ethereum", @@ -2501,6 +3055,42 @@ ], "technicalStack": "opstack" }, + "prom": { + "blockExplorers": [ + { + "apiUrl": "https://prom-blockscout.eu-north-2.gateway.fm/api/eth-rpc", + "family": "blockscout", + "name": "Prom Explorer", + "url": "https://prom-blockscout.eu-north-2.gateway.fm" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 6, + "reorgPeriod": 5 + }, + "chainId": 227, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Prom", + "domainId": 227, + "gasCurrencyCoinGeckoId": "prometeus", + "name": "prom", + "nativeToken": { + "decimals": 18, + "name": "Prom", + "symbol": "PROM" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://prom-rpc.eu-north-2.gateway.fm" + } + ], + "technicalStack": "polygoncdk" + }, "proofofplay": { "blockExplorers": [ { @@ -2540,7 +3130,7 @@ ], "technicalStack": "arbitrumnitro" }, - "rari": { + "rarichain": { "blockExplorers": [ { "apiUrl": "https://mainnet.explorer.rarichain.org/api", @@ -2560,12 +3150,12 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "RARI Chain", - "domainId": 1380012617, + "domainId": 1000012617, "gasCurrencyCoinGeckoId": "ethereum", "index": { - "from": 541753 + "from": 688784 }, - "name": "rari", + "name": "rarichain", "nativeToken": { "decimals": 18, "name": "Ethereum", @@ -2600,7 +3190,7 @@ }, "displayName": "re.al", "domainId": 111188, - "gasCurrencyCoinGeckoId": "real-ether", + "gasCurrencyCoinGeckoId": "ethereum", "index": { "from": 363159 }, @@ -2655,7 +3245,46 @@ ], "technicalStack": "opstack" }, - "rootstock": { + "rivalz": { + "blockExplorers": [ + { + "apiUrl": "https://rivalz.calderaexplorer.xyz/api", + "family": "blockscout", + "name": "Rivalz Explorer", + "url": "https://rivalz.calderaexplorer.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 0 + }, + "chainId": 753, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Rivalz", + "domainId": 753, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 21 + }, + "name": "rivalz", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rivalz.calderachain.xyz/http" + } + ], + "technicalStack": "arbitrumnitro" + }, + "rootstockmainnet": { "blockExplorers": [ { "apiUrl": "https://rootstock.blockscout.com/api", @@ -2675,9 +3304,9 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Rootstock", - "domainId": 30, + "domainId": 1000000030, "gasCurrencyCoinGeckoId": "rootstock", - "name": "rootstock", + "name": "rootstockmainnet", "nativeToken": { "decimals": 18, "name": "Rootstock Smart Bitcoin", @@ -2771,7 +3400,19 @@ "protocol": "ethereum", "rpcUrls": [ { - "http": "https://scroll.blockpi.network/v1/rpc/public" + "http": "https://rpc.scroll.io" + }, + { + "http": "https://rpc.ankr.com/scroll" + }, + { + "http": "https://scroll-mainnet.chainstacklabs.com" + }, + { + "http": "https://scroll.drpc.org" + }, + { + "http": "https://1rpc.io/scroll" } ], "technicalStack": "other", @@ -2930,11 +3571,119 @@ ], "technicalStack": "other" }, + "soneium": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.soneium.org/api", + "family": "blockscout", + "name": "Soneium Explorer", + "url": "https://explorer.soneium.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 1868, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Soneium", + "domainId": 1868, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "soneium", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.soneium.org" + } + ], + "technicalStack": "opstack" + }, + "sonic": { + "blockExplorers": [ + { + "apiUrl": "https://api.sonicscan.org/api", + "family": "etherscan", + "name": "Sonic Explorer", + "url": "https://sonicscan.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 146, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic", + "domainId": 146, + "gasCurrencyCoinGeckoId": "fantom", + "name": "sonic", + "nativeToken": { + "decimals": 18, + "name": "Sonic", + "symbol": "S" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.soniclabs.com" + } + ], + "technicalStack": "other" + }, + "soon": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.soo.network/", + "family": "other", + "name": "SOON Explorer", + "url": "https://explorer.soo.network/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.05, + "reorgPeriod": 0 + }, + "chainId": 50075007, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "SOON", + "domainId": 50075007, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "soon", + "nativeToken": { + "decimals": 9, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://rpc.mainnet.soo.network/rpc" + } + ], + "technicalStack": "other" + }, "stride": { "bech32Prefix": "stride", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/stride", + "apiUrl": "https://apis.mintscan.io/v1/stride", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/stride" @@ -2991,7 +3740,43 @@ "gasPrice": "0.0025" } }, - "superposition": { + "superseed": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.superseed.xyz/api", + "family": "blockscout", + "name": "Superseed Explorer", + "url": "https://explorer.superseed.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 5330, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Superseed", + "domainId": 5330, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "superseed", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.superseed.xyz" + } + ], + "technicalStack": "opstack" + }, + "superpositionmainnet": { "blockExplorers": [ { "apiUrl": "https://explorer.superposition.so/api", @@ -3011,12 +3796,12 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Superposition", - "domainId": 55244, + "domainId": 1000055244, "gasCurrencyCoinGeckoId": "ethereum", "index": { - "from": 1201 + "from": 2743 }, - "name": "superposition", + "name": "superpositionmainnet", "nativeToken": { "decimals": 18, "name": "Ethereum", @@ -3030,6 +3815,43 @@ ], "technicalStack": "arbitrumnitro" }, + "swell": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.swellnetwork.io/api", + "family": "blockscout", + "name": "Swell Explorer", + "url": "https://explorer.swellnetwork.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 1923, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Swell", + "domainId": 1923, + "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://trx-swell.safe.protofire.io", + "name": "swell", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://swell-mainnet.alt.technology" + } + ], + "technicalStack": "opstack" + }, "taiko": { "blockExplorers": [ { @@ -3104,6 +3926,153 @@ ], "technicalStack": "polkadotsubstrate" }, + "telos": { + "blockExplorers": [ + { + "apiUrl": "https://www.teloscan.io/api", + "family": "other", + "name": "Teloscan", + "url": "https://www.teloscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": "finalized" + }, + "chainId": 40, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Telos EVM", + "domainId": 40, + "gasCurrencyCoinGeckoId": "telos", + "name": "telos", + "nativeToken": { + "decimals": 18, + "name": "Telos", + "symbol": "TLOS" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.telos.net" + }, + { + "http": "https://telos.drpc.org" + } + ], + "technicalStack": "other" + }, + "treasure": { + "blockExplorers": [ + { + "apiUrl": "https://rpc-explorer-verify.treasure.lol/contract_verification", + "family": "etherscan", + "name": "Treasurescan", + "url": "https://treasurescan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 0 + }, + "chainId": 61166, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Treasure", + "domainId": 61166, + "gasCurrencyCoinGeckoId": "magic", + "name": "treasure", + "nativeToken": { + "decimals": 18, + "name": "MAGIC", + "symbol": "MAGIC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.treasure.lol" + } + ], + "technicalStack": "zksync" + }, + "unichain": { + "blockExplorers": [ + { + "apiUrl": "https://unichain.blockscout.com/api", + "family": "blockscout", + "name": "Unichain Explorer", + "url": "https://unichain.blockscout.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 130, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Unichain", + "domainId": 130, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "unichain", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.unichain.org" + } + ], + "technicalStack": "opstack" + }, + "vana": { + "blockExplorers": [ + { + "apiUrl": "https://vanascan.io/api/eth-rpc", + "family": "blockscout", + "name": "Vana Explorer", + "url": "https://vanascan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 6, + "reorgPeriod": 5 + }, + "chainId": 1480, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Vana", + "domainId": 1480, + "gasCurrencyCoinGeckoId": "vana", + "name": "vana", + "nativeToken": { + "decimals": 18, + "name": "Vana", + "symbol": "VANA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.vana.org" + } + ], + "technicalStack": "other" + }, "viction": { "blockExplorers": [ { @@ -3262,7 +4231,7 @@ "zeronetwork": { "blockExplorers": [ { - "apiUrl": "https://zero-network-api.calderaexplorer.xyz/api", + "apiUrl": "https://zero-network.calderaexplorer.xyz/verification/contract_verification", "family": "etherscan", "name": "Zero Network Explorer", "url": "https://zerion-explorer.vercel.app" @@ -3281,6 +4250,7 @@ "displayName": "Zero Network", "domainId": 543210, "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://prod.zeronet-mainnet.transaction.keypersafe.xyz", "name": "zeronetwork", "nativeToken": { "decimals": 18, @@ -3378,10 +4348,50 @@ ], "technicalStack": "opstack" }, + "zklink": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.zklink.io/contract_verification", + "family": "etherscan", + "name": "zkLink Nova Block Explorer", + "url": "https://explorer.zklink.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 0 + }, + "chainId": 810180, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "zkLink Nova", + "displayNameShort": "zkLink", + "domainId": 810180, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "zklink", + "nativeToken": { + "decimals": 18, + "name": "Ethereum", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.zklink.io" + }, + { + "http": "https://rpc.zklink.network" + } + ], + "technicalStack": "zksync" + }, "zksync": { "blockExplorers": [ { - "apiUrl": "https://block-explorer-api.mainnet.zksync.io/api", + "apiUrl": "https://zksync2-mainnet-explorer.zksync.io/contract_verification", "family": "etherscan", "name": "zkSync Explorer", "url": "https://explorer.zksync.io" diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json new file mode 100644 index 0000000000..490a5ab2ba --- /dev/null +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json @@ -0,0 +1,1047 @@ +{ + "alephzeroevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x33f20e6e775747d60301c6ea1c50e51f0389740c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa" + ] + }, + "ancient8": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbb5842ae0e05215b53df4787a29144efb7e67551", + "0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969", + "0x95c7bf235837cb5a609fe6c95870410b9f68bcff" + ] + }, + "apechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "appchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x0531251bbadc1f9f19ccce3ca6b3f79f08eae1be", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arbitrum": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", + "0xec68258a7c882ac2fc46b81ce80380054ffb4ef2", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "arbitrumnova": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd2a5e9123308d187383c87053811a2c21bd8af1f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arthera": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x13710ac11c36c169f62fba95767ae59a1e57098d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "astar": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4d1b2cade01ee3493f44304653d8e352c66ec3e7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "astarzkevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x89ecdd6caf138934bf3a2fb7b323984d72fd66de", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "aurora": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "avalanche": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3fb8263859843bffb02950c492d492cae169f4cf", + "0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" + ] + }, + "b3": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd77b516730a836fc41934e7d5864e72c165b934e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "base": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xcff391b4e516452d424db66beb9052b041a9ed79", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "bitlayer": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "blast": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xf20c0b09f597597c8d2430d3d72dfddaf09177d1", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x1652d8ba766821cf01aeea34306dfc1cab964a32", + "0x54bb0036f777202371429e062fe6aee0d59442f9" + ] + }, + "bob": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x20f283be1eb0e81e22f51705dcb79883cfdd34aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "boba": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xebeb92c94ca8408e73aa16fd554cb3a7df075c59", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "bsc": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x570af9b7b36568c8877eebba6c6727aa9dab7268", + "0x8292b1a53907ece0f76af8a50724e9492bcdc8a3", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "bsquared": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcadc90933c9fbe843358a4e70e46ad2db78e28aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "celo": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x63478422679303c3e4fc611b771fa4a707ef7f4a", + "0x622e43baf06ad808ca8399360d9a2d9a1a12688b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "cheesechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x478fb53c6860ae8fc35235ba0d38d49b13128226", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "chilizmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conflux": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conwai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "coredao": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbd6e158a3f5830d99d7d2bce192695bc4a148de2", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "corn": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc80b2e3e38220e02d194a0effa9d5bfe89894c07", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "cyber": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x94d7119ceeb802173b6924e6cc8c4cd731089a27", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "degenchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x433e311f19524cd64fb2123ad0aa1579a4e1fc83", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "dogechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xe43f742c37858746e6d7e458bc591180d0cba440", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "duckchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x91d55fe6dac596a6735d96365e21ce4bca21d83c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "eclipsemainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0", + "0x3571223e745dc0fcbdefa164c9b826b90c0d2dac", + "0xea83086a62617a7228ce4206fae2ea8b0ab23513", + "0x4d4629f5bfeabe66edc7a78da26ef5273c266f97" + ] + }, + "endurance": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x28c5b322da06f184ebf68693c5d19df4d4af13e5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x7419021c0de2772b763e554480158a82a291c1f2" + ] + }, + "ethereum": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x03c842db86a6a3e524d4a6615390c1ea8e2b9541", + "0x94438a7de38d4548ae54df5c6010c4ebc5239eae", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0xb683b742b378632a5f73a2a5a45801b3489bba44", + "0xbf1023eff3dba21263bf2db2add67a0d6bcda2de" + ] + }, + "everclear": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0xD79DFbF56ee2268f061cc613027a44A880f61Ba2" + ] + }, + "evmos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fantom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa779572028e634e16f26af5dfd4fa685f619457d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flame": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1fa928ce884fa16357d4b8866e096392d4d81f43", + "0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab", + "0x09f9de08f7570c4146caa708dc9f75b56958957f", + "0xf1f4ae9959490380ad7863e79c3faf118c1fbf77", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "flare": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb65e52be342dba3ab2c088ceeb4290c744809134", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flowmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xe132235c958ca1f3f24d772e5970dd58da4c0f6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59" + ] + }, + "form": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x58554b2e76167993b5fc000d0070a2f883cd333a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fraxtal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82", + "0x573e960e07ad74ea2c5f1e3c31b2055994b12797", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91" + ] + }, + "fusemainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9", + "0x6760226b34213d262D41D5291Ed57E81a68b4E0b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "gnosis": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xd4df66a859585678f2ea8357161d896be19cc1ca", + "0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "gravity": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d549bf757a02a6f6068e9363196ecd958c974e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "harmony": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd677803a67651974b1c264171b5d7ca8838db8d5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "immutablezkevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbdda85b19a5efbe09e52a32db1a072f043dd66da", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "inevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf9e35ee88e4448a3673b4676a4e153e3584a08eb", + "0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc", + "0x9ab11f38a609940153850df611c9a2175dcffe0f" + ] + }, + "injective": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbfb8911b72cfb138c7ce517c57d9c691535dc517", + "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", + "0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9" + ] + }, + "ink": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xb533b8b104522958b984fb258e0684dec0f1a6a5", + "0xd207a6dfd887d91648b672727ff1aef6223cb15a", + "0xa40203b5301659f1e201848d92f5e81f64f206f5", + "0xff9c1e7b266a36eda0d9177d4236994d94819dc0", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "kaia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9de0b3abb221d19719882fa4d61f769fdc2be9a4", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "kroma": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x71b83c21342787d758199e4b8634d3a15f02dc6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "linea": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf2d5409a59e0f5ae7635aff73685624904a77d94", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lisk": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e", + "0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf0da628f3fb71652d48260bad4691054045832ce", + "0xead4141b6ea149901ce4f4b556953f66d04b1d0c" + ] + }, + "lukso": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa5e953701dcddc5b958b5defb677a829d908df6d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "lumia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lumiaprism": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb69731640ffd4338a2c9358a935b0274c6463f85", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "mantapacific": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", + "0x521a3e6bf8d24809fde1c1fd3494a859a16f132c", + "0x14025fe092f5f8a401dd9819704d9072196d2125", + "0x25b9a0961c51e74fd83295293bc029131bf1e05a", + "0xa0eE95e280D46C14921e524B075d0C341e7ad1C8", + "0xcc9a0b6de7fe314bd99223687d784730a75bb957", + "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" + ] + }, + "mantle": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "merlin": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "metal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xd9f7f1a05826197a93df51e86cefb41dfbfb896a", + "0x01e3909133d20c05bbc94247769235d30101f748", + "0xaba06266f47e3ef554d218b879bd86114a8dabd4", + "0x05d91f80377ff5e9c6174025ffaf094c57a4766a", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "metis": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc4a3d25107060e800a43842964546db508092260", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "mint": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x0230505530b80186f8cdccfaf9993eb97aebe98a" + ] + }, + "mode": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x65C140e3a05F33192384AffEF985696Fe3cDDE42", + "0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x485a4f0009d9afbbf44521016f9b8cdd718e36ea" + ] + }, + "molten": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "moonbeam": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x2225e2f4e9221049456da93b71d2de41f3b6b2a8", + "0x645428d198d2e76cbd9c1647f5c80740bb750b97", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "morph": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4884535f393151ec419add872100d352f71af380", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "neutron": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "0xb65438a014fb05fbadcfe35bc6e25d372b6ba460", + "0x42fa752defe92459370a052b6387a87f7de9b80c", + "0xc79503a3e3011535a9c60f6d21f76f59823a38bd", + "0x47aa126e05933b95c5eb90b26e6b668d84f4b25a", + "0x54b2cca5091b098a1a993dec03c4d1ee9af65999", + "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" + ] + }, + "oortmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1" + ] + }, + "optimism": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x20349eadc6c72e94ce38268b96692b1a5c20de4f", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB", + "0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12" + ] + }, + "orderly": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "osmosis": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xea483af11c19fa41b16c31d1534c2a486a92bcac" + ] + }, + "polygon": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", + "0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "polygonzkevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x86f2a44592bb98da766e880cfd70d3bbb295e61a", + "0x865818fe1db986036d5fd0466dcd462562436d1a", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" + ] + }, + "polynomialfi": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d348c2d365040e56f3fee07e6897122915f513", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "prom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb0c4042b7c9a95345be8913f4cdbf4043b923d98", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "proofofplay": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcda40baa71970a06e5f55e306474de5ca4e21c3b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rarichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeac012df7530720dd7d6f9b727e4fe39807d1516", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "real": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "redstone": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1400b9737007f7978d8b4bbafb4a69c83f0641a7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "rivalz": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rootstockmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8675eb603d62ab64e3efe90df914e555966e04ac", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "sanko": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x795c37d5babbc44094b084b0c89ed9db9b5fae39", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "scroll": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xad557170a9f2f21c35e03de07cb30dcbcc3dff63", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948" + ] + }, + "sei": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "shibarium": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xfa33391ee38597cbeef72ccde8c9e13e01e78521", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "snaxchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "soneium": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd4b7af853ed6a2bfc329ecef545df90c959cbee8" + ] + }, + "sonic": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "soon": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76" + ] + }, + "stride": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x88f0E5528131b10e3463C4c68108217Dd33462ac", + "0xa3eaa1216827ad63dd9db43f6168258a89177990", + "0x3f869C36110F00D10dC74cca3ac1FB133cf019ad", + "0x502dC6135d16E74056f609FBAF76846814C197D3", + "0xc36979780c1aD43275182600a61Ce41f1C390FbE", + "0x87460dcEd16a75AECdBffD4189111d30B099f5b0", + "0xf54982134e52Eb7253236943FBffE0886C5bde0C", + "0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "superpositionmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "superseed": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88", + "0x68f3a3b244f6ddc135130200a6b8729e290b4240", + "0x6ff4554cffbc2e4e4230b78e526eab255101d05a", + "0x55880ac03fdf15fccff54ed6f8a83455033edd22", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "swell": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4f51e4f4c7fb45d82f91568480a1a2cfb69216ed", + "0x9eadf9217be22d9878e0e464727a2176d5c69ff8", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "taiko": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xa930073c8f2d0b2f7423ea32293e0d1362e65d79", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a" + ] + }, + "tangle": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0xe271ef9a6e312540f099a378865432fa73f26689" + ] + }, + "telos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "treasure": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x6ad994819185553e8baa01533f0cd2c7cadfe6cc", + "0x278460fa51ff448eb53ffa62951b4b8e3e8f74e3", + "0xe92ff70bb463e2aa93426fd2ba51afc39567d426", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "unichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9773a382342ebf604a2e5de0a1f462fb499e28b1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "vana": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xba2f4f89cae6863d8b49e4ca0208ed48ad9ac354" + ] + }, + "viction": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x6D113Ae51bfeA7b63a8828f97e9dcE393B25c189", + "0xa3f93fe365bf99f431d8fde740b140615e24f99b", + "0x1f87c368f8e05a85ef9126d984a980a20930cb9c" + ] + }, + "worldchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x31048785845325b22817448b68d08f8a8fe36854", + "0x11e2a683e83617f186614071e422b857256a9aae", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "xai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "xlayer": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa2ae7c594703e988f23d97220717c513db638ea3", + "0xfed056cC0967F5BC9C6350F6C42eE97d3983394d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "zeronetwork": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zetachain": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zircuit": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb", + "0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061", + "0x0180444c9342BD672867Df1432eb3dA354413a6E", + "0x1da9176C2CE5cC7115340496fa7D1800a98911CE" + ] + }, + "zklink": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x217a8cb4789fc45abf56cb6e2ca96f251a5ac181", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zksync": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x75237d42ce8ea27349a0254ada265db94157e0c1" + ] + }, + "zoramainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x35130945b625bb69b28aee902a3b9a76fa67125f", + "0x7089b6352d37d23fb05a7fee4229c78e038fba09", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + } +} diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json new file mode 100644 index 0000000000..10cbbb91a5 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json @@ -0,0 +1,3 @@ +{ + "program_id": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM" +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/soon/hyperlane/multisig-config.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/soon/hyperlane/multisig-config.json new file mode 100644 index 0000000000..35b1a4e5ac --- /dev/null +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/soon/hyperlane/multisig-config.json @@ -0,0 +1,1051 @@ +{ + "alephzeroevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x33f20e6e775747d60301c6ea1c50e51f0389740c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa" + ] + }, + "ancient8": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbb5842ae0e05215b53df4787a29144efb7e67551", + "0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969", + "0x95c7bf235837cb5a609fe6c95870410b9f68bcff" + ] + }, + "apechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "appchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x0531251bbadc1f9f19ccce3ca6b3f79f08eae1be", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arbitrum": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", + "0xec68258a7c882ac2fc46b81ce80380054ffb4ef2", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "arbitrumnova": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd2a5e9123308d187383c87053811a2c21bd8af1f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arthera": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x13710ac11c36c169f62fba95767ae59a1e57098d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "astar": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4d1b2cade01ee3493f44304653d8e352c66ec3e7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "astarzkevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x89ecdd6caf138934bf3a2fb7b323984d72fd66de", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "aurora": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "avalanche": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3fb8263859843bffb02950c492d492cae169f4cf", + "0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" + ] + }, + "b3": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd77b516730a836fc41934e7d5864e72c165b934e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "base": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xcff391b4e516452d424db66beb9052b041a9ed79", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "bitlayer": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "blast": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xf20c0b09f597597c8d2430d3d72dfddaf09177d1", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x1652d8ba766821cf01aeea34306dfc1cab964a32", + "0x54bb0036f777202371429e062fe6aee0d59442f9" + ] + }, + "bob": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x20f283be1eb0e81e22f51705dcb79883cfdd34aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "boba": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xebeb92c94ca8408e73aa16fd554cb3a7df075c59", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "bsc": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x570af9b7b36568c8877eebba6c6727aa9dab7268", + "0x8292b1a53907ece0f76af8a50724e9492bcdc8a3", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "bsquared": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcadc90933c9fbe843358a4e70e46ad2db78e28aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "celo": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x63478422679303c3e4fc611b771fa4a707ef7f4a", + "0x622e43baf06ad808ca8399360d9a2d9a1a12688b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "cheesechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x478fb53c6860ae8fc35235ba0d38d49b13128226", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "chilizmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conflux": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conwai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "coredao": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbd6e158a3f5830d99d7d2bce192695bc4a148de2", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "corn": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc80b2e3e38220e02d194a0effa9d5bfe89894c07", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "cyber": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x94d7119ceeb802173b6924e6cc8c4cd731089a27", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "degenchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x433e311f19524cd64fb2123ad0aa1579a4e1fc83", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "dogechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xe43f742c37858746e6d7e458bc591180d0cba440", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "duckchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x91d55fe6dac596a6735d96365e21ce4bca21d83c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "eclipsemainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0", + "0x3571223e745dc0fcbdefa164c9b826b90c0d2dac", + "0xea83086a62617a7228ce4206fae2ea8b0ab23513", + "0x4d4629f5bfeabe66edc7a78da26ef5273c266f97" + ] + }, + "endurance": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x28c5b322da06f184ebf68693c5d19df4d4af13e5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x7419021c0de2772b763e554480158a82a291c1f2" + ] + }, + "ethereum": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x03c842db86a6a3e524d4a6615390c1ea8e2b9541", + "0x94438a7de38d4548ae54df5c6010c4ebc5239eae", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0xb683b742b378632a5f73a2a5a45801b3489bba44", + "0xbf1023eff3dba21263bf2db2add67a0d6bcda2de" + ] + }, + "everclear": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0xD79DFbF56ee2268f061cc613027a44A880f61Ba2" + ] + }, + "evmos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fantom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa779572028e634e16f26af5dfd4fa685f619457d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flame": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1fa928ce884fa16357d4b8866e096392d4d81f43", + "0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab", + "0x09f9de08f7570c4146caa708dc9f75b56958957f", + "0xf1f4ae9959490380ad7863e79c3faf118c1fbf77", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "flare": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb65e52be342dba3ab2c088ceeb4290c744809134", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flowmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xe132235c958ca1f3f24d772e5970dd58da4c0f6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59" + ] + }, + "form": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x58554b2e76167993b5fc000d0070a2f883cd333a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fraxtal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82", + "0x573e960e07ad74ea2c5f1e3c31b2055994b12797", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91" + ] + }, + "fusemainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9", + "0x6760226b34213d262D41D5291Ed57E81a68b4E0b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "gnosis": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xd4df66a859585678f2ea8357161d896be19cc1ca", + "0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "gravity": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d549bf757a02a6f6068e9363196ecd958c974e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "harmony": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd677803a67651974b1c264171b5d7ca8838db8d5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "immutablezkevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbdda85b19a5efbe09e52a32db1a072f043dd66da", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "inevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf9e35ee88e4448a3673b4676a4e153e3584a08eb", + "0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc", + "0x9ab11f38a609940153850df611c9a2175dcffe0f" + ] + }, + "injective": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbfb8911b72cfb138c7ce517c57d9c691535dc517", + "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", + "0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9" + ] + }, + "ink": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xb533b8b104522958b984fb258e0684dec0f1a6a5", + "0xd207a6dfd887d91648b672727ff1aef6223cb15a", + "0xa40203b5301659f1e201848d92f5e81f64f206f5", + "0xff9c1e7b266a36eda0d9177d4236994d94819dc0", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "kaia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9de0b3abb221d19719882fa4d61f769fdc2be9a4", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "kroma": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x71b83c21342787d758199e4b8634d3a15f02dc6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "linea": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf2d5409a59e0f5ae7635aff73685624904a77d94", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lisk": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e", + "0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf0da628f3fb71652d48260bad4691054045832ce", + "0xead4141b6ea149901ce4f4b556953f66d04b1d0c" + ] + }, + "lukso": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa5e953701dcddc5b958b5defb677a829d908df6d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "lumia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lumiaprism": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb69731640ffd4338a2c9358a935b0274c6463f85", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "mantapacific": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", + "0x521a3e6bf8d24809fde1c1fd3494a859a16f132c", + "0x14025fe092f5f8a401dd9819704d9072196d2125", + "0x25b9a0961c51e74fd83295293bc029131bf1e05a", + "0xa0eE95e280D46C14921e524B075d0C341e7ad1C8", + "0xcc9a0b6de7fe314bd99223687d784730a75bb957", + "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" + ] + }, + "mantle": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "merlin": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "metal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xd9f7f1a05826197a93df51e86cefb41dfbfb896a", + "0x01e3909133d20c05bbc94247769235d30101f748", + "0xaba06266f47e3ef554d218b879bd86114a8dabd4", + "0x05d91f80377ff5e9c6174025ffaf094c57a4766a", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "metis": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc4a3d25107060e800a43842964546db508092260", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "mint": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x0230505530b80186f8cdccfaf9993eb97aebe98a" + ] + }, + "mode": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x65C140e3a05F33192384AffEF985696Fe3cDDE42", + "0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x485a4f0009d9afbbf44521016f9b8cdd718e36ea" + ] + }, + "molten": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "moonbeam": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x2225e2f4e9221049456da93b71d2de41f3b6b2a8", + "0x645428d198d2e76cbd9c1647f5c80740bb750b97", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "morph": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4884535f393151ec419add872100d352f71af380", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "neutron": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "0xb65438a014fb05fbadcfe35bc6e25d372b6ba460", + "0x42fa752defe92459370a052b6387a87f7de9b80c", + "0xc79503a3e3011535a9c60f6d21f76f59823a38bd", + "0x47aa126e05933b95c5eb90b26e6b668d84f4b25a", + "0x54b2cca5091b098a1a993dec03c4d1ee9af65999", + "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" + ] + }, + "oortmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1" + ] + }, + "optimism": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x20349eadc6c72e94ce38268b96692b1a5c20de4f", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB", + "0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12" + ] + }, + "orderly": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "osmosis": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xea483af11c19fa41b16c31d1534c2a486a92bcac" + ] + }, + "polygon": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", + "0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x5450447aee7b544c462c9352bef7cad049b0c2dc" + ] + }, + "polygonzkevm": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x86f2a44592bb98da766e880cfd70d3bbb295e61a", + "0x865818fe1db986036d5fd0466dcd462562436d1a", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" + ] + }, + "polynomialfi": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d348c2d365040e56f3fee07e6897122915f513", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "prom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb0c4042b7c9a95345be8913f4cdbf4043b923d98", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "proofofplay": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcda40baa71970a06e5f55e306474de5ca4e21c3b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rarichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeac012df7530720dd7d6f9b727e4fe39807d1516", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "real": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "redstone": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1400b9737007f7978d8b4bbafb4a69c83f0641a7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "rivalz": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rootstockmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8675eb603d62ab64e3efe90df914e555966e04ac", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "sanko": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x795c37d5babbc44094b084b0c89ed9db9b5fae39", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "scroll": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xad557170a9f2f21c35e03de07cb30dcbcc3dff63", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948" + ] + }, + "sei": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "shibarium": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xfa33391ee38597cbeef72ccde8c9e13e01e78521", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "snaxchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "solanamainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x28464752829b3ea59a497fca0bdff575c534c3ff", + "0x2b7514a2f77bd86bbf093fe6bb67d8611f51c659", + "0xd90ea26ff731d967c5ea660851f7d63cb04ab820", + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0xcb6bcbd0de155072a7ff486d9d7286b0f71dcc2d" + ] + }, + "soneium": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd4b7af853ed6a2bfc329ecef545df90c959cbee8" + ] + }, + "sonic": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "stride": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x88f0E5528131b10e3463C4c68108217Dd33462ac", + "0xa3eaa1216827ad63dd9db43f6168258a89177990", + "0x3f869C36110F00D10dC74cca3ac1FB133cf019ad", + "0x502dC6135d16E74056f609FBAF76846814C197D3", + "0xc36979780c1aD43275182600a61Ce41f1C390FbE", + "0x87460dcEd16a75AECdBffD4189111d30B099f5b0", + "0xf54982134e52Eb7253236943FBffE0886C5bde0C", + "0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "superpositionmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "superseed": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88", + "0x68f3a3b244f6ddc135130200a6b8729e290b4240", + "0x6ff4554cffbc2e4e4230b78e526eab255101d05a", + "0x55880ac03fdf15fccff54ed6f8a83455033edd22", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "swell": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4f51e4f4c7fb45d82f91568480a1a2cfb69216ed", + "0x9eadf9217be22d9878e0e464727a2176d5c69ff8", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "taiko": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xa930073c8f2d0b2f7423ea32293e0d1362e65d79", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a" + ] + }, + "tangle": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0xe271ef9a6e312540f099a378865432fa73f26689" + ] + }, + "telos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "treasure": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x6ad994819185553e8baa01533f0cd2c7cadfe6cc", + "0x278460fa51ff448eb53ffa62951b4b8e3e8f74e3", + "0xe92ff70bb463e2aa93426fd2ba51afc39567d426", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "unichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9773a382342ebf604a2e5de0a1f462fb499e28b1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "vana": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xba2f4f89cae6863d8b49e4ca0208ed48ad9ac354" + ] + }, + "viction": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x6D113Ae51bfeA7b63a8828f97e9dcE393B25c189", + "0xa3f93fe365bf99f431d8fde740b140615e24f99b", + "0x1f87c368f8e05a85ef9126d984a980a20930cb9c" + ] + }, + "worldchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x31048785845325b22817448b68d08f8a8fe36854", + "0x11e2a683e83617f186614071e422b857256a9aae", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "xai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "xlayer": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa2ae7c594703e988f23d97220717c513db638ea3", + "0xfed056cC0967F5BC9C6350F6C42eE97d3983394d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" + ] + }, + "zeronetwork": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zetachain": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zircuit": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb", + "0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061", + "0x0180444c9342BD672867Df1432eb3dA354413a6E", + "0x1da9176C2CE5cC7115340496fa7D1800a98911CE" + ] + }, + "zklink": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x217a8cb4789fc45abf56cb6e2ca96f251a5ac181", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zksync": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x75237d42ce8ea27349a0254ada265db94157e0c1" + ] + }, + "zoramainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x35130945b625bb69b28aee902a3b9a76fa67125f", + "0x7089b6352d37d23fb05a7fee4229c78e038fba09", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + } +} diff --git a/rust/sealevel/environments/mainnet3/solanamainnet/gas-oracle-configs-solanamainnet.json b/rust/sealevel/environments/mainnet3/solanamainnet/gas-oracle-configs-solanamainnet.json index 44f00e80a1..463990b543 100644 --- a/rust/sealevel/environments/mainnet3/solanamainnet/gas-oracle-configs-solanamainnet.json +++ b/rust/sealevel/environments/mainnet3/solanamainnet/gas-oracle-configs-solanamainnet.json @@ -7,5 +7,14 @@ "gasPrice": "2", "tokenDecimals": 9 } + }, + { + "domain": 50075007, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "25036363636360000000", + "gasPrice": "2", + "tokenDecimals": 9 + } } ] diff --git a/rust/sealevel/environments/mainnet3/soon/core/program-ids.json b/rust/sealevel/environments/mainnet3/soon/core/program-ids.json new file mode 100644 index 0000000000..249ca53ab3 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/soon/core/program-ids.json @@ -0,0 +1,8 @@ +{ + "mailbox": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", + "validator_announce": "GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz", + "multisig_ism_message_id": "4fPoa26ayqY1cwY3AcqUPvdLLNHpjJGdDQevtnTLAAnH", + "igp_program_id": "5AAMBemjUrAprKJzi22Si9pyYhK8vTr7Jpti7LEXo6d8", + "overhead_igp_account": "GctmRsKQM5VLPrUPpsQ7Kc7RaVKNC2Fev31n1KtLkj8A", + "igp_account": "Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ" +} diff --git a/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json b/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json new file mode 100644 index 0000000000..5a0f6bc9a9 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json @@ -0,0 +1,20 @@ +[ + { + "domain": 1, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "15000000000000000000", + "gasPrice": "10000000000", + "tokenDecimals": 18 + } + }, + { + "domain": 1399811149, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "887000000000000000", + "gasPrice": "15", + "tokenDecimals": 9 + } + } +] diff --git a/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/program-ids.json new file mode 100644 index 0000000000..4120605fd6 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/program-ids.json @@ -0,0 +1,10 @@ +{ + "solanamainnet": { + "hex": "0x1a44f075753adbb13e07920162d7c78d419c1be1adffe4fd11f66ea6d7816ac3", + "base58": "2mYa5q9chqBxR89Nc5CtAqdy5Wwjev5269GyxNFaT95U" + }, + "soon": { + "hex": "0x99e46b5d78d402b0e056484e6ddc7dd99f873aa7621da7eee6bee7e9eca1307a", + "base58": "BMjPo9Yz9bdiLuKVfHfjuAEE6JgmnMWYaVEv1ehFYnd7" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json new file mode 100644 index 0000000000..9f4972c9c0 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json @@ -0,0 +1,18 @@ +{ + "solanamainnet": { + "type": "collateral", + "decimals": 5, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "interchainSecurityModule": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM", + "token": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", + "splTokenProgram": "token" + }, + "soon": { + "type": "synthetic", + "decimals": 5, + "name": "Bonk", + "symbol": "Bonk", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/9a11b8b53eda0473ea415d63043b13ad92454e82/deployments/warp_routes/Bonk/metadata.json", + "interchainGasPaymaster": "GctmRsKQM5VLPrUPpsQ7Kc7RaVKNC2Fev31n1KtLkj8A" + } +} diff --git a/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json new file mode 100644 index 0000000000..6d68609266 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json @@ -0,0 +1,10 @@ +{ + "solanamainnet": { + "hex": "0xe492f8f3cb623b87d8ae46ecdb541424ae870a39110ad09087a793b0237aaff7", + "base58": "GPFwRQ5Cw6dTWnmappUKJt76DD8yawxPx28QugfCaGaA" + }, + "soon": { + "hex": "0x50c3447854a0cf980f4a562fd34ce4031a0b7fe725521ad21482b74cb2b733ac", + "base58": "6SGK4PnHefm4egyUUeVro8wKBkuPexVehsjuUK8auJ8b" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json new file mode 100644 index 0000000000..e4d638b0fc --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json @@ -0,0 +1,16 @@ +{ + "solanamainnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "interchainSecurityModule": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM" + }, + "soon": { + "type": "synthetic", + "decimals": 9, + "name": "Solana", + "symbol": "SOL", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/77a04c0b7e214ae17853215467f8ddea5e0ac710/deployments/warp_routes/SOL/metadata.json", + "interchainGasPaymaster": "GctmRsKQM5VLPrUPpsQ7Kc7RaVKNC2Fev31n1KtLkj8A" + } +} diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index f886bd802b..cbe6c011b2 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -149,6 +149,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< solanamainnet: true, soneium: true, sonic: true, + soon: true, stride: false, superseed: true, superpositionmainnet: true, @@ -262,6 +263,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< solanamainnet: true, soneium: true, sonic: true, + soon: true, stride: true, superseed: true, superpositionmainnet: true, @@ -374,6 +376,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< solanamainnet: true, soneium: true, sonic: true, + soon: false, stride: true, superseed: true, superpositionmainnet: true, @@ -622,7 +625,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'f73dcc3-20241229-154524', + tag: 'a470a5b-20250107-144236', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, @@ -632,7 +635,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '05e90bc-20241216-180035', + tag: 'a470a5b-20250107-144236', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index 9ddb62b9d3..611b3514e0 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -326,6 +326,9 @@ "sonic": { "validators": ["0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7"] }, + "soon": { + "validators": ["0x0e6723b3c1ed3db0c24347aa2cf16d28bc2a1f76"] + }, "superseed": { "validators": ["0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88"] }, diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index f1fea75213..1d0ba3b10a 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -139,6 +139,7 @@ export const keyFunderConfig: KeyFunderConfig< osmosis: '0', solanamainnet: '0', eclipsemainnet: '0', + soon: '0', }, // if not set, keyfunder defaults to 0 desiredKathyBalancePerChain: { @@ -194,6 +195,7 @@ export const keyFunderConfig: KeyFunderConfig< osmosis: '0', eclipsemainnet: '0', solanamainnet: '0', + soon: '0', }, // if not set, keyfunder defaults to using desired balance * 0.2 as the threshold igpClaimThresholdPerChain: { @@ -249,5 +251,6 @@ export const keyFunderConfig: KeyFunderConfig< osmosis: '0', eclipsemainnet: '0', solanamainnet: '0', + soon: '0', }, }; diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index c9698725ad..90290c4281 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -355,6 +355,10 @@ "amount": "1.1", "decimals": 9 }, + "soon": { + "amount": "0.0000001", + "decimals": 1 + }, "stride": { "amount": "0.005", "decimals": 1 diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index 5d433fca5c..a569e6cadd 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -91,6 +91,7 @@ export const mainnet3SupportedChainNames = [ 'solanamainnet', 'soneium', 'sonic', + 'soon', 'stride', 'superseed', 'superpositionmainnet', diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 6d4517e2ad..29ce105cdb 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -88,6 +88,7 @@ "solanamainnet": "216.87", "soneium": "3862.21", "sonic": "1.3", + "soon": "3862.21", "stride": "0.658767", "superseed": "3862.21", "superpositionmainnet": "3862.21", diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 73e4985a50..0ba31db6bd 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -1375,6 +1375,16 @@ export const validatorChainConfig = ( 'rivalz', ), }, + soon: { + interval: 5, + reorgPeriod: getReorgPeriod('soon'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76'], + }, + 'soon', + ), + }, // fractal: { // interval: 5, diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 0febbb803c..8a942db417 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -1658,6 +1658,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + soon: { + threshold: 1, + validators: [ + { + address: '0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + stride: { threshold: 6, validators: [ From 9a8974b39bc2ebf819fb70481047fbe53ff9b520 Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Wed, 8 Jan 2025 11:08:14 +0000 Subject: [PATCH 32/81] feat: Add Stride validator configuration to RC context (#5124) ### Description Add Stride validator configuration to RC context ### Related issues - Contributes into https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/5113 ### Backward compatibility Yes ### Testing On RC Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> --- .../environments/mainnet3/aw-validators/rc.json | 3 +++ .../infra/config/environments/mainnet3/validators.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/rc.json b/typescript/infra/config/environments/mainnet3/aw-validators/rc.json index 55638fa670..5427114cb7 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/rc.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/rc.json @@ -218,5 +218,8 @@ "0xb825c1bd020cb068f477b320f591b32e26814b5b", "0x0a5b31090d4c3c207b9ea6708f938e328f895fce" ] + }, + "stride": { + "validators": ["0x1edadb2330c77769a7e9b48d990289ccdcafa430"] } } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 0ba31db6bd..8cf8b1877d 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -1385,6 +1385,18 @@ export const validatorChainConfig = ( 'soon', ), }, + stride: { + interval: 5, + reorgPeriod: getReorgPeriod('stride'), + validators: validatorsConfig( + { + [Contexts.ReleaseCandidate]: [ + '0x1edadb2330c77769a7e9b48d990289ccdcafa430', + ], + }, + 'stride', + ), + }, // fractal: { // interval: 5, From 71dd0f1b350407bb6ec2b241abc2dc81d7fc0b3d Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Wed, 8 Jan 2025 11:44:28 -0500 Subject: [PATCH 33/81] chore: add READMEs to hook and ism folders (#4637) ### Description Copies in docs for reference in published NPM package Co-authored-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- solidity/contracts/hooks/README.md | 58 ++++++++++++++++++++++++++++++ solidity/contracts/isms/README.md | 20 +++++++++++ 2 files changed, 78 insertions(+) create mode 100644 solidity/contracts/hooks/README.md create mode 100644 solidity/contracts/isms/README.md diff --git a/solidity/contracts/hooks/README.md b/solidity/contracts/hooks/README.md new file mode 100644 index 0000000000..6c538dfd4c --- /dev/null +++ b/solidity/contracts/hooks/README.md @@ -0,0 +1,58 @@ +# Post-Dispatch Hooks + +Post-dispatch hooks allow developers to configure additional origin chain behavior with message content dispatched via the Mailbox. + +```mermaid +flowchart TB + subgraph Origin + Sender + M_O[(Mailbox)] + Hook[IPostDispatchHook] + + Sender -- "dispatch(..., metadata, hook)\n{value}" --> M_O + M_O -- "postDispatch(message, metadata)\n{value}" --> Hook + end +``` + +If the `postDispatch` function receives insufficient payment, it may revert. + +> [!WARNING] +> Post-Dispatch Hooks may be replayable. Developers creating custom hooks should implement safe checks to prevent this behavior. [Here](./warp-route/RateLimitedHook.sol#L16) is an example implementation. + +### Quote Dispatch (Fees) + +Fees are often charged in `postDispatch` to cover costs such as destination chain transaction submission and security provisioning. To receive a quote for a corresponding `postDispatch` call, you can query the `quoteDispatch` function. + +The Mailbox has a `quoteDispatch` function that returns the aggregate fee required for a `dispatch` call to be successful. + +```mermaid +flowchart TB + subgraph Origin + Sender + M_O[(Mailbox)] + R_H[RequiredHook] + Hook[Hook] + + Sender -- "quoteDispatch(..., metadata, hook)" --> M_O + M_O -- "required = quoteDispatch(message, metadata)" --> R_H + M_O -- "fee = hook.quoteDispatch(message, metadata)" --> Hook + M_O -- "required + fee" --> Sender + end +``` + +The custom `metadata` will be passed to the required hook's `quoteDispatch` and `postDispatch` functions, before being passed to the default hook's `postDispatch` function. + +```mermaid +flowchart LR + subgraph Origin Chain + Sender + M_O[(Mailbox)] + R_H[RequiredHook] + D_H[DefaultHook] + Sender -- "dispatch(..., metadata){value}" --> M_O + + M_O -. "fee = quoteDispatch(...)" .- R_H + M_O -- "postDispatch(metadata, ...)\n{fee}" --> R_H + M_O -. "postDispatch(metadata, ...)\n{value - fee}" ..-> D_H + end +``` diff --git a/solidity/contracts/isms/README.md b/solidity/contracts/isms/README.md new file mode 100644 index 0000000000..d9f74f3979 --- /dev/null +++ b/solidity/contracts/isms/README.md @@ -0,0 +1,20 @@ +# Interchain Security Modules + +Interchain security modules allow developers to configure additional security checks for message content dispatched via the Mailbox. + +```mermaid +flowchart LR + subgraph Destination Chain + ISM[InterchainSecurityModule] + Recipient[Recipient] + M_D[(Mailbox)] + + M_D -- "verify(metadata, message)" --> ISM + ISM -. "interchainSecurityModule()" .- Recipient + M_D -- "handle(origin, sender, body)" --> Recipient + + end +``` + +> [!WARNING] +> Interchain security modules may be replayable. Developers creating custom modules should include replay protection if necessary. [Here](./warp-route/RateLimitedIsm.sol#L23) is an example implementation. From c690ca82fdbcdba368a5afee3e9194690d94460c Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 8 Jan 2025 18:40:16 +0000 Subject: [PATCH 34/81] feat: deploy to torus (#5116) ### Description - feat: deploy to torus ### Drive-by changes - igp updates ### Related issues https://github.com/hyperlane-xyz/hyperlane-registry/pull/467 ### Backward compatibility ### Testing manual --- .changeset/selfish-shoes-sneeze.md | 5 + .registryrc | 2 +- rust/main/config/mainnet_config.json | 67 ++++++ .../config/environments/mainnet3/agent.ts | 11 +- .../mainnet3/aw-validators/hyperlane.json | 3 + .../mainnet3/core/verification.json | 70 ++++++ .../config/environments/mainnet3/funding.ts | 3 +- .../environments/mainnet3/gasPrices.json | 36 +-- .../infra/config/environments/mainnet3/igp.ts | 4 +- .../mainnet3/ism/verification.json | 86 +++++++ .../middleware/accounts/verification.json | 21 ++ .../mainnet3/supportedChainNames.ts | 1 + .../environments/mainnet3/tokenPrices.json | 219 +++++++++--------- .../environments/mainnet3/validators.ts | 11 + typescript/sdk/src/consts/multisigIsm.ts | 10 + 15 files changed, 417 insertions(+), 132 deletions(-) create mode 100644 .changeset/selfish-shoes-sneeze.md diff --git a/.changeset/selfish-shoes-sneeze.md b/.changeset/selfish-shoes-sneeze.md new file mode 100644 index 0000000000..5e4199dcb2 --- /dev/null +++ b/.changeset/selfish-shoes-sneeze.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Deploy to torus. diff --git a/.registryrc b/.registryrc index b89b5c5401..5a0f111647 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -d01becffba3dd2d0a053a25bffc3d97bde70129a +8481aeb47ed242783c8dc6ccd366f90a95b471bf diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 1f34be9f8a..4ba4dc3970 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -1285,6 +1285,9 @@ } ], "rpcUrls": [ + { + "http": "https://injective-rpc.publicnode.com:443" + }, { "http": "https://sentry.tm.injective.network:443" } @@ -7295,6 +7298,70 @@ "mailbox": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", "merkleTreeHook": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", "validatorAnnounce": "GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz" + }, + "torus": { + "blockExplorers": [ + { + "apiUrl": "https://api.blockscout.torus.network/api", + "family": "blockscout", + "name": "Torus Explorer", + "url": "https://blockscout.torus.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 8, + "reorgPeriod": "finalized" + }, + "chainId": 21000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Torus", + "domainId": 21000, + "gasCurrencyCoinGeckoId": "torus", + "name": "torus", + "nativeToken": { + "decimals": 18, + "name": "Torus", + "symbol": "TORUS" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://api-hyperlane.nodes.torus.network" + } + ], + "technicalStack": "polkadotsubstrate", + "aggregationHook": "0xfe94Ea7DA6C45849D395e3d03973aa924553b937", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "interchainAccountIsm": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", + "interchainAccountRouter": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", + "interchainGasPaymaster": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", + "interchainSecurityModule": "0x8f1953EFbd2C720223faD02d6CB5CD25f97D7fC9", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "pausableHook": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "pausableIsm": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", + "protocolFee": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x8f1953EFbd2C720223faD02d6CB5CD25f97D7fC9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", + "testRecipient": "0x92249B8ed35C2980e58666a3EBF4a075DDD2895f", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", + "index": { + "from": 40622 + } } }, "defaultRpcConsensusType": "fallback" diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index cbe6c011b2..4737401443 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -157,6 +157,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< taiko: true, tangle: true, telos: true, + torus: true, treasure: true, unichain: true, vana: true, @@ -271,6 +272,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< taiko: true, tangle: true, telos: true, + torus: true, treasure: true, unichain: true, vana: true, @@ -384,6 +386,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< taiko: true, tangle: true, telos: true, + torus: true, treasure: true, unichain: true, vana: true, @@ -476,6 +479,8 @@ const gasPaymentEnforcement: GasPaymentEnforcement[] = [ matchingList: [ // Temporary workaround due to funky Mantle gas amounts. { destinationDomain: getDomainId('mantle') }, + // Temporary workaround due to funky Torus gas amounts. + { destinationDomain: getDomainId('torus') }, // Temporary workaround for some high gas amount estimates on Treasure ...warpRouteMatchingList(WarpRouteIds.ArbitrumTreasureMAGIC), ], @@ -625,7 +630,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'a470a5b-20250107-144236', + tag: '706f69b-20250107-230151', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, @@ -635,7 +640,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: 'a470a5b-20250107-144236', + tag: '706f69b-20250107-230151', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -645,7 +650,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '3812453-20241224-020703', + tag: '706f69b-20250107-230151', }, resources: scraperResources, }, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index 611b3514e0..cff89b8cc6 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -347,6 +347,9 @@ "telos": { "validators": ["0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54"] }, + "torus": { + "validators": ["0x96982a325c28a842bc8cf61b63000737bb9f1f7d"] + }, "treasure": { "validators": ["0x6ad994819185553e8baa01533f0cd2c7cadfe6cc"] }, diff --git a/typescript/infra/config/environments/mainnet3/core/verification.json b/typescript/infra/config/environments/mainnet3/core/verification.json index 19c72ec1e3..e16dc3d9c4 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -6968,5 +6968,75 @@ "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", "isProxy": false } + ], + "torus": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000005208", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000001c6f404800ba49ed581af734ea0d25c0c7d017b2", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", + "constructorArguments": "0000000000000000000000005e8a0fcc0d1df583322943e01f02cb243e5300f60000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6" + }, + { + "name": "ProtocolFee", + "address": "0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } ] } diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index 1d0ba3b10a..ae01eb3e5b 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '05e90bc-20241216-180025', + tag: '706f69b-20250107-230147', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron @@ -119,6 +119,7 @@ export const keyFunderConfig: KeyFunderConfig< taiko: '0.2', tangle: '2', telos: '100', + torus: '5', treasure: '900', unichain: '0.05', // temporarily low until we're able to fund more diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index 90290c4281..a001f27802 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -24,7 +24,7 @@ "decimals": 9 }, "arthera": { - "amount": "1.025064", + "amount": "1.025057", "decimals": 9 }, "astar": { @@ -32,7 +32,7 @@ "decimals": 9 }, "astarzkevm": { - "amount": "0.263", + "amount": "0.087", "decimals": 9 }, "aurora": { @@ -48,7 +48,7 @@ "decimals": 9 }, "b3": { - "amount": "0.001000252", + "amount": "0.001000285", "decimals": 9 }, "base": { @@ -68,7 +68,7 @@ "decimals": 9 }, "boba": { - "amount": "0.001000068", + "amount": "0.001000071", "decimals": 9 }, "bsc": { @@ -132,7 +132,7 @@ "decimals": 9 }, "ethereum": { - "amount": "10.0", + "amount": "10.885220772", "decimals": 9 }, "everclear": { @@ -148,7 +148,7 @@ "decimals": 9 }, "flare": { - "amount": "25.0", + "amount": "25.932675252", "decimals": 9 }, "flowmainnet": { @@ -180,7 +180,7 @@ "decimals": 9 }, "immutablezkevmmainnet": { - "amount": "11.00000005", + "amount": "11.000000049", "decimals": 9 }, "inevm": { @@ -204,11 +204,11 @@ "decimals": 9 }, "linea": { - "amount": "0.548523195", + "amount": "0.67121914", "decimals": 9 }, "lisk": { - "amount": "0.001001154", + "amount": "0.010752839", "decimals": 9 }, "lukso": { @@ -224,7 +224,7 @@ "decimals": 9 }, "mantapacific": { - "amount": "0.003000319", + "amount": "0.003000333", "decimals": 9 }, "mantle": { @@ -244,7 +244,7 @@ "decimals": 9 }, "mint": { - "amount": "0.001000256", + "amount": "0.001000252", "decimals": 9 }, "mode": { @@ -352,7 +352,7 @@ "decimals": 9 }, "sonic": { - "amount": "1.1", + "amount": "5.5", "decimals": 9 }, "soon": { @@ -384,7 +384,11 @@ "decimals": 9 }, "telos": { - "amount": "522.500627641", + "amount": "522.109974741", + "decimals": 9 + }, + "torus": { + "amount": "31.25", "decimals": 9 }, "treasure": { @@ -396,7 +400,7 @@ "decimals": 9 }, "vana": { - "amount": "0.005", + "amount": "0.312673957", "decimals": 9 }, "viction": { @@ -404,7 +408,7 @@ "decimals": 9 }, "worldchain": { - "amount": "0.001000251", + "amount": "0.001000346", "decimals": 9 }, "xai": { @@ -416,7 +420,7 @@ "decimals": 9 }, "zeronetwork": { - "amount": "0.04525", + "amount": "0.06", "decimals": 9 }, "zetachain": { diff --git a/typescript/infra/config/environments/mainnet3/igp.ts b/typescript/infra/config/environments/mainnet3/igp.ts index 3dbe6c775e..5c2dfd6efc 100644 --- a/typescript/infra/config/environments/mainnet3/igp.ts +++ b/typescript/infra/config/environments/mainnet3/igp.ts @@ -27,8 +27,8 @@ const tokenPrices: ChainMap = rawTokenPrices; export function getOverheadWithOverrides(local: ChainName, remote: ChainName) { let overhead = getOverhead(local, remote, ethereumChainNames); - // Moonbeam gas usage can be up to 4x higher than vanilla EVM - if (remote === 'moonbeam') { + // Moonbeam/Torus gas usage can be up to 4x higher than vanilla EVM + if (remote === 'moonbeam' || remote === 'torus') { overhead *= 4; } // ZkSync gas usage is different from the EVM and tends to give high diff --git a/typescript/infra/config/environments/mainnet3/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index 75e4fc83b9..de253c30cd 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -8734,5 +8734,91 @@ "constructorArguments": "", "isProxy": true } + ], + "torus": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } ] } diff --git a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json index cd4c3ea01c..f591378947 100644 --- a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json +++ b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json @@ -2121,5 +2121,26 @@ "isProxy": true, "expectedimplementation": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df" } + ], + "torus": [ + { + "name": "InterchainAccountIsm", + "address": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", + "constructorArguments": "0000000000000000000000005da60220c5dde35b7ae91c042ff5979047fa07850000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d64d126941eac2cf53e0e4e8146cc70449b60d73000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785" + } ] } diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index a569e6cadd..d1cfa16043 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -99,6 +99,7 @@ export const mainnet3SupportedChainNames = [ 'taiko', 'tangle', 'telos', + 'torus', 'treasure', 'unichain', 'vana', diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 29ce105cdb..21f2c84dbe 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,112 +1,113 @@ { - "ancient8": "3862.21", - "alephzeroevmmainnet": "0.491237", - "apechain": "1.48", - "appchain": "3862.21", - "arbitrum": "3862.21", - "arbitrumnova": "3862.21", - "arthera": "0.079162", - "astar": "0.068176", - "astarzkevm": "3862.21", - "aurora": "3862.21", - "flame": "6.24", - "avalanche": "46.58", - "b3": "3862.21", - "base": "3862.21", - "bitlayer": "104188", - "blast": "3862.21", - "bob": "3862.21", - "boba": "3862.21", - "bsc": "715.42", - "bsquared": "104188", - "celo": "0.763128", - "cheesechain": "0.00147642", - "chilizmainnet": "0.101585", - "conflux": "0.187951", - "conwai": "0.00457053", - "coredao": "1.23", - "corn": "104188", - "cyber": "3862.21", - "degenchain": "0.01304206", - "dogechain": "0.385834", - "duckchain": "5.75", - "eclipsemainnet": "3862.21", - "endurance": "2.42", - "ethereum": "3862.21", - "everclear": "3862.21", - "evmos": "0.02761808", - "fantom": "1.3", - "flare": "0.02941065", - "flowmainnet": "0.856226", - "form": "3862.21", - "fraxtal": "3854.07", - "fusemainnet": "0.034729", - "gnosis": "1.005", - "gravity": "0.03098347", - "harmony": "0.03085585", - "immutablezkevmmainnet": "1.68", - "inevm": "26.54", - "ink": "3862.21", - "injective": "26.54", - "kaia": "0.257712", - "kroma": "3862.21", - "linea": "3862.21", - "lisk": "3862.21", - "lukso": "2.82", - "lumia": "1.89", - "lumiaprism": "1.81", - "mantapacific": "3862.21", - "mantle": "1.19", - "merlin": "104171", - "metal": "3862.21", - "metis": "53.23", - "mint": "3862.21", - "mode": "3862.21", - "molten": "0.504259", - "moonbeam": "0.278919", - "morph": "3862.21", - "neutron": "0.47823", - "oortmainnet": "0.176273", - "optimism": "3862.21", - "orderly": "3862.21", - "osmosis": "0.550513", - "polygon": "0.55632", - "polygonzkevm": "3862.21", - "polynomialfi": "3862.21", - "prom": "6.34", - "proofofplay": "3862.21", - "rarichain": "3862.21", - "real": "1", - "redstone": "3862.21", - "rivalz": "3862.21", - "rootstockmainnet": "103948", - "sanko": "62.71", - "scroll": "3862.21", - "sei": "0.517789", - "shibarium": "0.555228", - "snaxchain": "3862.21", - "solanamainnet": "216.87", - "soneium": "3862.21", - "sonic": "1.3", - "soon": "3862.21", - "stride": "0.658767", - "superseed": "3862.21", - "superpositionmainnet": "3862.21", - "swell": "3862.21", - "taiko": "3862.21", + "ancient8": "3453.7", + "alephzeroevmmainnet": "0.3486", + "apechain": "1.24", + "appchain": "3453.7", + "arbitrum": "3453.7", + "arbitrumnova": "3453.7", + "arthera": "0.067168", + "astar": "0.062423", + "astarzkevm": "3453.7", + "aurora": "3453.7", + "flame": "5.15", + "avalanche": "40.66", + "b3": "3453.7", + "base": "3453.7", + "bitlayer": "97242", + "blast": "3453.7", + "bob": "3453.7", + "boba": "3453.7", + "bsc": "706.99", + "bsquared": "97242", + "celo": "0.678158", + "cheesechain": "0.00103496", + "chilizmainnet": "0.087192", + "conflux": "0.162275", + "conwai": "0.00403541", + "coredao": "1.14", + "corn": "97242", + "cyber": "3453.7", + "degenchain": "0.01208991", + "dogechain": "0.364012", + "duckchain": "5.45", + "eclipsemainnet": "3453.7", + "endurance": "2.04", + "ethereum": "3453.7", + "everclear": "3453.7", + "evmos": "0.02209296", + "fantom": "0.71528", + "flare": "0.02537583", + "flowmainnet": "0.769569", + "form": "3453.7", + "fraxtal": "3447.2", + "fusemainnet": "0.03044328", + "gnosis": "1", + "gravity": "0.03592135", + "harmony": "0.02753767", + "immutablezkevmmainnet": "1.35", + "inevm": "24.38", + "ink": "3453.7", + "injective": "24.38", + "kaia": "0.214223", + "kroma": "3453.7", + "linea": "3453.7", + "lisk": "3453.7", + "lukso": "2.3", + "lumia": "1.43", + "lumiaprism": "1.33", + "mantapacific": "3453.7", + "mantle": "1.29", + "merlin": "96755", + "metal": "3453.7", + "metis": "44.5", + "mint": "3453.7", + "mode": "3453.7", + "molten": "0.818007", + "moonbeam": "0.246699", + "morph": "3453.7", + "neutron": "0.378078", + "oortmainnet": "0.151246", + "optimism": "3453.7", + "orderly": "3453.7", + "osmosis": "0.5229", + "polygon": "0.481248", + "polygonzkevm": "3453.7", + "polynomialfi": "3453.7", + "prom": "5.83", + "proofofplay": "3453.7", + "rarichain": "3453.7", + "real": "3453.7", + "redstone": "3453.7", + "rivalz": "3453.7", + "rootstockmainnet": "96769", + "sanko": "40.86", + "scroll": "3453.7", + "sei": "0.433317", + "shibarium": "0.474022", + "snaxchain": "3453.7", + "solanamainnet": "206.56", + "soneium": "3453.7", + "sonic": "0.71528", + "soon": "3453.7", + "stride": "0.604988", + "superseed": "3453.7", + "superpositionmainnet": "3453.7", + "swell": "3453.7", + "taiko": "3453.7", "tangle": "1", - "telos": "0.300906", - "treasure": "0.535464", - "unichain": "3862.21", - "vana": "17.77", - "viction": "0.43386", - "worldchain": "3862.21", - "xai": "0.292813", - "xlayer": "51.34", - "zeronetwork": "3862.21", - "zetachain": "0.672943", - "zircuit": "3862.21", - "zklink": "3862.21", - "zksync": "3862.21", - "zoramainnet": "3862.21" + "telos": "0.226868", + "torus": "1", + "treasure": "0.556455", + "unichain": "3453.7", + "vana": "15.95", + "viction": "0.409674", + "worldchain": "3453.7", + "xai": "0.24081", + "xlayer": "49.04", + "zeronetwork": "3453.7", + "zetachain": "0.590199", + "zircuit": "3453.7", + "zklink": "3453.7", + "zksync": "3453.7", + "zoramainnet": "3453.7" } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 8cf8b1877d..7a909d3011 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -1408,5 +1408,16 @@ export const validatorChainConfig = ( // 'fractal', // ), // }, + + torus: { + interval: 5, + reorgPeriod: getReorgPeriod('torus'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x96982a325c28a842bc8cf61b63000737bb9f1f7d'], + }, + 'torus', + ), + }, }; }; diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 8a942db417..a9ca34b888 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -1821,6 +1821,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + torus: { + threshold: 1, + validators: [ + { + address: '0x96982a325c28a842bc8cf61b63000737bb9f1f7d', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + treasure: { threshold: 3, validators: [ From 335f57da380a58f2dbf354064d14772510c24e30 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 8 Jan 2025 18:45:46 +0000 Subject: [PATCH 35/81] fix(infra): ensure all supported chains per env have owners (#5125) ### Description fix(infra): ensure all supported chains per env have owners - add test - add missing chains ### Drive-by changes ### Related issues ### Backward compatibility ### Testing yarn test - tried with + without fix and observed that it correctly fails without the additional chains being added --- .../infra/config/environments/mainnet3/owners.ts | 3 +++ .../infra/config/environments/testnet4/owners.ts | 6 ++++++ typescript/infra/test/environment.test.ts | 16 ++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 typescript/infra/test/environment.test.ts diff --git a/typescript/infra/config/environments/mainnet3/owners.ts b/typescript/infra/config/environments/mainnet3/owners.ts index 01fe1e84b5..27d3d5915c 100644 --- a/typescript/infra/config/environments/mainnet3/owners.ts +++ b/typescript/infra/config/environments/mainnet3/owners.ts @@ -243,4 +243,7 @@ export const chainOwners: ChainMap = { osmosis: { owner: 'n/a - nothing owned here', }, + soon: { + owner: 'n/a - nothing owned here', + }, }; diff --git a/typescript/infra/config/environments/testnet4/owners.ts b/typescript/infra/config/environments/testnet4/owners.ts index 00f3b00f96..3fb009a93c 100644 --- a/typescript/infra/config/environments/testnet4/owners.ts +++ b/typescript/infra/config/environments/testnet4/owners.ts @@ -13,4 +13,10 @@ export const owners: ChainMap = { ]), ), // [chainMetadata.solanadevnet.name]: SEALEVEL_DEPLOYER_ADDRESS, + eclipsetestnet: { + owner: 'n/a - nothing owned here', + }, + solanatestnet: { + owner: 'n/a - nothing owned here', + }, }; diff --git a/typescript/infra/test/environment.test.ts b/typescript/infra/test/environment.test.ts new file mode 100644 index 0000000000..665832a6d9 --- /dev/null +++ b/typescript/infra/test/environment.test.ts @@ -0,0 +1,16 @@ +import { expect } from 'chai'; + +import { environments } from '../config/environments/index.js'; + +describe('Environment', () => { + for (const env of Object.values(environments)) { + it(`Has owners configured for ${env.environment}`, () => { + for (const chain of env.supportedChainNames) { + expect( + env.owners[chain], + `Missing owner for chain ${chain} in environment ${env.environment}`, + ).to.not.be.undefined; + } + }); + } +}); From cd7c41308ef982e17cb8ea280e19bf025837a113 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Wed, 8 Jan 2025 13:50:15 -0500 Subject: [PATCH 36/81] fix: yaml resource exhaustion (#5127) ### Description Fixes ``` ReferenceError: Excessive alias count indicates a resource exhaustion attack ``` See https://stackoverflow.com/questions/63075256/why-does-the-npm-yaml-library-have-a-max-alias-number ### Backward compatibility Yes ### Testing Manual --- .changeset/shaggy-dolphins-wink.md | 5 +++++ typescript/cli/src/utils/files.ts | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 .changeset/shaggy-dolphins-wink.md diff --git a/.changeset/shaggy-dolphins-wink.md b/.changeset/shaggy-dolphins-wink.md new file mode 100644 index 0000000000..b79c38f33a --- /dev/null +++ b/.changeset/shaggy-dolphins-wink.md @@ -0,0 +1,5 @@ +--- +"@hyperlane-xyz/cli": patch +--- + +Fix yaml resource exhaustion diff --git a/typescript/cli/src/utils/files.ts b/typescript/cli/src/utils/files.ts index 50f56d1b77..b067963d8c 100644 --- a/typescript/cli/src/utils/files.ts +++ b/typescript/cli/src/utils/files.ts @@ -4,9 +4,12 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import { + DocumentOptions, LineCounter, + ParseOptions, + SchemaOptions, + ToJSOptions, parse, - parse as yamlParse, stringify as yamlStringify, } from 'yaml'; @@ -14,6 +17,13 @@ import { objMerge } from '@hyperlane-xyz/utils'; import { log } from '../logger.js'; +const yamlParse = ( + content: string, + options?: ParseOptions & DocumentOptions & SchemaOptions & ToJSOptions, +) => + // See stackoverflow.com/questions/63075256/why-does-the-npm-yaml-library-have-a-max-alias-number + parse(content, { maxAliasCount: -1, ...options }); + export const MAX_READ_LINE_OUTPUT = 250; export type FileFormat = 'yaml' | 'json'; @@ -250,7 +260,7 @@ export function logYamlIfUnderMaxLines( ): void { const asYamlString = yamlStringify(obj, null, margin); const lineCounter = new LineCounter(); - parse(asYamlString, { lineCounter }); + yamlParse(asYamlString, { lineCounter }); log(lineCounter.lineStarts.length < maxLines ? asYamlString : ''); } From d6ef1cd6a7134d18a87bcaa85211317e3d8c9d67 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 8 Jan 2025 19:23:14 +0000 Subject: [PATCH 37/81] =?UTF-8?q?chore:=20Revert=20"feat:=20add=20the=20#?= =?UTF-8?q?=20of=20messages=20prioritized=20in=20the=20queue=20to=20the=20?= =?UTF-8?q?h=E2=80=A6=20(#5126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit there's a memory leak caused by this, reverting for now --- rust/main/Cargo.lock | 31 +- rust/main/Cargo.toml | 1 - rust/main/agents/relayer/Cargo.toml | 3 - rust/main/agents/relayer/src/lib.rs | 3 +- rust/main/agents/relayer/src/msg/op_queue.rs | 83 +---- .../agents/relayer/src/msg/op_submitter.rs | 4 +- rust/main/agents/relayer/src/relayer.rs | 5 +- .../relayer/src/server/list_messages.rs | 1 - .../relayer/src/server/message_retry.rs | 286 ++++-------------- rust/main/agents/relayer/src/server/mod.rs | 11 +- rust/main/utils/run-locally/Cargo.toml | 1 - rust/main/utils/run-locally/src/main.rs | 5 - rust/main/utils/run-locally/src/server.rs | 55 ---- 13 files changed, 86 insertions(+), 403 deletions(-) delete mode 100644 rust/main/utils/run-locally/src/server.rs diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index 47aec03422..4f728ab69f 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -512,7 +512,6 @@ checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", - "axum-macros", "bitflags 1.3.2", "bytes", "futures-util", @@ -554,18 +553,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "axum-macros" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.86", - "quote 1.0.37", - "syn 2.0.77", -] - [[package]] name = "backtrace" version = "0.3.71" @@ -7028,9 +7015,7 @@ dependencies = [ "tokio-test", "tracing", "tracing-futures", - "tracing-test", "typetag", - "uuid 1.11.0", ] [[package]] @@ -7165,7 +7150,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.11.0", + "uuid 1.10.0", ] [[package]] @@ -7265,7 +7250,6 @@ dependencies = [ "once_cell", "regex", "relayer", - "reqwest", "ripemd", "serde", "serde_json", @@ -7765,7 +7749,7 @@ dependencies = [ "time", "tracing", "url", - "uuid 1.11.0", + "uuid 1.10.0", ] [[package]] @@ -7826,7 +7810,7 @@ dependencies = [ "sea-query-derive", "serde_json", "time", - "uuid 1.11.0", + "uuid 1.10.0", ] [[package]] @@ -7842,7 +7826,7 @@ dependencies = [ "serde_json", "sqlx", "time", - "uuid 1.11.0", + "uuid 1.10.0", ] [[package]] @@ -9142,7 +9126,7 @@ dependencies = [ "time", "tokio-stream", "url", - "uuid 1.11.0", + "uuid 1.10.0", "whoami", ] @@ -10379,11 +10363,10 @@ dependencies = [ [[package]] name = "uuid" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ - "getrandom 0.2.15", "serde", ] diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index d9fee1663f..8b1a9b58e0 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -153,7 +153,6 @@ typetag = "0.2" uint = "0.9.5" ureq = { version = "2.4", default-features = false } url = "2.3" -uuid = { version = "1.11.0", features = ["v4"] } walkdir = "2" warp = "0.3" which = "4.3" diff --git a/rust/main/agents/relayer/Cargo.toml b/rust/main/agents/relayer/Cargo.toml index fcd89da771..5a891d912c 100644 --- a/rust/main/agents/relayer/Cargo.toml +++ b/rust/main/agents/relayer/Cargo.toml @@ -44,7 +44,6 @@ tokio-metrics.workspace = true tracing-futures.workspace = true tracing.workspace = true typetag.workspace = true -uuid.workspace = true hyperlane-core = { path = "../../hyperlane-core", features = [ "agent", @@ -54,14 +53,12 @@ hyperlane-base = { path = "../../hyperlane-base", features = ["test-utils"] } hyperlane-ethereum = { path = "../../chains/hyperlane-ethereum" } [dev-dependencies] -axum = { workspace = true, features = ["macros"] } once_cell.workspace = true mockall.workspace = true tokio-test.workspace = true hyperlane-test = { path = "../../hyperlane-test" } hyperlane-base = { path = "../../hyperlane-base", features = ["test-utils"] } hyperlane-core = { path = "../../hyperlane-core", features = ["agent", "async", "test-utils"] } -tracing-test.workspace = true [features] default = ["color-eyre", "oneline-errors"] diff --git a/rust/main/agents/relayer/src/lib.rs b/rust/main/agents/relayer/src/lib.rs index 9a6e1e4147..62b896d628 100644 --- a/rust/main/agents/relayer/src/lib.rs +++ b/rust/main/agents/relayer/src/lib.rs @@ -3,9 +3,8 @@ mod msg; mod processor; mod prover; mod relayer; +mod server; mod settings; -pub mod server; - pub use msg::GAS_EXPENDITURE_LOG_MESSAGE; pub use relayer::*; diff --git a/rust/main/agents/relayer/src/msg/op_queue.rs b/rust/main/agents/relayer/src/msg/op_queue.rs index d0640bc2a3..99c9dde39f 100644 --- a/rust/main/agents/relayer/src/msg/op_queue.rs +++ b/rust/main/agents/relayer/src/msg/op_queue.rs @@ -6,7 +6,7 @@ use prometheus::{IntGauge, IntGaugeVec}; use tokio::sync::{broadcast::Receiver, Mutex}; use tracing::{debug, info, instrument}; -use crate::server::{MessageRetryRequest, MessageRetryResponse}; +use crate::settings::matching_list::MatchingList; pub type OperationPriorityQueue = Arc>>>; @@ -16,7 +16,7 @@ pub type OperationPriorityQueue = Arc>> pub struct OpQueue { metrics: IntGaugeVec, queue_metrics_label: String, - retry_receiver: Arc>>, + retry_rx: Arc>>, #[new(default)] pub queue: OperationPriorityQueue, } @@ -72,67 +72,27 @@ impl OpQueue { // The other consideration is whether to put the channel receiver in the OpQueue or in a dedicated task // that also holds an Arc to the Mutex. For simplicity, we'll put it in the OpQueue for now. let mut message_retry_requests = vec![]; - - while let Ok(retry_request) = self.retry_receiver.lock().await.try_recv() { - let uuid = retry_request.uuid.clone(); - message_retry_requests.push(( - retry_request, - MessageRetryResponse { - uuid, - evaluated: 0, - matched: 0, - }, - )); + while let Ok(message_id) = self.retry_rx.lock().await.try_recv() { + message_retry_requests.push(message_id); } - if message_retry_requests.is_empty() { return; } - let mut queue = self.queue.lock().await; - let queue_length = queue.len(); - let mut reprioritized_queue: BinaryHeap<_> = queue .drain() .map(|Reverse(mut op)| { - let matched_requests: Vec<_> = message_retry_requests - .iter_mut() - .filter_map(|(retry_req, retry_response)| { - // update retry metrics - if retry_req.pattern.op_matches(&op) { - debug!(uuid = retry_req.uuid, "Matched request"); - retry_response.matched += 1; - Some(retry_req.uuid.clone()) - } else { - None - } - }) - .collect(); - - if !matched_requests.is_empty() { + if message_retry_requests.iter().any(|r| r.op_matches(&op)) { info!( operation = %op, queue_label = %self.queue_metrics_label, "Retrying OpQueue operation" ); - op.reset_attempts(); + op.reset_attempts() } Reverse(op) }) .collect(); - - for (retry_req, mut retry_response) in message_retry_requests { - retry_response.evaluated = queue_length; - tracing::debug!( - uuid = retry_response.uuid, - evaluated = retry_response.evaluated, - matched = retry_response.matched, - "Sending relayer retry response back" - ); - if let Err(err) = retry_req.transmitter.send(retry_response).await { - tracing::error!(?err, "Failed to send retry response"); - } - } queue.append(&mut reprioritized_queue); } @@ -155,10 +115,7 @@ impl OpQueue { #[cfg(test)] pub mod test { - use crate::{server::ENDPOINT_MESSAGES_QUEUE_SIZE, settings::matching_list::MatchingList}; - use super::*; - use hyperlane_core::{ HyperlaneDomain, HyperlaneDomainProtocol, HyperlaneDomainTechnicalStack, HyperlaneDomainType, HyperlaneMessage, KnownHyperlaneDomain, PendingOperationResult, @@ -170,7 +127,7 @@ pub mod test { str::FromStr, time::{Duration, Instant}, }; - use tokio::sync::{self, mpsc}; + use tokio::sync; #[derive(Debug, Clone, Serialize)] pub struct MockPendingOperation { @@ -363,7 +320,6 @@ pub mod test { async fn test_multiple_op_queues_message_id() { let (metrics, queue_metrics_label) = dummy_metrics_and_label(); let broadcaster = sync::broadcast::Sender::new(100); - let mut op_queue_1 = OpQueue::new( metrics.clone(), queue_metrics_label.clone(), @@ -408,22 +364,12 @@ pub mod test { .await; } - let (transmitter, _receiver) = mpsc::channel(ENDPOINT_MESSAGES_QUEUE_SIZE); - // Retry by message ids broadcaster - .send(MessageRetryRequest { - uuid: "0e92ace7-ba5d-4a1f-8501-51b6d9d500cf".to_string(), - pattern: MatchingList::with_message_id(op_ids[1]), - transmitter: transmitter.clone(), - }) + .send(MatchingList::with_message_id(op_ids[1])) .unwrap(); broadcaster - .send(MessageRetryRequest { - uuid: "59400966-e7fa-4fb9-9372-9a671d4392c3".to_string(), - pattern: MatchingList::with_message_id(op_ids[2]), - transmitter, - }) + .send(MatchingList::with_message_id(op_ids[2])) .unwrap(); // Pop elements from queue 1 @@ -453,7 +399,6 @@ pub mod test { async fn test_destination_domain() { let (metrics, queue_metrics_label) = dummy_metrics_and_label(); let broadcaster = sync::broadcast::Sender::new(100); - let mut op_queue = OpQueue::new( metrics.clone(), queue_metrics_label.clone(), @@ -480,15 +425,11 @@ pub mod test { .await; } - let (transmitter, _receiver) = mpsc::channel(ENDPOINT_MESSAGES_QUEUE_SIZE); - // Retry by domain broadcaster - .send(MessageRetryRequest { - uuid: "a5b39473-7cc5-48a1-8bed-565454ba1037".to_string(), - pattern: MatchingList::with_destination_domain(destination_domain_2.id()), - transmitter, - }) + .send(MatchingList::with_destination_domain( + destination_domain_2.id(), + )) .unwrap(); // Pop elements from queue diff --git a/rust/main/agents/relayer/src/msg/op_submitter.rs b/rust/main/agents/relayer/src/msg/op_submitter.rs index f35a991c45..c1e295a24a 100644 --- a/rust/main/agents/relayer/src/msg/op_submitter.rs +++ b/rust/main/agents/relayer/src/msg/op_submitter.rs @@ -32,7 +32,7 @@ use hyperlane_core::{ }; use crate::msg::pending_message::CONFIRM_DELAY; -use crate::server::MessageRetryRequest; +use crate::settings::matching_list::MatchingList; use super::op_queue::OpQueue; use super::op_queue::OperationPriorityQueue; @@ -105,7 +105,7 @@ impl SerialSubmitter { pub fn new( domain: HyperlaneDomain, rx: mpsc::UnboundedReceiver, - retry_op_transmitter: Sender, + retry_op_transmitter: Sender, metrics: SerialSubmitterMetrics, max_batch_size: u32, task_monitor: TaskMonitor, diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index 4c3d8d33bb..b1f013b6ae 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -318,11 +318,10 @@ impl BaseAgent for Relayer { })); tasks.push(console_server.instrument(info_span!("Tokio console server"))); } - let sender = BroadcastSender::new(ENDPOINT_MESSAGES_QUEUE_SIZE); + let sender = BroadcastSender::::new(ENDPOINT_MESSAGES_QUEUE_SIZE); // send channels by destination chain let mut send_channels = HashMap::with_capacity(self.destination_chains.len()); let mut prep_queues = HashMap::with_capacity(self.destination_chains.len()); - for (dest_domain, dest_conf) in &self.destination_chains { let (send_channel, receive_channel) = mpsc::unbounded_channel::(); send_channels.insert(dest_domain.id(), send_channel); @@ -386,7 +385,7 @@ impl BaseAgent for Relayer { ); } // run server - let custom_routes = relayer_server::Server::new(self.origin_chains.len()) + let custom_routes = relayer_server::Server::new() .with_op_retry(sender.clone()) .with_message_queue(prep_queues) .routes(); diff --git a/rust/main/agents/relayer/src/server/list_messages.rs b/rust/main/agents/relayer/src/server/list_messages.rs index f6c92ba088..e21f39a5df 100644 --- a/rust/main/agents/relayer/src/server/list_messages.rs +++ b/rust/main/agents/relayer/src/server/list_messages.rs @@ -97,7 +97,6 @@ mod tests { fn setup_test_server() -> (SocketAddr, OperationPriorityQueue) { let (metrics, queue_metrics_label) = dummy_metrics_and_label(); let broadcaster = sync::broadcast::Sender::new(100); - let op_queue = OpQueue::new( metrics.clone(), queue_metrics_label.clone(), diff --git a/rust/main/agents/relayer/src/server/message_retry.rs b/rust/main/agents/relayer/src/server/message_retry.rs index 255614b43e..6d160355a5 100644 --- a/rust/main/agents/relayer/src/server/message_retry.rs +++ b/rust/main/agents/relayer/src/server/message_retry.rs @@ -1,89 +1,32 @@ use crate::settings::matching_list::MatchingList; - use axum::{extract::State, routing, Json, Router}; - use derive_new::new; -use serde::{Deserialize, Serialize}; -use tokio::sync::{broadcast::Sender, mpsc}; +use tokio::sync::broadcast::Sender; const MESSAGE_RETRY_API_BASE: &str = "/message_retry"; -#[derive(Clone, Debug, new)] +#[derive(new, Clone)] pub struct MessageRetryApi { - retry_request_transmitter: Sender, - relayer_chains: usize, -} - -#[derive(Clone, Debug)] -pub struct MessageRetryRequest { - pub uuid: String, - pub pattern: MatchingList, - pub transmitter: mpsc::Sender, -} - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -pub struct MessageRetryResponse { - /// ID of the retry request - pub uuid: String, - /// how many pending operations were evaluated - pub evaluated: usize, - /// how many of the pending operations matched the retry request pattern - pub matched: u64, + tx: Sender, } async fn retry_message( - State(state): State, + State(tx): State>, Json(retry_req_payload): Json, -) -> Result, String> { - let uuid = uuid::Uuid::new_v4(); - let uuid_string = uuid.to_string(); - - tracing::debug!(uuid = uuid_string, "Sending message retry request"); - - // This channel is only created to service this single - // retry request so we're expecting a single response - // from each transmitter end, hence we are using a channel of size 1 - let (transmitter, mut receiver) = mpsc::channel(state.relayer_chains); - state - .retry_request_transmitter - .send(MessageRetryRequest { - uuid: uuid_string.clone(), - pattern: retry_req_payload, - transmitter, - }) - .map_err(|err| { - // Technically it's bad practice to print the error message to the user, but - // this endpoint is for debugging purposes only. - format!("Failed to send retry request to the queue: {}", err) - })?; - - let mut resp = MessageRetryResponse { - uuid: uuid_string, - evaluated: 0, - matched: 0, - }; - - // Wait for responses from relayer - tracing::debug!(uuid = resp.uuid, "Waiting for response from relayer"); - while let Some(relayer_resp) = receiver.recv().await { - tracing::debug!( - uuid = resp.uuid, - evaluated = resp.evaluated, - matched = resp.matched, - "Submitter response to retry request" - ); - resp.evaluated += relayer_resp.evaluated; - resp.matched += relayer_resp.matched; +) -> String { + match tx.send(retry_req_payload) { + Ok(_) => "Moved message(s) to the front of the queue".to_string(), + // Technically it's bad practice to print the error message to the user, but + // this endpoint is for debugging purposes only. + Err(err) => format!("Failed to send retry request to the queue: {}", err), } - - Ok(Json(resp)) } impl MessageRetryApi { pub fn router(&self) -> Router { Router::new() .route("/", routing::post(retry_message)) - .with_state(self.clone()) + .with_state(self.tx.clone()) } pub fn get_route(&self) -> (&'static str, Router) { @@ -98,21 +41,13 @@ mod tests { use super::*; use axum::http::StatusCode; use hyperlane_core::{HyperlaneMessage, QueueOperation}; - use serde::de::DeserializeOwned; use serde_json::json; use std::net::SocketAddr; use tokio::sync::broadcast::{Receiver, Sender}; - #[derive(Debug)] - struct TestServerSetup { - pub socket_address: SocketAddr, - pub retry_req_rx: Receiver, - } - - fn setup_test_server() -> TestServerSetup { - let broadcast_tx = Sender::new(ENDPOINT_MESSAGES_QUEUE_SIZE); - - let message_retry_api = MessageRetryApi::new(broadcast_tx.clone(), 10); + fn setup_test_server() -> (SocketAddr, Receiver) { + let broadcast_tx = Sender::::new(ENDPOINT_MESSAGES_QUEUE_SIZE); + let message_retry_api = MessageRetryApi::new(broadcast_tx.clone()); let (path, retry_router) = message_retry_api.get_route(); let app = Router::new().nest(path, retry_router); @@ -123,51 +58,12 @@ mod tests { let addr = server.local_addr(); tokio::spawn(server); - let retry_req_rx = broadcast_tx.subscribe(); - - TestServerSetup { - socket_address: addr, - retry_req_rx, - } - } - - async fn send_retry_responses_future( - mut retry_request_receiver: Receiver, - pending_operations: Vec, - metrics: Vec<(usize, u64)>, - ) { - if let Ok(req) = retry_request_receiver.recv().await { - for (op, (evaluated, matched)) in pending_operations.iter().zip(metrics) { - // Check that the list received by the server matches the pending operation - assert!(req.pattern.op_matches(&op)); - let resp = MessageRetryResponse { - uuid: req.uuid.clone(), - evaluated, - matched, - }; - req.transmitter.send(resp).await.unwrap(); - } - } + (addr, broadcast_tx.subscribe()) } - async fn parse_response_to_json(response: reqwest::Response) -> T { - let resp_body = response - .text() - .await - .expect("Failed to parse response body"); - let resp_json: T = - serde_json::from_str(&resp_body).expect("Failed to deserialize response body"); - resp_json - } - - #[tracing_test::traced_test] #[tokio::test] async fn test_message_id_retry() { - let TestServerSetup { - socket_address: addr, - retry_req_rx, - .. - } = setup_test_server(); + let (addr, mut rx) = setup_test_server(); let client = reqwest::Client::new(); // Create a random message with a random message ID @@ -179,37 +75,25 @@ mod tests { } ]); - // spawn a task to respond to message retry request - let respond_task = send_retry_responses_future( - retry_req_rx, - vec![Box::new(pending_operation.clone()) as QueueOperation], - vec![(1, 1)], - ); - // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send(); - - let (_t1, response_res) = tokio::join!(respond_task, response); + .send() + .await + .unwrap(); - let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let resp_json: MessageRetryResponse = parse_response_to_json(response).await; - assert_eq!(resp_json.evaluated, 1); - assert_eq!(resp_json.matched, 1); + let list = rx.try_recv().unwrap(); + // Check that the list received by the server matches the pending operation + assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); } #[tokio::test] async fn test_destination_domain_retry() { - let TestServerSetup { - socket_address: addr, - retry_req_rx, - .. - } = setup_test_server(); + let (addr, mut rx) = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage { @@ -224,37 +108,25 @@ mod tests { } ]); - // spawn a task to respond to message retry request - let respond_task = send_retry_responses_future( - retry_req_rx, - vec![Box::new(pending_operation.clone()) as QueueOperation], - vec![(1, 1)], - ); - // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send(); - - let (_t1, response_res) = tokio::join!(respond_task, response); + .send() + .await + .unwrap(); - let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let resp_json: MessageRetryResponse = parse_response_to_json(response).await; - assert_eq!(resp_json.evaluated, 1); - assert_eq!(resp_json.matched, 1); + let list = rx.try_recv().unwrap(); + // Check that the list received by the server matches the pending operation + assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); } #[tokio::test] async fn test_origin_domain_retry() { - let TestServerSetup { - socket_address: addr, - retry_req_rx, - .. - } = setup_test_server(); + let (addr, mut rx) = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage { @@ -269,37 +141,25 @@ mod tests { } ]); - // spawn a task to respond to message retry request - let respond_task = send_retry_responses_future( - retry_req_rx, - vec![Box::new(pending_operation.clone()) as QueueOperation], - vec![(1, 1)], - ); - // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send(); - - let (_t1, response_res) = tokio::join!(respond_task, response); + .send() + .await + .unwrap(); - let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let resp_json: MessageRetryResponse = parse_response_to_json(response).await; - assert_eq!(resp_json.evaluated, 1); - assert_eq!(resp_json.matched, 1); + let list = rx.try_recv().unwrap(); + // Check that the list received by the server matches the pending operation + assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); } #[tokio::test] async fn test_sender_address_retry() { - let TestServerSetup { - socket_address: addr, - retry_req_rx, - .. - } = setup_test_server(); + let (addr, mut rx) = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage::default(); @@ -310,37 +170,25 @@ mod tests { } ]); - // spawn a task to respond to message retry request - let respond_task = send_retry_responses_future( - retry_req_rx, - vec![Box::new(pending_operation.clone()) as QueueOperation], - vec![(1, 1)], - ); - // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send(); - - let (_t1, response_res) = tokio::join!(respond_task, response); + .send() + .await + .unwrap(); - let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let resp_json: MessageRetryResponse = parse_response_to_json(response).await; - assert_eq!(resp_json.evaluated, 1); - assert_eq!(resp_json.matched, 1); + let list = rx.try_recv().unwrap(); + // Check that the list received by the server matches the pending operation + assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); } #[tokio::test] async fn test_recipient_address_retry() { - let TestServerSetup { - socket_address: addr, - retry_req_rx, - .. - } = setup_test_server(); + let (addr, mut rx) = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage::default(); @@ -351,37 +199,25 @@ mod tests { } ]); - // spawn a task to respond to message retry request - let respond_task = send_retry_responses_future( - retry_req_rx, - vec![Box::new(pending_operation.clone()) as QueueOperation], - vec![(1, 1)], - ); - // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send(); - - let (_t1, response_res) = tokio::join!(respond_task, response); + .send() + .await + .unwrap(); - let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let resp_json: MessageRetryResponse = parse_response_to_json(response).await; - assert_eq!(resp_json.evaluated, 1); - assert_eq!(resp_json.matched, 1); + let list = rx.try_recv().unwrap(); + // Check that the list received by the server matches the pending operation + assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); } #[tokio::test] async fn test_multiple_retry() { - let TestServerSetup { - socket_address: addr, - retry_req_rx, - .. - } = setup_test_server(); + let (addr, mut rx) = setup_test_server(); let client = reqwest::Client::new(); let message = HyperlaneMessage { @@ -402,27 +238,19 @@ mod tests { } ]); - // spawn a task to respond to message retry request - let respond_task = send_retry_responses_future( - retry_req_rx, - vec![Box::new(pending_operation.clone()) as QueueOperation], - vec![(1, 1)], - ); - // Send a POST request to the server let response = client .post(format!("http://{}{}", addr, MESSAGE_RETRY_API_BASE)) .json(&matching_list_body) // Set the request body - .send(); - - let (_t1, response_res) = tokio::join!(respond_task, response); + .send() + .await + .unwrap(); - let response = response_res.unwrap(); // Check that the response status code is OK assert_eq!(response.status(), StatusCode::OK); - let resp_json: MessageRetryResponse = parse_response_to_json(response).await; - assert_eq!(resp_json.evaluated, 1); - assert_eq!(resp_json.matched, 1); + let list = rx.try_recv().unwrap(); + // Check that the list received by the server matches the pending operation + assert!(list.op_matches(&(Box::new(pending_operation) as QueueOperation))); } } diff --git a/rust/main/agents/relayer/src/server/mod.rs b/rust/main/agents/relayer/src/server/mod.rs index 8cc49a3f25..083f8d94d2 100644 --- a/rust/main/agents/relayer/src/server/mod.rs +++ b/rust/main/agents/relayer/src/server/mod.rs @@ -3,7 +3,7 @@ use derive_new::new; use std::collections::HashMap; use tokio::sync::broadcast::Sender; -use crate::msg::op_queue::OperationPriorityQueue; +use crate::{msg::op_queue::OperationPriorityQueue, settings::matching_list::MatchingList}; pub const ENDPOINT_MESSAGES_QUEUE_SIZE: usize = 100; @@ -15,15 +15,14 @@ mod message_retry; #[derive(new)] pub struct Server { - relayer_chains: usize, #[new(default)] - retry_transmitter: Option>, + retry_transmitter: Option>, #[new(default)] op_queues: Option>, } impl Server { - pub fn with_op_retry(mut self, transmitter: Sender) -> Self { + pub fn with_op_retry(mut self, transmitter: Sender) -> Self { self.retry_transmitter = Some(transmitter); self } @@ -37,8 +36,8 @@ impl Server { /// Can be extended with additional routes and feature flags to enable/disable individually. pub fn routes(self) -> Vec<(&'static str, Router)> { let mut routes = vec![]; - if let Some(tx) = self.retry_transmitter { - routes.push(MessageRetryApi::new(tx, self.relayer_chains).get_route()); + if let Some(retry_transmitter) = self.retry_transmitter { + routes.push(MessageRetryApi::new(retry_transmitter).get_route()); } if let Some(op_queues) = self.op_queues { routes.push(ListOperationsApi::new(op_queues).get_route()); diff --git a/rust/main/utils/run-locally/Cargo.toml b/rust/main/utils/run-locally/Cargo.toml index a994324687..9dedae9cea 100644 --- a/rust/main/utils/run-locally/Cargo.toml +++ b/rust/main/utils/run-locally/Cargo.toml @@ -14,7 +14,6 @@ hyperlane-cosmos = { path = "../../chains/hyperlane-cosmos" } toml_edit.workspace = true k256.workspace = true jobserver.workspace = true -reqwest.workspace = true ripemd.workspace = true sha2.workspace = true serde.workspace = true diff --git a/rust/main/utils/run-locally/src/main.rs b/rust/main/utils/run-locally/src/main.rs index 8855a08d86..4686c15446 100644 --- a/rust/main/utils/run-locally/src/main.rs +++ b/rust/main/utils/run-locally/src/main.rs @@ -51,7 +51,6 @@ mod invariants; mod logging; mod metrics; mod program; -mod server; mod solana; mod utils; @@ -484,10 +483,6 @@ fn main() -> ExitCode { // give things a chance to fully start. sleep(Duration::from_secs(10)); - // test retry request - let resp = server::run_retry_request().expect("Failed to process retry request"); - assert!(resp.matched > 0); - if !post_startup_invariants(&checkpoints_dirs) { log!("Failure: Post startup invariants are not met"); return report_test_result(true); diff --git a/rust/main/utils/run-locally/src/server.rs b/rust/main/utils/run-locally/src/server.rs deleted file mode 100644 index 4df7df78f0..0000000000 --- a/rust/main/utils/run-locally/src/server.rs +++ /dev/null @@ -1,55 +0,0 @@ -use std::io; - -use reqwest::Url; - -use relayer::server::MessageRetryResponse; - -use crate::RELAYER_METRICS_PORT; - -/// create tokio runtime to send a retry request to -/// relayer to retry all existing messages in the queues -pub fn run_retry_request() -> io::Result { - let runtime = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build(); - runtime - .unwrap() - .block_on(async { call_retry_request().await }) -} - -/// sends a request to relayer to retry all existing messages -/// in the queues -async fn call_retry_request() -> io::Result { - let client = reqwest::Client::new(); - - let url = Url::parse(&format!( - "http://0.0.0.0:{RELAYER_METRICS_PORT}/message_retry" - )) - .map_err(|err| { - eprintln!("Failed to parse url: {err}"); - io::Error::new(io::ErrorKind::InvalidInput, err.to_string()) - })?; - - let body = vec![serde_json::json!({ - "message_id": "*" - })]; - let retry_response = client.post(url).json(&body).send().await.map_err(|err| { - eprintln!("Failed to send request: {err}"); - io::Error::new(io::ErrorKind::InvalidData, err.to_string()) - })?; - - let response_text = retry_response.text().await.map_err(|err| { - eprintln!("Failed to parse response body: {err}"); - io::Error::new(io::ErrorKind::InvalidData, err.to_string()) - })?; - - println!("Retry Request Response: {:?}", response_text); - - let response_json: MessageRetryResponse = - serde_json::from_str(&response_text).map_err(|err| { - eprintln!("Failed to parse response body to json: {err}"); - io::Error::new(io::ErrorKind::InvalidData, err.to_string()) - })?; - - Ok(response_json) -} From 286b4de9342015bc022834694d1db1cdb8a41451 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 19:29:08 +0000 Subject: [PATCH 38/81] Version Packages (#4972) This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @hyperlane-xyz/sdk@8.0.0 ### Major Changes - 26fbec8f6: Rename TokenConfig related types and utilities for clarity. E.g. `CollateralConfig` to `CollateralTokenConfig`. Export more config types and zod schemas ### Minor Changes - fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 - 9f6b8c514: Allow self-relaying of all messages if there are multiple in a given dispatch transaction. - 82cebabe4: Call google storage API directly and remove @google-cloud/storage dependency from the SDK. - 95cc9571e: Deploy to new chains: arthera, aurora, conflux, conwai, corn, evmos, form, ink, rivalz, soneium, sonic, telos. - c690ca82f: Deploy to torus. - e9911bb9d: Added new Sealevel tx submission and priority fee oracle params to agent config types ### Patch Changes - 472b34670: Bump registry version to v6.3.0. - 71aefa03e: export BaseMetadataBuilder - 5942e9cff: Update default validator sets for alephzeroevmmainnet, appchain, lisk, lumiaprism, swell, treasure, vana, zklink. - de1190656: Export TOKEN_STANDARD_TO_PROVIDER_TYPE, XERC20_STANDARDS, and MINT_LIMITED_STANDARDS maps - Updated dependencies [79f8197f3] - Updated dependencies [0eb8d52a4] - Updated dependencies [8834a8c92] - @hyperlane-xyz/utils@8.0.0 - @hyperlane-xyz/core@5.9.0 ## @hyperlane-xyz/core@5.9.0 ### Minor Changes - 0eb8d52a4: Made releaseValueToRecipient internal ### Patch Changes - Updated dependencies [79f8197f3] - Updated dependencies [8834a8c92] - @hyperlane-xyz/utils@8.0.0 ## @hyperlane-xyz/cli@8.0.0 ### Minor Changes - fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 - bb44f9b51: Add support for deploying Hooks using a HookConfig within a WarpConfig - c2ca8490d: fix signer strategy init for broken cli commands - 9f6b8c514: Allow self-relaying of all messages if there are multiple in a given dispatch transaction. - 3c4bc1cca: Update hyperlane warp send to send a round trip transfer to all chains in WarpCoreConfig, if --origin and/or --destination is not provided. - 79f8197f3: Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management - a5ece3b30: Add chain technical stack selector with Arbitrum Nitro support to `hyperlane registry init` command - d35502fa7: Update single chain selection to be searchable instead of a simple select ### Patch Changes - 472b34670: Bump registry version to v6.3.0. - 0c8372447: fix: balance check skip confirmation - 657ac9255: Suppress help on CLI failures - 9349ef73e: Fix strategy flag propagation - cd7c41308: Fix yaml resource exhaustion - 98ee79c17: Added ZKSync signer support using zksync-ethers package - Updated dependencies [472b34670] - Updated dependencies [79f8197f3] - Updated dependencies [fd20bb1e9] - Updated dependencies [26fbec8f6] - Updated dependencies [71aefa03e] - Updated dependencies [9f6b8c514] - Updated dependencies [82cebabe4] - Updated dependencies [95cc9571e] - Updated dependencies [c690ca82f] - Updated dependencies [5942e9cff] - Updated dependencies [de1190656] - Updated dependencies [e9911bb9d] - Updated dependencies [8834a8c92] - @hyperlane-xyz/sdk@8.0.0 - @hyperlane-xyz/utils@8.0.0 ## @hyperlane-xyz/helloworld@8.0.0 ### Minor Changes - fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 ### Patch Changes - 472b34670: Bump registry version to v6.3.0. - Updated dependencies [472b34670] - Updated dependencies [fd20bb1e9] - Updated dependencies [26fbec8f6] - Updated dependencies [71aefa03e] - Updated dependencies [9f6b8c514] - Updated dependencies [82cebabe4] - Updated dependencies [95cc9571e] - Updated dependencies [0eb8d52a4] - Updated dependencies [c690ca82f] - Updated dependencies [5942e9cff] - Updated dependencies [de1190656] - Updated dependencies [e9911bb9d] - @hyperlane-xyz/sdk@8.0.0 - @hyperlane-xyz/core@5.9.0 ## @hyperlane-xyz/utils@8.0.0 ### Minor Changes - 79f8197f3: Added `isPrivateKeyEvm` function for validating EVM private keys ### Patch Changes - 8834a8c92: Require concurrency > 0 for concurrentMap ## @hyperlane-xyz/widgets@8.0.0 ### Minor Changes - fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 ### Patch Changes - 472b34670: Bump registry version to v6.3.0. - a2b5efbf9: Hide outline in button and text input components - e3f5a0a37: Allow empty data field in ethers5TxToWagmiTx - Updated dependencies [472b34670] - Updated dependencies [79f8197f3] - Updated dependencies [fd20bb1e9] - Updated dependencies [26fbec8f6] - Updated dependencies [71aefa03e] - Updated dependencies [9f6b8c514] - Updated dependencies [82cebabe4] - Updated dependencies [95cc9571e] - Updated dependencies [c690ca82f] - Updated dependencies [5942e9cff] - Updated dependencies [de1190656] - Updated dependencies [e9911bb9d] - Updated dependencies [8834a8c92] - @hyperlane-xyz/sdk@8.0.0 - @hyperlane-xyz/utils@8.0.0 ## @hyperlane-xyz/infra@8.0.0 ### Minor Changes - fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 - 0e83758f4: added ubtc route extension config + usdc from appchain to base ### Patch Changes - Updated dependencies [472b34670] - Updated dependencies [79f8197f3] - Updated dependencies [fd20bb1e9] - Updated dependencies [26fbec8f6] - Updated dependencies [71aefa03e] - Updated dependencies [9f6b8c514] - Updated dependencies [82cebabe4] - Updated dependencies [95cc9571e] - Updated dependencies [c690ca82f] - Updated dependencies [5942e9cff] - Updated dependencies [de1190656] - Updated dependencies [e9911bb9d] - Updated dependencies [8834a8c92] - @hyperlane-xyz/helloworld@8.0.0 - @hyperlane-xyz/sdk@8.0.0 - @hyperlane-xyz/utils@8.0.0 ## @hyperlane-xyz/ccip-server@8.0.0 ## @hyperlane-xyz/github-proxy@8.0.0 --------- Co-authored-by: github-actions[bot] --- .changeset/big-squids-serve.md | 8 ------ .changeset/chilly-balloons-rule.md | 5 ---- .changeset/dull-pianos-kiss.md | 9 ------ .changeset/empty-lemons-explode.md | 5 ---- .changeset/five-bats-attend.md | 5 ---- .changeset/fresh-fishes-bake.md | 6 ---- .changeset/happy-steaks-approve.md | 5 ---- .changeset/hot-spies-share.md | 5 ---- .changeset/long-llamas-fly.md | 5 ---- .changeset/lovely-planes-end.md | 6 ---- .changeset/lovely-snakes-cross.md | 5 ---- .changeset/many-clouds-bow.md | 5 ---- .changeset/neat-apples-marry.md | 5 ---- .changeset/new-seas-ring.md | 5 ---- .changeset/nine-eyes-smile.md | 5 ---- .changeset/pink-sloths-turn.md | 5 ---- .changeset/polite-bulldogs-sit.md | 5 ---- .changeset/selfish-shoes-sneeze.md | 5 ---- .changeset/serious-beers-lay.md | 5 ---- .changeset/shaggy-dolphins-wink.md | 5 ---- .changeset/smooth-rocks-hammer.md | 5 ---- .changeset/spicy-gifts-hear.md | 5 ---- .changeset/spotty-bees-worry.md | 5 ---- .changeset/spotty-guests-dance.md | 5 ---- .changeset/stupid-seahorses-yell.md | 5 ---- .changeset/ten-spiders-trade.md | 5 ---- .changeset/two-jeans-sin.md | 5 ---- .changeset/yellow-icons-do.md | 5 ---- solidity/CHANGELOG.md | 12 ++++++++ solidity/contracts/PackageVersioned.sol | 2 +- solidity/package.json | 4 +-- typescript/ccip-server/CHANGELOG.md | 2 ++ typescript/ccip-server/package.json | 2 +- typescript/cli/CHANGELOG.md | 37 +++++++++++++++++++++++++ typescript/cli/package.json | 6 ++-- typescript/cli/src/version.ts | 2 +- typescript/github-proxy/CHANGELOG.md | 2 ++ typescript/github-proxy/package.json | 2 +- typescript/helloworld/CHANGELOG.md | 24 ++++++++++++++++ typescript/helloworld/package.json | 6 ++-- typescript/infra/CHANGELOG.md | 26 +++++++++++++++++ typescript/infra/package.json | 8 +++--- typescript/sdk/CHANGELOG.md | 28 +++++++++++++++++++ typescript/sdk/package.json | 6 ++-- typescript/utils/CHANGELOG.md | 10 +++++++ typescript/utils/package.json | 2 +- typescript/widgets/CHANGELOG.md | 27 ++++++++++++++++++ typescript/widgets/package.json | 6 ++-- yarn.lock | 32 ++++++++++----------- 49 files changed, 207 insertions(+), 188 deletions(-) delete mode 100644 .changeset/big-squids-serve.md delete mode 100644 .changeset/chilly-balloons-rule.md delete mode 100644 .changeset/dull-pianos-kiss.md delete mode 100644 .changeset/empty-lemons-explode.md delete mode 100644 .changeset/five-bats-attend.md delete mode 100644 .changeset/fresh-fishes-bake.md delete mode 100644 .changeset/happy-steaks-approve.md delete mode 100644 .changeset/hot-spies-share.md delete mode 100644 .changeset/long-llamas-fly.md delete mode 100644 .changeset/lovely-planes-end.md delete mode 100644 .changeset/lovely-snakes-cross.md delete mode 100644 .changeset/many-clouds-bow.md delete mode 100644 .changeset/neat-apples-marry.md delete mode 100644 .changeset/new-seas-ring.md delete mode 100644 .changeset/nine-eyes-smile.md delete mode 100644 .changeset/pink-sloths-turn.md delete mode 100644 .changeset/polite-bulldogs-sit.md delete mode 100644 .changeset/selfish-shoes-sneeze.md delete mode 100644 .changeset/serious-beers-lay.md delete mode 100644 .changeset/shaggy-dolphins-wink.md delete mode 100644 .changeset/smooth-rocks-hammer.md delete mode 100644 .changeset/spicy-gifts-hear.md delete mode 100644 .changeset/spotty-bees-worry.md delete mode 100644 .changeset/spotty-guests-dance.md delete mode 100644 .changeset/stupid-seahorses-yell.md delete mode 100644 .changeset/ten-spiders-trade.md delete mode 100644 .changeset/two-jeans-sin.md delete mode 100644 .changeset/yellow-icons-do.md diff --git a/.changeset/big-squids-serve.md b/.changeset/big-squids-serve.md deleted file mode 100644 index 18883a8e60..0000000000 --- a/.changeset/big-squids-serve.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@hyperlane-xyz/helloworld': patch -'@hyperlane-xyz/widgets': patch -'@hyperlane-xyz/cli': patch -'@hyperlane-xyz/sdk': patch ---- - -Bump registry version to v6.3.0. diff --git a/.changeset/chilly-balloons-rule.md b/.changeset/chilly-balloons-rule.md deleted file mode 100644 index b339b75699..0000000000 --- a/.changeset/chilly-balloons-rule.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/utils': minor ---- - -Added `isPrivateKeyEvm` function for validating EVM private keys diff --git a/.changeset/dull-pianos-kiss.md b/.changeset/dull-pianos-kiss.md deleted file mode 100644 index 333a748904..0000000000 --- a/.changeset/dull-pianos-kiss.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@hyperlane-xyz/helloworld': minor -'@hyperlane-xyz/widgets': minor -'@hyperlane-xyz/infra': minor -'@hyperlane-xyz/cli': minor -'@hyperlane-xyz/sdk': minor ---- - -Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 diff --git a/.changeset/empty-lemons-explode.md b/.changeset/empty-lemons-explode.md deleted file mode 100644 index 1116888e23..0000000000 --- a/.changeset/empty-lemons-explode.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Add support for deploying Hooks using a HookConfig within a WarpConfig diff --git a/.changeset/five-bats-attend.md b/.changeset/five-bats-attend.md deleted file mode 100644 index 02a7c986bb..0000000000 --- a/.changeset/five-bats-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': patch ---- - -fix: balance check skip confirmation diff --git a/.changeset/fresh-fishes-bake.md b/.changeset/fresh-fishes-bake.md deleted file mode 100644 index 92b4dfdd2d..0000000000 --- a/.changeset/fresh-fishes-bake.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperlane-xyz/sdk': major ---- - -Rename TokenConfig related types and utilities for clarity. E.g. `CollateralConfig` to `CollateralTokenConfig`. -Export more config types and zod schemas diff --git a/.changeset/happy-steaks-approve.md b/.changeset/happy-steaks-approve.md deleted file mode 100644 index dc1df18b82..0000000000 --- a/.changeset/happy-steaks-approve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': patch ---- - -export BaseMetadataBuilder diff --git a/.changeset/hot-spies-share.md b/.changeset/hot-spies-share.md deleted file mode 100644 index 4a215ae53c..0000000000 --- a/.changeset/hot-spies-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -fix signer strategy init for broken cli commands diff --git a/.changeset/long-llamas-fly.md b/.changeset/long-llamas-fly.md deleted file mode 100644 index f9da56dd0f..0000000000 --- a/.changeset/long-llamas-fly.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': patch ---- - -Suppress help on CLI failures diff --git a/.changeset/lovely-planes-end.md b/.changeset/lovely-planes-end.md deleted file mode 100644 index 81bd6a8598..0000000000 --- a/.changeset/lovely-planes-end.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor -'@hyperlane-xyz/sdk': minor ---- - -Allow self-relaying of all messages if there are multiple in a given dispatch transaction. diff --git a/.changeset/lovely-snakes-cross.md b/.changeset/lovely-snakes-cross.md deleted file mode 100644 index 924c55e7de..0000000000 --- a/.changeset/lovely-snakes-cross.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Update hyperlane warp send to send a round trip transfer to all chains in WarpCoreConfig, if --origin and/or --destination is not provided. diff --git a/.changeset/many-clouds-bow.md b/.changeset/many-clouds-bow.md deleted file mode 100644 index b481b543ff..0000000000 --- a/.changeset/many-clouds-bow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Call google storage API directly and remove @google-cloud/storage dependency from the SDK. diff --git a/.changeset/neat-apples-marry.md b/.changeset/neat-apples-marry.md deleted file mode 100644 index 514ac94ce8..0000000000 --- a/.changeset/neat-apples-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/infra': minor ---- - -added ubtc route extension config + usdc from appchain to base diff --git a/.changeset/new-seas-ring.md b/.changeset/new-seas-ring.md deleted file mode 100644 index a8462e4ff4..0000000000 --- a/.changeset/new-seas-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Deploy to new chains: arthera, aurora, conflux, conwai, corn, evmos, form, ink, rivalz, soneium, sonic, telos. diff --git a/.changeset/nine-eyes-smile.md b/.changeset/nine-eyes-smile.md deleted file mode 100644 index e0ae7027b5..0000000000 --- a/.changeset/nine-eyes-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/core': minor ---- - -Made releaseValueToRecipient internal diff --git a/.changeset/pink-sloths-turn.md b/.changeset/pink-sloths-turn.md deleted file mode 100644 index 9c7cf6ea56..0000000000 --- a/.changeset/pink-sloths-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/widgets': patch ---- - -Hide outline in button and text input components diff --git a/.changeset/polite-bulldogs-sit.md b/.changeset/polite-bulldogs-sit.md deleted file mode 100644 index 6c68774325..0000000000 --- a/.changeset/polite-bulldogs-sit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': patch ---- - -Fix strategy flag propagation diff --git a/.changeset/selfish-shoes-sneeze.md b/.changeset/selfish-shoes-sneeze.md deleted file mode 100644 index 5e4199dcb2..0000000000 --- a/.changeset/selfish-shoes-sneeze.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Deploy to torus. diff --git a/.changeset/serious-beers-lay.md b/.changeset/serious-beers-lay.md deleted file mode 100644 index 6f8fbffc34..0000000000 --- a/.changeset/serious-beers-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/widgets': patch ---- - -Allow empty data field in ethers5TxToWagmiTx diff --git a/.changeset/shaggy-dolphins-wink.md b/.changeset/shaggy-dolphins-wink.md deleted file mode 100644 index b79c38f33a..0000000000 --- a/.changeset/shaggy-dolphins-wink.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperlane-xyz/cli": patch ---- - -Fix yaml resource exhaustion diff --git a/.changeset/smooth-rocks-hammer.md b/.changeset/smooth-rocks-hammer.md deleted file mode 100644 index 8cc170aac9..0000000000 --- a/.changeset/smooth-rocks-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': patch ---- - -Update default validator sets for alephzeroevmmainnet, appchain, lisk, lumiaprism, swell, treasure, vana, zklink. diff --git a/.changeset/spicy-gifts-hear.md b/.changeset/spicy-gifts-hear.md deleted file mode 100644 index 37d4efa28d..0000000000 --- a/.changeset/spicy-gifts-hear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management diff --git a/.changeset/spotty-bees-worry.md b/.changeset/spotty-bees-worry.md deleted file mode 100644 index 7697c5fd9b..0000000000 --- a/.changeset/spotty-bees-worry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': patch ---- - -Export TOKEN_STANDARD_TO_PROVIDER_TYPE, XERC20_STANDARDS, and MINT_LIMITED_STANDARDS maps diff --git a/.changeset/spotty-guests-dance.md b/.changeset/spotty-guests-dance.md deleted file mode 100644 index 39eb9b0f49..0000000000 --- a/.changeset/spotty-guests-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Added new Sealevel tx submission and priority fee oracle params to agent config types diff --git a/.changeset/stupid-seahorses-yell.md b/.changeset/stupid-seahorses-yell.md deleted file mode 100644 index 61230350a4..0000000000 --- a/.changeset/stupid-seahorses-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/utils': patch ---- - -Require concurrency > 0 for concurrentMap diff --git a/.changeset/ten-spiders-trade.md b/.changeset/ten-spiders-trade.md deleted file mode 100644 index 91eebf52f7..0000000000 --- a/.changeset/ten-spiders-trade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': patch ---- - -Added ZKSync signer support using zksync-ethers package diff --git a/.changeset/two-jeans-sin.md b/.changeset/two-jeans-sin.md deleted file mode 100644 index 2cc997f9bb..0000000000 --- a/.changeset/two-jeans-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Add chain technical stack selector with Arbitrum Nitro support to `hyperlane registry init` command diff --git a/.changeset/yellow-icons-do.md b/.changeset/yellow-icons-do.md deleted file mode 100644 index c8e5a583ed..0000000000 --- a/.changeset/yellow-icons-do.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Update single chain selection to be searchable instead of a simple select diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index a0babee028..8dc9db0231 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,17 @@ # @hyperlane-xyz/core +## 5.9.0 + +### Minor Changes + +- 0eb8d52a4: Made releaseValueToRecipient internal + +### Patch Changes + +- Updated dependencies [79f8197f3] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/utils@8.0.0 + ## 5.8.3 ### Patch Changes diff --git a/solidity/contracts/PackageVersioned.sol b/solidity/contracts/PackageVersioned.sol index ced404fe92..325ac0b25a 100644 --- a/solidity/contracts/PackageVersioned.sol +++ b/solidity/contracts/PackageVersioned.sol @@ -7,5 +7,5 @@ pragma solidity >=0.6.11; **/ abstract contract PackageVersioned { // GENERATED CODE - DO NOT EDIT - string public constant PACKAGE_VERSION = "5.8.3"; + string public constant PACKAGE_VERSION = "5.9.0"; } diff --git a/solidity/package.json b/solidity/package.json index b80646bd24..91a63ccb46 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/core", "description": "Core solidity contracts for Hyperlane", - "version": "5.8.3", + "version": "5.9.0", "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/utils": "8.0.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3", diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index a259236246..9187b81069 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/ccip-server +## 8.0.0 + ## 7.3.0 ## 7.2.0 diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index 0795edf956..540b1d6a3e 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "7.3.0", + "version": "8.0.0", "description": "CCIP server", "typings": "dist/index.d.ts", "typedocMain": "src/index.ts", diff --git a/typescript/cli/CHANGELOG.md b/typescript/cli/CHANGELOG.md index a7d9962b84..460d211bf2 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,42 @@ # @hyperlane-xyz/cli +## 8.0.0 + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 +- bb44f9b51: Add support for deploying Hooks using a HookConfig within a WarpConfig +- c2ca8490d: fix signer strategy init for broken cli commands +- 9f6b8c514: Allow self-relaying of all messages if there are multiple in a given dispatch transaction. +- 3c4bc1cca: Update hyperlane warp send to send a round trip transfer to all chains in WarpCoreConfig, if --origin and/or --destination is not provided. +- 79f8197f3: Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management +- a5ece3b30: Add chain technical stack selector with Arbitrum Nitro support to `hyperlane registry init` command +- d35502fa7: Update single chain selection to be searchable instead of a simple select + +### Patch Changes + +- 472b34670: Bump registry version to v6.3.0. +- 0c8372447: fix: balance check skip confirmation +- 657ac9255: Suppress help on CLI failures +- 9349ef73e: Fix strategy flag propagation +- cd7c41308: Fix yaml resource exhaustion +- 98ee79c17: Added ZKSync signer support using zksync-ethers package +- Updated dependencies [472b34670] +- Updated dependencies [79f8197f3] +- Updated dependencies [fd20bb1e9] +- Updated dependencies [26fbec8f6] +- Updated dependencies [71aefa03e] +- Updated dependencies [9f6b8c514] +- Updated dependencies [82cebabe4] +- Updated dependencies [95cc9571e] +- Updated dependencies [c690ca82f] +- Updated dependencies [5942e9cff] +- Updated dependencies [de1190656] +- Updated dependencies [e9911bb9d] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/sdk@8.0.0 + - @hyperlane-xyz/utils@8.0.0 + ## 7.3.0 ### Minor Changes diff --git a/typescript/cli/package.json b/typescript/cli/package.json index c8f53b25df..b1796610f4 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,13 +1,13 @@ { "name": "@hyperlane-xyz/cli", - "version": "7.3.0", + "version": "8.0.0", "description": "A command-line utility for common Hyperlane operations", "dependencies": { "@aws-sdk/client-kms": "^3.577.0", "@aws-sdk/client-s3": "^3.577.0", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "7.3.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/sdk": "8.0.0", + "@hyperlane-xyz/utils": "8.0.0", "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", "@inquirer/prompts": "3.3.2", diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index af959132f7..a7df740c2d 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '7.3.0'; +export const VERSION = '8.0.0'; diff --git a/typescript/github-proxy/CHANGELOG.md b/typescript/github-proxy/CHANGELOG.md index a5237280ae..5545013903 100644 --- a/typescript/github-proxy/CHANGELOG.md +++ b/typescript/github-proxy/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/github-proxy +## 8.0.0 + ## 7.3.0 ## 7.2.0 diff --git a/typescript/github-proxy/package.json b/typescript/github-proxy/package.json index 848f3dcafc..698c9f4f0b 100644 --- a/typescript/github-proxy/package.json +++ b/typescript/github-proxy/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/github-proxy", "description": "Github proxy that adds the API key to requests", - "version": "7.3.0", + "version": "8.0.0", "private": true, "scripts": { "deploy": "wrangler deploy", diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index 89cedf4d32..08416584c7 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,29 @@ # @hyperlane-xyz/helloworld +## 8.0.0 + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 + +### Patch Changes + +- 472b34670: Bump registry version to v6.3.0. +- Updated dependencies [472b34670] +- Updated dependencies [fd20bb1e9] +- Updated dependencies [26fbec8f6] +- Updated dependencies [71aefa03e] +- Updated dependencies [9f6b8c514] +- Updated dependencies [82cebabe4] +- Updated dependencies [95cc9571e] +- Updated dependencies [0eb8d52a4] +- Updated dependencies [c690ca82f] +- Updated dependencies [5942e9cff] +- Updated dependencies [de1190656] +- Updated dependencies [e9911bb9d] + - @hyperlane-xyz/sdk@8.0.0 + - @hyperlane-xyz/core@5.9.0 + ## 7.3.0 ### Patch Changes diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 83bc100ac3..54236e1f25 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/helloworld", "description": "A basic skeleton of an Hyperlane app", - "version": "7.3.0", + "version": "8.0.0", "dependencies": { - "@hyperlane-xyz/core": "5.8.3", + "@hyperlane-xyz/core": "5.9.0", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "7.3.0", + "@hyperlane-xyz/sdk": "8.0.0", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" }, diff --git a/typescript/infra/CHANGELOG.md b/typescript/infra/CHANGELOG.md index 1e8ec17676..67b7a15642 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,31 @@ # @hyperlane-xyz/infra +## 8.0.0 + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 +- 0e83758f4: added ubtc route extension config + usdc from appchain to base + +### Patch Changes + +- Updated dependencies [472b34670] +- Updated dependencies [79f8197f3] +- Updated dependencies [fd20bb1e9] +- Updated dependencies [26fbec8f6] +- Updated dependencies [71aefa03e] +- Updated dependencies [9f6b8c514] +- Updated dependencies [82cebabe4] +- Updated dependencies [95cc9571e] +- Updated dependencies [c690ca82f] +- Updated dependencies [5942e9cff] +- Updated dependencies [de1190656] +- Updated dependencies [e9911bb9d] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/helloworld@8.0.0 + - @hyperlane-xyz/sdk@8.0.0 + - @hyperlane-xyz/utils@8.0.0 + ## 7.3.0 ### Minor Changes diff --git a/typescript/infra/package.json b/typescript/infra/package.json index a1aebb8998..07d42bd124 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/infra", "description": "Infrastructure utilities for the Hyperlane Network", - "version": "7.3.0", + "version": "8.0.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-iam": "^3.74.0", @@ -13,10 +13,10 @@ "@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/providers": "*", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "7.3.0", + "@hyperlane-xyz/helloworld": "8.0.0", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "7.3.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/sdk": "8.0.0", + "@hyperlane-xyz/utils": "8.0.0", "@inquirer/prompts": "3.3.2", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@safe-global/api-kit": "1.3.0", diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index 97f1f2a252..e5339996dc 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,33 @@ # @hyperlane-xyz/sdk +## 8.0.0 + +### Major Changes + +- 26fbec8f6: Rename TokenConfig related types and utilities for clarity. E.g. `CollateralConfig` to `CollateralTokenConfig`. + Export more config types and zod schemas + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 +- 9f6b8c514: Allow self-relaying of all messages if there are multiple in a given dispatch transaction. +- 82cebabe4: Call google storage API directly and remove @google-cloud/storage dependency from the SDK. +- 95cc9571e: Deploy to new chains: arthera, aurora, conflux, conwai, corn, evmos, form, ink, rivalz, soneium, sonic, telos. +- c690ca82f: Deploy to torus. +- e9911bb9d: Added new Sealevel tx submission and priority fee oracle params to agent config types + +### Patch Changes + +- 472b34670: Bump registry version to v6.3.0. +- 71aefa03e: export BaseMetadataBuilder +- 5942e9cff: Update default validator sets for alephzeroevmmainnet, appchain, lisk, lumiaprism, swell, treasure, vana, zklink. +- de1190656: Export TOKEN_STANDARD_TO_PROVIDER_TYPE, XERC20_STANDARDS, and MINT_LIMITED_STANDARDS maps +- Updated dependencies [79f8197f3] +- Updated dependencies [0eb8d52a4] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/utils@8.0.0 + - @hyperlane-xyz/core@5.9.0 + ## 7.3.0 ### Minor Changes diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 1c383e1839..f6cfedb947 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,15 +1,15 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "7.3.0", + "version": "8.0.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-s3": "^3.577.0", "@chain-registry/types": "^0.50.14", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@hyperlane-xyz/core": "5.8.3", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/core": "5.9.0", + "@hyperlane-xyz/utils": "8.0.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-deployments": "1.37.8", diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index 3cf2756603..1b8b3ef758 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @hyperlane-xyz/utils +## 8.0.0 + +### Minor Changes + +- 79f8197f3: Added `isPrivateKeyEvm` function for validating EVM private keys + +### Patch Changes + +- 8834a8c92: Require concurrency > 0 for concurrentMap + ## 7.3.0 ## 7.2.0 diff --git a/typescript/utils/package.json b/typescript/utils/package.json index 8b24cb7106..784886b1f7 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/utils", "description": "General utilities and types for the Hyperlane network", - "version": "7.3.0", + "version": "8.0.0", "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", diff --git a/typescript/widgets/CHANGELOG.md b/typescript/widgets/CHANGELOG.md index be73ca35c6..328d76a977 100644 --- a/typescript/widgets/CHANGELOG.md +++ b/typescript/widgets/CHANGELOG.md @@ -1,5 +1,32 @@ # @hyperlane-xyz/widgets +## 8.0.0 + +### Minor Changes + +- fd20bb1e9: Add FeeHook and Swell to pz and ez eth config generator. Bump up Registry 6.6.0 + +### Patch Changes + +- 472b34670: Bump registry version to v6.3.0. +- a2b5efbf9: Hide outline in button and text input components +- e3f5a0a37: Allow empty data field in ethers5TxToWagmiTx +- Updated dependencies [472b34670] +- Updated dependencies [79f8197f3] +- Updated dependencies [fd20bb1e9] +- Updated dependencies [26fbec8f6] +- Updated dependencies [71aefa03e] +- Updated dependencies [9f6b8c514] +- Updated dependencies [82cebabe4] +- Updated dependencies [95cc9571e] +- Updated dependencies [c690ca82f] +- Updated dependencies [5942e9cff] +- Updated dependencies [de1190656] +- Updated dependencies [e9911bb9d] +- Updated dependencies [8834a8c92] + - @hyperlane-xyz/sdk@8.0.0 + - @hyperlane-xyz/utils@8.0.0 + ## 7.3.0 ### Patch Changes diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index 701ff8ddd8..9c008450f7 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/widgets", "description": "Common react components for Hyperlane projects", - "version": "7.3.0", + "version": "8.0.0", "peerDependencies": { "react": "^18", "react-dom": "^18" @@ -9,8 +9,8 @@ "dependencies": { "@cosmos-kit/react": "^2.18.0", "@headlessui/react": "^2.1.8", - "@hyperlane-xyz/sdk": "7.3.0", - "@hyperlane-xyz/utils": "7.3.0", + "@hyperlane-xyz/sdk": "8.0.0", + "@hyperlane-xyz/utils": "8.0.0", "@interchain-ui/react": "^1.23.28", "@rainbow-me/rainbowkit": "^2.2.0", "@solana/wallet-adapter-react": "^0.15.32", diff --git a/yarn.lock b/yarn.lock index cace082811..7235f71d59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7321,8 +7321,8 @@ __metadata: "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.0.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" "@inquirer/prompts": "npm:3.3.2" @@ -7361,13 +7361,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:5.8.3, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:5.9.0, @hyperlane-xyz/core@workspace:solidity": version: 0.0.0-use.local resolution: "@hyperlane-xyz/core@workspace:solidity" dependencies: "@arbitrum/nitro-contracts": "npm:^1.2.1" "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -7418,14 +7418,14 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/helloworld@npm:7.3.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:8.0.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:5.8.3" + "@hyperlane-xyz/core": "npm:5.9.0" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.0.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -7474,10 +7474,10 @@ __metadata: "@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/providers": "npm:*" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:7.3.0" + "@hyperlane-xyz/helloworld": "npm:8.0.0" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.0.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@inquirer/prompts": "npm:3.3.2" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" @@ -7547,7 +7547,7 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:7.3.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:8.0.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: @@ -7557,8 +7557,8 @@ __metadata: "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:5.8.3" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/core": "npm:5.9.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -7601,7 +7601,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/utils@npm:7.3.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:8.0.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: @@ -7643,8 +7643,8 @@ __metadata: "@eslint/js": "npm:^9.15.0" "@headlessui/react": "npm:^2.1.8" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:7.3.0" - "@hyperlane-xyz/utils": "npm:7.3.0" + "@hyperlane-xyz/sdk": "npm:8.0.0" + "@hyperlane-xyz/utils": "npm:8.0.0" "@interchain-ui/react": "npm:^1.23.28" "@rainbow-me/rainbowkit": "npm:^2.2.0" "@solana/wallet-adapter-react": "npm:^0.15.32" From 87d4f63c713c229eb32f29f9715fab8945964ea9 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:54:18 +0000 Subject: [PATCH 39/81] chore: new relayer image (#5128) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/agent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 4737401443..29db8dcb68 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -630,7 +630,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '706f69b-20250107-230151', + tag: '286b4de-20250108-194715', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, From efc7434515c193214b4e06a4024110cddeb9051c Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:09:08 +0000 Subject: [PATCH 40/81] fix: check-warp-deploy only fetches secrets for relevant chains (#5133) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description > There's an annoying issue where if a new chain has been added to mainnet3 in main, then the warp deploy checker cronjob in k8s (which uses the latest image off main) will try to get secret endpoints for that new chain. It'll fail if we haven't done a deploy of the warp deploy checker because the GCP secrets aren't populated into k8s via external secrets, and the deploy checker doesn't have credentials to get secrets directly from GCP secrets Attempting to remedy this problem by deriving which subset of chains we care about (i.e. have warp config getters for) and only instantiating the multiprovider with these select chains. [Relevant Thread](https://discord.com/channels/935678348330434570/1242873947293356042/1326854438518001696) ### Drive-by changes ### Related issues ### Backward compatibility ### Testing ran locally ``` yarn tsx scripts/check/check-warp-deploy.ts -e mainnet3 bigint: Failed to load bindings, pure JS will be used (try npm run rebuild?) Found warp configs for chains: ethereum, ancient8, arbitrum, zircuit, inevm, neutron, optimism, base, blast, bsc, mode, linea, fraxtal, taiko, sei, swell, injective, flowmainnet, viction, lumia, mantapacific, eclipsemainnet, solanamainnet, zeronetwork, mantle, polygon, scroll, lisk, gnosis, zoramainnet, stride, appchain, boba, bsquared Checking warp route USDC/ancient8-ethereum... warp checker found no violations Checking warp route AMPHRETH/arbitrum-ethereum-zircuit... warp checker found no violations Checking warp route USDC/ethereum-inevm... warp checker found no violations Checking warp route USDT/ethereum-inevm... warp checker found no violations Checking warp route ECLIP/arbitrum-neutron... warp checker found no violations Checking warp route TIA/arbitrum-neutron... warp checker found no violations Checking warp route EZETH/arbitrum-base-blast-bsc-ethereum-fraxtal-linea-mode-optimism-sei-swell-taiko-zircuit... warp checker found no violations Checking warp route INJ/inevm-injective... warp checker found no violations Checking warp route CBBTC/ethereum-flowmainnet... warp checker found no violations Checking warp route FASTUSD/ethereum-sei... warp checker found no violations Checking warp route pumpBTCsei/ethereum-sei... ┌─────────┬────────────┬────────┬──────────────┬─────────┬─────────┬──────────────────────────────────────────────┬──────────────────────────────────────────────┐ │ (index) │ chain │ remote │ name │ type │ subType │ actual │ expected │ ├─────────┼────────────┼────────┼──────────────┼─────────┼─────────┼──────────────────────────────────────────────┼──────────────────────────────────────────────┤ │ 0 │ 'sei' │ │ 'proxyAdmin' │ 'Owner' │ │ '0xCed197FBc360C26C19889745Cf73511b71D03d5D' │ '0x14A359aE2446eaC89495b3F28b7a29cE2A17f392' │ │ 1 │ 'ethereum' │ │ 'proxyAdmin' │ 'Owner' │ │ '0x3965AC3D295641E452E0ea896a086A9cD7C6C5b6' │ '0x77A0545Dc1Dc6bAee8d9c1d436c6688a75Ae5777' │ └─────────┴────────────┴────────┴──────────────┴─────────┴─────────┴──────────────────────────────────────────────┴──────────────────────────────────────────────┘ Checking warp route ETH/ethereum-viction... warp checker found no violations Checking warp route USDC/ethereum-viction... warp checker found no violations Checking warp route USDT/ethereum-viction... warp checker found no violations Checking warp route PZETH/ethereum-swell-zircuit... warp checker found no violations Checking warp route LUMIA/bsc-ethereum-lumia... warp checker found no violations Checking warp route TIA/mantapacific-neutron... warp checker found no violations Checking warp route APXETH/eclipsemainnet-ethereum... warp checker found no violations Checking warp route USDT/eclipsemainnet-ethereum-solanamainnet... warp checker found no violations Checking warp route WBTC/eclipsemainnet-ethereum... warp checker found no violations Checking warp route weETHs/eclipsemainnet-ethereum... warp checker found no violations Checking warp route CBBTC/base-zeronetwork... warp checker found no violations Checking warp route USDT/arbitrum-ethereum-mantle-mode-polygon-scroll-zeronetwork... warp checker found no violations Checking warp route USDC/arbitrum-base-ethereum-lisk-optimism-polygon-zeronetwork... warp checker found no violations Checking warp route ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet... warp checker found no violations Checking warp route TIA/eclipsemainnet-stride... warp checker found no violations Checking warp route stTIA/eclipsemainnet-stride... warp checker found no violations Checking warp route USDC/appchain-base... warp checker found no violations Checking warp route UBTC/boba-bsquared-swell... warp checker found no violations Checking warp route Re7LRT/ethereum-zircuit... warp checker found no violations ``` Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com> --- .../infra/scripts/check/check-warp-deploy.ts | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/typescript/infra/scripts/check/check-warp-deploy.ts b/typescript/infra/scripts/check/check-warp-deploy.ts index 2cc11d8f0f..3c2e50e277 100644 --- a/typescript/infra/scripts/check/check-warp-deploy.ts +++ b/typescript/infra/scripts/check/check-warp-deploy.ts @@ -1,6 +1,9 @@ import chalk from 'chalk'; import { Gauge, Registry } from 'prom-client'; +import { ChainName } from '@hyperlane-xyz/sdk'; + +import { getWarpAddresses } from '../../config/registry.js'; import { warpConfigGetterMap } from '../../config/warp.js'; import { submitMetrics } from '../../src/utils/metrics.js'; import { Modules, getWarpRouteIdsInteractive } from '../agent-utils.js'; @@ -24,10 +27,6 @@ async function main() { interactive, } = await getCheckWarpDeployArgs().argv; - const envConfig = getEnvironmentConfig(environment); - // Get the multiprovider once to avoid recreating it for each warp route - const multiProvider = await envConfig.getMultiProvider(); - const metricsRegister = new Registry(); const checkerViolationsGauge = new Gauge( getCheckerViolationsGaugeObj(metricsRegister), @@ -41,6 +40,31 @@ async function main() { warpIdsToCheck = await getWarpRouteIdsInteractive(); } + // Determine which chains have warp configs + const chainsWithWarpConfigs = warpIdsToCheck.reduce((chains, warpRouteId) => { + const warpAddresses = getWarpAddresses(warpRouteId); + Object.keys(warpAddresses).forEach((chain) => chains.add(chain)); + return chains; + }, new Set()); + + console.log( + `Found warp configs for chains: ${Array.from(chainsWithWarpConfigs).join( + ', ', + )}`, + ); + + // Get the multiprovider once to avoid recreating it for each warp route + // We specify the chains to avoid creating a multiprovider for all chains. + // This ensures that we don't fail to fetch secrets for new chains in the cron job. + const envConfig = getEnvironmentConfig(environment); + // Use default values for context, role, and useSecrets + const multiProvider = await envConfig.getMultiProvider( + undefined, + undefined, + undefined, + Array.from(chainsWithWarpConfigs), + ); + // TODO: consider retrying this if check throws an error for (const warpRouteId of warpIdsToCheck) { console.log(`\nChecking warp route ${warpRouteId}...`); From df9c1edbdf23767537c5b9c3fd161c27016710e3 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:06:36 +0000 Subject: [PATCH 41/81] fix: more conservative polygon gas price estimates (#5134) applies fix from this ethers PR: https://github.com/hyperlane-xyz/ethers-rs/pull/30 > applies a multiplier of 1.5x to the base fee (or maxFee) and one of 1.1 to the priority fee, since the ones retrieved from the polygon api are too low --- rust/main/Cargo.lock | 20 ++++++++++---------- rust/main/Cargo.toml | 10 +++++----- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index 4f728ab69f..9045c44d15 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -2901,7 +2901,7 @@ dependencies = [ [[package]] name = "ethers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "ethers-addressbook", "ethers-contract", @@ -2915,7 +2915,7 @@ dependencies = [ [[package]] name = "ethers-addressbook" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "ethers-core", "once_cell", @@ -2926,7 +2926,7 @@ dependencies = [ [[package]] name = "ethers-contract" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -2944,7 +2944,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "Inflector", "cfg-if", @@ -2968,7 +2968,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -2982,7 +2982,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "arrayvec", "bytes", @@ -3012,7 +3012,7 @@ dependencies = [ [[package]] name = "ethers-etherscan" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "ethers-core", "getrandom 0.2.15", @@ -3028,7 +3028,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "async-trait", "auto_impl 0.5.0", @@ -3077,7 +3077,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "async-trait", "auto_impl 1.2.0", @@ -3113,7 +3113,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2024-12-30#31653ac8c54ae3fe78b91bf5d92a1ab71604d07e" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" dependencies = [ "async-trait", "coins-bip32 0.7.0", diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index 8b1a9b58e0..8d52325017 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -198,27 +198,27 @@ overflow-checks = true [workspace.dependencies.ethers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-30" +tag = "2025-01-09" [workspace.dependencies.ethers-contract] features = ["legacy"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-30" +tag = "2025-01-09" [workspace.dependencies.ethers-core] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-30" +tag = "2025-01-09" [workspace.dependencies.ethers-providers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-30" +tag = "2025-01-09" [workspace.dependencies.ethers-signers] features = ["aws"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2024-12-30" +tag = "2025-01-09" [patch.crates-io.curve25519-dalek] branch = "v3.2.2-relax-zeroize" From f3e7fd4e2717f1bb1a305520573402604ba2486d Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Thu, 9 Jan 2025 18:28:23 +0000 Subject: [PATCH 42/81] fix: Fix certificate issue for Cosmos chains (#5114) ### Description Obsolete version of cosmrs (0.14.0) complains about valid TLS certificates. It makes agents to fail to communicate to Cosmos chains via RPC. cosmrs 0.16.0 fixes the issue. Some other dependencies also were upgraded. ### Related issues - Fixes https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/5113 ### Backward compatibility Yes ### Testing E2E Cosmos tests and E2E Ethereum and Sealevel tests --------- Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> --- rust/main/Cargo.lock | 708 +++++++++++------- rust/main/Cargo.toml | 27 +- rust/main/chains/hyperlane-cosmos/Cargo.toml | 2 +- .../hyperlane-cosmos/src/interchain_gas.rs | 143 ++-- .../src/mailbox/delivery_indexer.rs | 58 +- .../src/mailbox/dispatch_indexer.rs | 68 +- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 107 +-- .../hyperlane-cosmos/src/payloads/general.rs | 8 +- .../src/providers/cosmos/provider.rs | 8 +- .../hyperlane-cosmos/src/providers/grpc.rs | 13 +- 10 files changed, 660 insertions(+), 482 deletions(-) diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index 9045c44d15..078b19fac9 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -464,6 +464,12 @@ dependencies = [ "critical-section", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -511,13 +517,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.3.4", "bitflags 1.3.2", "bytes", "futures-util", "http 0.2.12", - "http-body", - "hyper", + "http-body 0.4.6", + "hyper 0.14.30", "itoa", "matchit", "memchr", @@ -529,9 +535,36 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "tokio", - "tower", + "tower 0.4.13", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core 0.4.5", + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper 1.0.2", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -546,13 +579,33 @@ dependencies = [ "bytes", "futures-util", "http 0.2.12", - "http-body", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", "tower-service", ] +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.71" @@ -1391,7 +1444,7 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml", + "toml 0.5.11", "yaml-rust", ] @@ -1536,6 +1589,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1544,30 +1607,30 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cosmos-sdk-proto" -version = "0.19.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c9d2043a9e617b0d602fbc0a0ecd621568edbf3a9774890a6d562389bd8e1c" +checksum = "8b2f63ab112b8c8e7b8a29c891adc48f43145beb21c0bfbf562957072c1e0beb" dependencies = [ - "prost 0.11.9", - "prost-types 0.11.9", - "tendermint-proto 0.32.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tonic 0.9.2", + "prost 0.13.4", + "prost-types 0.13.4", + "tendermint-proto", + "tonic 0.12.3", ] [[package]] name = "cosmrs" -version = "0.14.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af13955d6f356272e6def9ff5e2450a7650df536d8934f47052a20c76513d2f6" +checksum = "9f21bb63ec6a903510a3d01f44735dd4914724e5eccbe409e6da6833d17c7829" dependencies = [ "cosmos-sdk-proto", "ecdsa 0.16.9", "eyre", - "getrandom 0.2.15", "k256 0.13.4", "rand_core 0.6.4", "serde", "serde_json", + "signature 2.2.0", "subtle-encoding", "tendermint", "tendermint-rpc", @@ -1855,23 +1918,14 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array 0.14.7", "subtle", ] -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct 0.6.1", -] - [[package]] name = "ctr" version = "0.9.2" @@ -2960,7 +3014,7 @@ dependencies = [ "serde", "serde_json", "syn 1.0.109", - "toml", + "toml 0.5.11", "url", "walkdir", ] @@ -3150,9 +3204,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c80c6714d1a380314fcb11a22eeff022e1e1c9642f0bb54e15dc9cb29f37b29" dependencies = [ "futures", - "hyper", - "hyper-rustls 0.24.2", - "hyper-timeout", + "hyper 0.14.30", + "hyper-rustls", + "hyper-timeout 0.4.1", "log", "pin-project", "rand 0.8.5", @@ -3388,7 +3442,7 @@ dependencies = [ "fuel-core-types", "futures", "hex 0.4.3", - "hyper-rustls 0.24.2", + "hyper-rustls", "itertools 0.12.1", "reqwest", "schemafy_lib", @@ -3999,6 +4053,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.2.0", + "indexmap 2.5.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hash32" version = "0.2.1" @@ -4207,7 +4280,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.11.1", + "crypto-mac 0.11.0", "digest 0.9.0", ] @@ -4253,9 +4326,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -4273,6 +4346,29 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.2.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "pin-project-lite", +] + [[package]] name = "httparse" version = "1.9.4" @@ -4311,9 +4407,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -4326,40 +4422,24 @@ dependencies = [ ] [[package]] -name = "hyper-proxy" -version = "0.9.1" +name = "hyper" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", - "futures", - "headers", - "http 0.2.12", - "hyper", - "hyper-rustls 0.22.1", - "rustls-native-certs 0.5.0", - "tokio", - "tokio-rustls 0.22.0", - "tower-service", - "webpki 0.21.4", -] - -[[package]] -name = "hyper-rustls" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" -dependencies = [ - "ct-logs", + "futures-channel", "futures-util", - "hyper", - "log", - "rustls 0.19.1", - "rustls-native-certs 0.5.0", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", "tokio", - "tokio-rustls 0.22.0", - "webpki 0.21.4", - "webpki-roots 0.21.1", + "want", ] [[package]] @@ -4370,7 +4450,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper", + "hyper 0.14.30", "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", @@ -4385,12 +4465,25 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.30", "pin-project-lite", "tokio", "tokio-io-timeout", ] +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.5.2", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -4398,19 +4491,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.30", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.5.2", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "hyperlane-base" version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "axum", + "axum 0.6.20", "backtrace", "backtrace-oneline", "bs58 0.5.1", @@ -4518,8 +4630,8 @@ dependencies = [ "derive-new", "futures", "hex 0.4.3", - "http 0.2.12", - "hyper", + "http 1.2.0", + "hyper 0.14.30", "hyper-tls", "hyperlane-core", "hyperlane-cosmwasm-interface", @@ -4538,7 +4650,7 @@ dependencies = [ "thiserror", "time", "tokio", - "tonic 0.9.2", + "tonic 0.12.3", "tracing", "tracing-futures", "url", @@ -4976,20 +5088,31 @@ dependencies = [ [[package]] name = "injective-std" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7a5b52d19dca05823c7e4b481d41b49c04a0e56f66a5c92396a6fdd3314710" +version = "1.13.2-hyperlane-2025-01-09-11-28" +source = "git+https://github.com/hyperlane-xyz/cw-injective.git?tag=1.13.2-hyperlane-2025-01-09-11-28#d3e5bf33f8374026e696749dd54b041a69887cbd" dependencies = [ "chrono", - "cosmwasm-std 1.5.7", - "osmosis-std-derive", - "prost 0.11.9", - "prost-types 0.11.9", + "cosmwasm-std 2.1.3", + "injective-std-derive", + "prost 0.13.4", + "prost-types 0.13.4", "schemars", "serde", "serde-cw-value", ] +[[package]] +name = "injective-std-derive" +version = "1.13.0" +source = "git+https://github.com/hyperlane-xyz/cw-injective.git?tag=1.13.2-hyperlane-2025-01-09-11-28#d3e5bf33f8374026e696749dd54b041a69887cbd" +dependencies = [ + "cosmwasm-std 2.1.3", + "itertools 0.10.5", + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 1.0.109", +] + [[package]] name = "inout" version = "0.1.3" @@ -5528,7 +5651,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -5954,18 +6077,6 @@ version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" -[[package]] -name = "osmosis-std-derive" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4d482a16be198ee04e0f94e10dd9b8d02332dcf33bc5ea4b255e7e25eedc5df" -dependencies = [ - "itertools 0.10.5", - "proc-macro2 1.0.86", - "quote 1.0.37", - "syn 1.0.109", -] - [[package]] name = "ouroboros" version = "0.15.6" @@ -6149,9 +6260,9 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "peg" -version = "0.7.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" dependencies = [ "peg-macros", "peg-runtime", @@ -6159,9 +6270,9 @@ dependencies = [ [[package]] name = "peg-macros" -version = "0.7.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" dependencies = [ "peg-runtime", "proc-macro2 1.0.86", @@ -6170,9 +6281,9 @@ dependencies = [ [[package]] name = "peg-runtime" -version = "0.7.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" [[package]] name = "pem" @@ -6439,7 +6550,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -6450,7 +6561,7 @@ checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ "once_cell", "thiserror", - "toml", + "toml 0.5.11", ] [[package]] @@ -6544,42 +6655,42 @@ dependencies = [ [[package]] name = "prost" -version = "0.11.9" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.11.9", + "prost-derive 0.12.6", ] [[package]] name = "prost" -version = "0.12.6" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ "bytes", - "prost-derive 0.12.6", + "prost-derive 0.13.4", ] [[package]] name = "prost-derive" -version = "0.11.9" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] name = "prost-derive" -version = "0.12.6" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", "itertools 0.12.1", @@ -6590,20 +6701,20 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.11.9" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ - "prost 0.11.9", + "prost 0.12.6", ] [[package]] name = "prost-types" -version = "0.12.6" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" dependencies = [ - "prost 0.12.6", + "prost 0.13.4", ] [[package]] @@ -6695,7 +6806,7 @@ dependencies = [ "thiserror", "tokio", "tracing", - "webpki 0.22.4", + "webpki", ] [[package]] @@ -6715,7 +6826,7 @@ dependencies = [ "thiserror", "tinyvec", "tracing", - "webpki 0.22.4", + "webpki", ] [[package]] @@ -6980,7 +7091,7 @@ name = "relayer" version = "0.1.0" dependencies = [ "async-trait", - "axum", + "axum 0.6.20", "config", "console-subscriber", "convert_case 0.6.0", @@ -7041,11 +7152,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", - "hyper", - "hyper-rustls 0.24.2", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-rustls", "hyper-tls", "ipnet", "js-sys", @@ -7056,11 +7167,12 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.12", + "rustls-native-certs 0.6.3", "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", @@ -7274,7 +7386,7 @@ dependencies = [ "crc32fast", "futures", "http 0.2.12", - "hyper", + "hyper 0.14.30", "hyper-tls", "lazy_static", "log", @@ -7297,7 +7409,7 @@ dependencies = [ "chrono", "dirs-next", "futures", - "hyper", + "hyper 0.14.30", "serde", "serde_json", "shlex", @@ -7346,7 +7458,7 @@ dependencies = [ "hex 0.4.3", "hmac 0.11.0", "http 0.2.12", - "hyper", + "hyper 0.14.30", "log", "md-5 0.9.1", "percent-encoding", @@ -7450,63 +7562,65 @@ dependencies = [ [[package]] name = "rustls" -version = "0.19.1" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ - "base64 0.13.1", "log", "ring 0.16.20", - "sct 0.6.1", - "webpki 0.21.4", + "sct", + "webpki", ] [[package]] name = "rustls" -version = "0.20.9" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.16.20", - "sct 0.7.1", - "webpki 0.22.4", + "ring 0.17.8", + "rustls-webpki 0.101.7", + "sct", ] [[package]] name = "rustls" -version = "0.21.12" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "log", + "once_cell", "ring 0.17.8", - "rustls-webpki", - "sct 0.7.1", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.5.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls 0.19.1", + "rustls-pemfile 1.0.4", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.4", + "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.2.0", ] [[package]] @@ -7527,6 +7641,21 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -7537,6 +7666,17 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -7704,16 +7844,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "sct" version = "0.7.1" @@ -7956,7 +8086,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -7964,9 +8107,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -8097,6 +8240,15 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -9273,9 +9425,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "subtle-encoding" @@ -9343,6 +9495,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + [[package]] name = "synstructure" version = "0.12.6" @@ -9373,7 +9531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -9435,8 +9593,9 @@ dependencies = [ [[package]] name = "tendermint" -version = "0.32.2" -source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d9d6ffeb83b1de47c307c6e0d2dff56c6256989299010ad03cd80a8491e97" dependencies = [ "bytes", "digest 0.10.7", @@ -9447,8 +9606,8 @@ dependencies = [ "k256 0.13.4", "num-traits", "once_cell", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.13.4", + "prost-types 0.13.4", "ripemd", "serde", "serde_bytes", @@ -9458,53 +9617,35 @@ dependencies = [ "signature 2.2.0", "subtle", "subtle-encoding", - "tendermint-proto 0.32.2 (git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork)", + "tendermint-proto", "time", "zeroize", ] [[package]] name = "tendermint-config" -version = "0.32.2" -source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de111ea653b2adaef627ac2452b463c77aa615c256eaaddf279ec5a1cf9775f" dependencies = [ "flex-error", "serde", "serde_json", "tendermint", - "toml", + "toml 0.8.19", "url", ] [[package]] name = "tendermint-proto" -version = "0.32.2" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" +checksum = "8ed14abe3b0502a3afe21ca74ca5cdd6c7e8d326d982c26f98a394445eb31d6e" dependencies = [ "bytes", "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", - "serde", - "serde_bytes", - "subtle-encoding", - "time", -] - -[[package]] -name = "tendermint-proto" -version = "0.32.2" -source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" -dependencies = [ - "bytes", - "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.13.4", + "prost-types 0.13.4", "serde", "serde_bytes", "subtle-encoding", @@ -9513,20 +9654,19 @@ dependencies = [ [[package]] name = "tendermint-rpc" -version = "0.32.2" -source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02f96a2b8a0d3d0b59e4024b1a6bdc1589efc6af4709d08a480a20cc4ba90f63" dependencies = [ "async-trait", "bytes", "flex-error", "futures", "getrandom 0.2.15", - "http 0.2.12", - "hyper", - "hyper-proxy", - "hyper-rustls 0.22.1", "peg", "pin-project", + "rand 0.8.5", + "reqwest", "semver", "serde", "serde_bytes", @@ -9535,13 +9675,13 @@ dependencies = [ "subtle-encoding", "tendermint", "tendermint-config", - "tendermint-proto 0.32.2 (git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork)", + "tendermint-proto", "thiserror", "time", "tokio", "tracing", "url", - "uuid 0.8.2", + "uuid 1.10.0", "walkdir", ] @@ -9698,9 +9838,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -9759,41 +9899,40 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.22.0" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.19.1", + "rustls 0.20.9", "tokio", - "webpki 0.21.4", + "webpki", ] [[package]] name = "tokio-rustls" -version = "0.23.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.20.9", + "rustls 0.21.12", "tokio", - "webpki 0.22.4", ] [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.21.12", + "rustls 0.23.20", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -9825,7 +9964,7 @@ dependencies = [ "tokio", "tokio-rustls 0.23.4", "tungstenite 0.17.3", - "webpki 0.22.4", + "webpki", "webpki-roots 0.22.6", ] @@ -9863,11 +10002,26 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.20", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -9887,37 +10041,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ "indexmap 2.5.0", + "serde", + "serde_spanned", "toml_datetime", "winnow 0.6.18", ] [[package]] name = "tonic" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" dependencies = [ "async-stream", "async-trait", - "axum", + "axum 0.6.20", "base64 0.21.7", "bytes", - "futures-core", - "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", - "hyper", - "hyper-timeout", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-timeout 0.4.1", "percent-encoding", "pin-project", - "prost 0.11.9", + "prost 0.12.6", + "rustls 0.21.12", "rustls-native-certs 0.6.3", "rustls-pemfile 1.0.4", "tokio", "tokio-rustls 0.24.1", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -9925,30 +10080,32 @@ dependencies = [ [[package]] name = "tonic" -version = "0.10.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", - "axum", - "base64 0.21.7", + "axum 0.7.9", + "base64 0.22.1", "bytes", - "h2", - "http 0.2.12", - "http-body", - "hyper", - "hyper-timeout", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.2", + "hyper-timeout 0.5.2", + "hyper-util", "percent-encoding", "pin-project", - "prost 0.12.6", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "rustls-pemfile 1.0.4", + "prost 0.13.4", + "rustls-native-certs 0.8.1", + "rustls-pemfile 2.2.0", + "socket2 0.5.7", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls 0.26.1", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -9974,6 +10131,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -10126,7 +10297,7 @@ dependencies = [ "thiserror", "url", "utf-8", - "webpki 0.22.4", + "webpki", "webpki-roots 0.22.6", ] @@ -10139,7 +10310,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http 1.2.0", "httparse", "log", "rand 0.8.5", @@ -10375,7 +10546,7 @@ name = "validator" version = "0.1.0" dependencies = [ "async-trait", - "axum", + "axum 0.6.20", "chrono", "config", "console-subscriber", @@ -10475,7 +10646,7 @@ dependencies = [ "futures-util", "headers", "http 0.2.12", - "hyper", + "hyper 0.14.30", "log", "mime", "mime_guess", @@ -10603,16 +10774,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "webpki" version = "0.22.4" @@ -10623,22 +10784,13 @@ dependencies = [ "untrusted 0.9.0", ] -[[package]] -name = "webpki-roots" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" -dependencies = [ - "webpki 0.21.4", -] - [[package]] name = "webpki-roots" version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" dependencies = [ - "webpki 0.22.4", + "webpki", ] [[package]] @@ -10966,8 +11118,8 @@ dependencies = [ "futures", "http 0.2.12", "humantime-serde", - "hyper", - "hyper-rustls 0.24.2", + "hyper 0.14.30", + "hyper-rustls", "paste", "rand 0.8.5", "rustls 0.21.12", @@ -10977,7 +11129,7 @@ dependencies = [ "thiserror", "tokio", "tonic 0.10.2", - "tower", + "tower 0.4.13", "tracing", "yup-oauth2", ] @@ -11011,8 +11163,8 @@ dependencies = [ "base64 0.13.1", "futures", "http 0.2.12", - "hyper", - "hyper-rustls 0.24.2", + "hyper 0.14.30", + "hyper-rustls", "itertools 0.10.5", "log", "percent-encoding", diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index 8d52325017..db0ddd70ec 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -46,7 +46,7 @@ color-eyre = "0.6" config = "0.13.3" console-subscriber = "0.2.0" convert_case = "0.6" -cosmrs = { version = "0.14", default-features = false, features = [ +cosmrs = { version = "0.18.0", default-features = false, features = [ "cosmwasm", "rpc", "tokio", @@ -73,12 +73,12 @@ bech32 = "0.9.1" elliptic-curve = "0.13.8" getrandom = { version = "0.2", features = ["js"] } hex = "0.4.3" -http = "0.2.12" +http = "1.2.0" hyper = "0.14" hyper-tls = "0.5.0" hyperlane-cosmwasm-interface = "=0.0.6-rc6" injective-protobuf = "0.2.2" -injective-std = "=0.1.5" +injective-std = "1.13.2-hyperlane-2025-01-09-11-28" itertools = "*" jobserver = "=0.1.26" jsonrpc-core = "18.0" @@ -134,16 +134,16 @@ static_assertions = "1.1" strum = "0.26.2" strum_macros = "0.26.2" tempfile = "3.3" -tendermint = "0.32.2" -tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"] } +tendermint = "0.38.1" +tendermint-rpc = { version = "0.38.1", features = ["http-client", "tokio"] } thiserror = "1.0" time = "0.3" tiny-keccak = "2.0.2" -tokio = { version = "1.4", features = ["parking_lot", "tracing"] } +tokio = { version = "1.42.0", features = ["parking_lot", "tracing"] } tokio-metrics = { version = "0.3.1", default-features = false } tokio-test = "0.4" toml_edit = "0.19.14" -tonic = "0.9.2" +tonic = "0.12.3" tracing = { version = "0.1" } tracing-error = "0.2" tracing-futures = "0.2" @@ -300,12 +300,7 @@ version = "=0.1.0" git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" -[patch.crates-io.tendermint] -branch = "trevor/0.32.2-fork" -git = "https://github.com/hyperlane-xyz/tendermint-rs.git" -version = "=0.32.2" - -[patch.crates-io.tendermint-rpc] -branch = "trevor/0.32.2-fork" -git = "https://github.com/hyperlane-xyz/tendermint-rs.git" -version = "=0.32.2" +[patch.crates-io.injective-std] +version = "1.13.2-hyperlane-2025-01-09-11-28" +git = "https://github.com/hyperlane-xyz/cw-injective.git" +tag = "1.13.2-hyperlane-2025-01-09-11-28" diff --git a/rust/main/chains/hyperlane-cosmos/Cargo.toml b/rust/main/chains/hyperlane-cosmos/Cargo.toml index ce936ec1f4..ecfccbcb7d 100644 --- a/rust/main/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/main/chains/hyperlane-cosmos/Cargo.toml @@ -42,7 +42,7 @@ tonic = { workspace = true, features = [ "transport", "tls", "tls-roots", - "tls-roots-common", + "tls-native-roots", ] } tracing = { workspace = true } tracing-futures = { workspace = true } diff --git a/rust/main/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/main/chains/hyperlane-cosmos/src/interchain_gas.rs index 1e1cb2b328..03b110e81e 100644 --- a/rust/main/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/main/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -122,76 +122,85 @@ impl CosmosInterchainGasPaymasterIndexer { let mut gas_payment = IncompleteInterchainGasPayment::default(); for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value.as_str(); - - match key { - CONTRACT_ADDRESS_ATTRIBUTE_KEY => { - contract_address = Some(value.to_string()); - } - v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { - contract_address = Some(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?); + match attr { + EventAttribute::V037(a) => { + let key = a.key.as_str(); + let value = a.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?); + } + + MESSAGE_ID_ATTRIBUTE_KEY => { + gas_payment.message_id = + Some(H256::from_slice(hex::decode(value)?.as_slice())); + } + v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { + gas_payment.message_id = Some(H256::from_slice( + hex::decode(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?)? + .as_slice(), + )); + } + + PAYMENT_ATTRIBUTE_KEY => { + gas_payment.payment = Some(U256::from_dec_str(value)?); + } + v if *PAYMENT_ATTRIBUTE_KEY_BASE64 == v => { + let dec_str = String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?; + // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. + gas_payment.payment = Some(U256::from_dec_str(dec_str.as_str())?); + } + + GAS_AMOUNT_ATTRIBUTE_KEY => { + gas_payment.gas_amount = Some(U256::from_dec_str(value)?); + } + v if *GAS_AMOUNT_ATTRIBUTE_KEY_BASE64 == v => { + let dec_str = String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?; + // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. + gas_payment.gas_amount = Some(U256::from_dec_str(dec_str.as_str())?); + } + + DESTINATION_ATTRIBUTE_KEY => { + gas_payment.destination = Some(value.parse::()?); + } + v if *DESTINATION_ATTRIBUTE_KEY_BASE64 == v => { + gas_payment.destination = Some( + String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )? + .parse()?, + ); + } + + _ => {} + } } - MESSAGE_ID_ATTRIBUTE_KEY => { - gas_payment.message_id = Some(H256::from_slice(hex::decode(value)?.as_slice())); + EventAttribute::V034(a) => { + unimplemented!(); } - v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { - gas_payment.message_id = Some(H256::from_slice( - hex::decode(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?)? - .as_slice(), - )); - } - - PAYMENT_ATTRIBUTE_KEY => { - gas_payment.payment = Some(U256::from_dec_str(value)?); - } - v if *PAYMENT_ATTRIBUTE_KEY_BASE64 == v => { - let dec_str = String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?; - // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. - gas_payment.payment = Some(U256::from_dec_str(dec_str.as_str())?); - } - - GAS_AMOUNT_ATTRIBUTE_KEY => { - gas_payment.gas_amount = Some(U256::from_dec_str(value)?); - } - v if *GAS_AMOUNT_ATTRIBUTE_KEY_BASE64 == v => { - let dec_str = String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?; - // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. - gas_payment.gas_amount = Some(U256::from_dec_str(dec_str.as_str())?); - } - - DESTINATION_ATTRIBUTE_KEY => { - gas_payment.destination = Some(value.parse::()?); - } - v if *DESTINATION_ATTRIBUTE_KEY_BASE64 == v => { - gas_payment.destination = Some( - String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )? - .parse()?, - ); - } - - _ => {} } } diff --git a/rust/main/chains/hyperlane-cosmos/src/mailbox/delivery_indexer.rs b/rust/main/chains/hyperlane-cosmos/src/mailbox/delivery_indexer.rs index ccc92df707..77ffbb85aa 100644 --- a/rust/main/chains/hyperlane-cosmos/src/mailbox/delivery_indexer.rs +++ b/rust/main/chains/hyperlane-cosmos/src/mailbox/delivery_indexer.rs @@ -60,34 +60,42 @@ impl CosmosMailboxDeliveryIndexer { let mut message_id: Option = None; for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value.as_str(); - - match key { - CONTRACT_ADDRESS_ATTRIBUTE_KEY => { - contract_address = Some(value.to_string()); - } - v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { - contract_address = Some(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?); + match attr { + EventAttribute::V037(a) => { + let key = a.key.as_str(); + let value = a.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?); + } + + MESSAGE_ID_ATTRIBUTE_KEY => { + message_id = Some(value.parse::()?); + } + v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { + let hex = String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?; + message_id = Some(hex.parse::()?); + } + + _ => {} + } } - MESSAGE_ID_ATTRIBUTE_KEY => { - message_id = Some(value.parse::()?); + EventAttribute::V034(a) => { + unimplemented!(); } - v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { - let hex = String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?; - message_id = Some(hex.parse::()?); - } - - _ => {} } } diff --git a/rust/main/chains/hyperlane-cosmos/src/mailbox/dispatch_indexer.rs b/rust/main/chains/hyperlane-cosmos/src/mailbox/dispatch_indexer.rs index 433ea661ed..75e1feeadf 100644 --- a/rust/main/chains/hyperlane-cosmos/src/mailbox/dispatch_indexer.rs +++ b/rust/main/chains/hyperlane-cosmos/src/mailbox/dispatch_indexer.rs @@ -63,39 +63,47 @@ impl CosmosMailboxDispatchIndexer { let mut message: Option = None; for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value.as_str(); - - match key { - CONTRACT_ADDRESS_ATTRIBUTE_KEY => { - contract_address = Some(value.to_string()); - } - v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { - contract_address = Some(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?); + match attr { + EventAttribute::V037(a) => { + let key = a.key.as_str(); + let value = a.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?); + } + + MESSAGE_ATTRIBUTE_KEY => { + // Intentionally using read_from to get a Result::Err if there's + // an issue with the message. + let mut reader = Cursor::new(hex::decode(value)?); + message = Some(HyperlaneMessage::read_from(&mut reader)?); + } + v if *MESSAGE_ATTRIBUTE_KEY_BASE64 == v => { + // Intentionally using read_from to get a Result::Err if there's + // an issue with the message. + let mut reader = Cursor::new(hex::decode(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?)?); + message = Some(HyperlaneMessage::read_from(&mut reader)?); + } + + _ => {} + } } - MESSAGE_ATTRIBUTE_KEY => { - // Intentionally using read_from to get a Result::Err if there's - // an issue with the message. - let mut reader = Cursor::new(hex::decode(value)?); - message = Some(HyperlaneMessage::read_from(&mut reader)?); + EventAttribute::V034(a) => { + unimplemented!(); } - v if *MESSAGE_ATTRIBUTE_KEY_BASE64 == v => { - // Intentionally using read_from to get a Result::Err if there's - // an issue with the message. - let mut reader = Cursor::new(hex::decode(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?)?); - message = Some(HyperlaneMessage::read_from(&mut reader)?); - } - - _ => {} } } diff --git a/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 9c03b824dc..85c2c7adcb 100644 --- a/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/main/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -232,57 +232,66 @@ impl CosmosMerkleTreeHookIndexer { let mut insertion = IncompleteMerkleTreeInsertion::default(); for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value.as_str(); - - match key { - CONTRACT_ADDRESS_ATTRIBUTE_KEY => { - contract_address = Some(value.to_string()); - debug!(?contract_address, "parsed contract address from plain text"); - } - v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { - contract_address = Some(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?); - debug!(?contract_address, "parsed contract address from base64"); - } - - MESSAGE_ID_ATTRIBUTE_KEY => { - insertion.message_id = Some(H256::from_slice(hex::decode(value)?.as_slice())); - debug!(message_id = ?insertion.message_id, "parsed message_id from plain text"); - } - v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { - insertion.message_id = Some(H256::from_slice( - hex::decode(String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )?)? - .as_slice(), - )); - debug!(message_id = ?insertion.message_id, "parsed message_id from base64"); - } - - INDEX_ATTRIBUTE_KEY => { - insertion.leaf_index = Some(value.parse::()?); - debug!(leaf_index = ?insertion.leaf_index, "parsed leaf_index from plain text"); - } - v if *INDEX_ATTRIBUTE_KEY_BASE64 == v => { - insertion.leaf_index = Some( - String::from_utf8( - BASE64 - .decode(value) - .map_err(Into::::into)?, - )? - .parse()?, - ); - debug!(leaf_index = ?insertion.leaf_index, "parsed leaf_index from base64"); + match attr { + EventAttribute::V037(a) => { + let key = a.key.as_str(); + let value = a.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + debug!(?contract_address, "parsed contract address from plain text"); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?); + debug!(?contract_address, "parsed contract address from base64"); + } + + MESSAGE_ID_ATTRIBUTE_KEY => { + insertion.message_id = + Some(H256::from_slice(hex::decode(value)?.as_slice())); + debug!(message_id = ?insertion.message_id, "parsed message_id from plain text"); + } + v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { + insertion.message_id = Some(H256::from_slice( + hex::decode(String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )?)? + .as_slice(), + )); + debug!(message_id = ?insertion.message_id, "parsed message_id from base64"); + } + + INDEX_ATTRIBUTE_KEY => { + insertion.leaf_index = Some(value.parse::()?); + debug!(leaf_index = ?insertion.leaf_index, "parsed leaf_index from plain text"); + } + v if *INDEX_ATTRIBUTE_KEY_BASE64 == v => { + insertion.leaf_index = Some( + String::from_utf8( + BASE64 + .decode(value) + .map_err(Into::::into)?, + )? + .parse()?, + ); + debug!(leaf_index = ?insertion.leaf_index, "parsed leaf_index from base64"); + } + + unknown => { + debug!(?unknown, "unknown attribute"); + } + } } - unknown => { - debug!(?unknown, "unknown attribute"); + EventAttribute::V034(a) => { + unimplemented!(); } } } diff --git a/rust/main/chains/hyperlane-cosmos/src/payloads/general.rs b/rust/main/chains/hyperlane-cosmos/src/payloads/general.rs index bf0931220d..0652cd0340 100644 --- a/rust/main/chains/hyperlane-cosmos/src/payloads/general.rs +++ b/rust/main/chains/hyperlane-cosmos/src/payloads/general.rs @@ -1,4 +1,6 @@ use serde::{Deserialize, Serialize}; +use tendermint::abci::v0_34; +use tendermint::v0_37; #[derive(Serialize, Deserialize, Debug, Clone)] pub struct EmptyStruct {} @@ -30,10 +32,6 @@ pub struct EventAttribute { impl From for cosmrs::tendermint::abci::EventAttribute { fn from(val: EventAttribute) -> Self { - cosmrs::tendermint::abci::EventAttribute { - key: val.key, - value: val.value, - index: val.index, - } + cosmrs::tendermint::abci::EventAttribute::from((val.key, val.value, val.index)) } } diff --git a/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider.rs b/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider.rs index e498c22ed9..2ca98e3fb7 100644 --- a/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider.rs +++ b/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider.rs @@ -156,8 +156,8 @@ impl CosmosProvider { value: pk.value, }; - let proto = proto::cosmos::crypto::secp256k1::PubKey::from_any(&any) - .map_err(Into::::into)?; + let proto: proto::cosmos::crypto::secp256k1::PubKey = + any.to_msg().map_err(Into::::into)?; let decompressed = decompress_public_key(&proto.key) .map_err(|e| HyperlaneCosmosError::PublicKeyError(e.to_string()))?; @@ -250,8 +250,8 @@ impl CosmosProvider { let msg = "could not find contract execution message"; HyperlaneCosmosError::ParsingFailed(msg.to_owned()) })?; - let proto = - ProtoMsgExecuteContract::from_any(any).map_err(Into::::into)?; + let proto: proto::cosmwasm::wasm::v1::MsgExecuteContract = + any.to_msg().map_err(Into::::into)?; let msg = MsgExecuteContract::try_from(proto)?; let contract = H256::try_from(CosmosAccountId::new(&msg.contract))?; diff --git a/rust/main/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/main/chains/hyperlane-cosmos/src/providers/grpc.rs index c2e05acf45..d9719e942a 100644 --- a/rust/main/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/main/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -553,14 +553,13 @@ impl WasmProvider for WasmGrpcProvider { { let signer = self.get_signer()?; let contract_address = self.get_contract_address(); - let msgs = vec![MsgExecuteContract { + let msg = MsgExecuteContract { sender: signer.address.clone(), contract: contract_address.address(), msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], - } - .to_any() - .map_err(ChainCommunicationError::from_other)?]; + }; + let msgs = vec![Any::from_msg(&msg).map_err(ChainCommunicationError::from_other)?]; let gas_limit: Option = gas_limit.and_then(|limit| match limit.try_into() { Ok(limit) => Some(limit), Err(err) => { @@ -629,9 +628,9 @@ impl WasmProvider for WasmGrpcProvider { }; let response = self - .estimate_gas(vec![msg - .to_any() - .map_err(ChainCommunicationError::from_other)?]) + .estimate_gas(vec![ + Any::from_msg(&msg).map_err(ChainCommunicationError::from_other)? + ]) .await?; Ok(response) From 350ae79b201dd88d3baef138f7c7e7dfe0e4bacd Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Thu, 9 Jan 2025 18:36:05 +0000 Subject: [PATCH 43/81] feat: Add injective validator to RC (#5137) ### Description Add injective validator to RC ### Drive-by changes Sorted entries into `rc.json` alphabetically. ### Related issues - Contributes into https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/5113 ### Backward compatibility Yes ### Testing Tested in RC --------- Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> --- .../mainnet3/aw-validators/rc.json | 23 +++++++++++-------- .../environments/mainnet3/validators.ts | 4 +++- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/rc.json b/typescript/infra/config/environments/mainnet3/aw-validators/rc.json index 5427114cb7..344c4dedd9 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/rc.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/rc.json @@ -97,6 +97,9 @@ "0xe83d36fd00d9ef86243d9f7147b29e98d11df0ee" ] }, + "injective": { + "validators": ["0xca024623ee6fe281639aee91c4390b0c4e053918"] + }, "kroma": { "validators": ["0x9b3142f04dd67585c9287f1aee42ff9754a955d3"] }, @@ -138,6 +141,13 @@ "0xcaa9c6e6efa35e4a8b47565f3ce98845fa638bf3" ] }, + "neutron": { + "validators": [ + "0x307a8fe091b8273c7ce3d277b161b4a2167279b1", + "0xb825c1bd020cb068f477b320f591b32e26814b5b", + "0x0a5b31090d4c3c207b9ea6708f938e328f895fce" + ] + }, "oortmainnet": { "validators": ["0x83f406ff315e90ae9589fa7786bf700e7c7a06f1"] }, @@ -190,6 +200,9 @@ "solanamainnet": { "validators": ["0x7bd1536cb7505cf2ea1dc6744127d91fbe87a2ad"] }, + "stride": { + "validators": ["0x1edadb2330c77769a7e9b48d990289ccdcafa430"] + }, "tangle": { "validators": ["0xd778d113975b2fe45eda424bf93c28f32a90b076"] }, @@ -211,15 +224,5 @@ }, "zetachain": { "validators": ["0xa13d146b47242671466e4041f5fe68d22a2ffe09"] - }, - "neutron": { - "validators": [ - "0x307a8fe091b8273c7ce3d277b161b4a2167279b1", - "0xb825c1bd020cb068f477b320f591b32e26814b5b", - "0x0a5b31090d4c3c207b9ea6708f938e328f895fce" - ] - }, - "stride": { - "validators": ["0x1edadb2330c77769a7e9b48d990289ccdcafa430"] } } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 7a909d3011..bbbf1cb355 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -300,7 +300,9 @@ export const validatorChainConfig = ( validators: validatorsConfig( { [Contexts.Hyperlane]: ['0xbfb8911b72cfb138c7ce517c57d9c691535dc517'], - [Contexts.ReleaseCandidate]: [], + [Contexts.ReleaseCandidate]: [ + '0xca024623ee6fe281639aee91c4390b0c4e053918', + ], [Contexts.Neutron]: [], }, 'injective', From 2d018fa7a798bb976efd1e4c901f779537282d3e Mon Sep 17 00:00:00 2001 From: Lee <6251863+ltyu@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:30:35 -0500 Subject: [PATCH 44/81] fix: hyperlane warp send out of order for --origin --destination (#5131) ### Description Fix ordering issue where --origin and --destination are sent out of order. For example, when --origin is zircuit, and --destination is ethereum, `warp send` will send from origin ethereum to destination zircuit. ### Testing Manual/Unit Tests --- .changeset/tall-starfishes-hunt.md | 5 ++ typescript/cli/src/commands/warp.ts | 9 +++- .../cli/src/tests/warp-deploy.e2e-test.ts | 51 ++++++++++++++++++- 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 .changeset/tall-starfishes-hunt.md diff --git a/.changeset/tall-starfishes-hunt.md b/.changeset/tall-starfishes-hunt.md new file mode 100644 index 0000000000..4419db9d2e --- /dev/null +++ b/.changeset/tall-starfishes-hunt.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Fix hyperlane warp send where --origin and --destination are out of order diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index d762197206..853df8aa19 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -2,7 +2,7 @@ import { stringify as yamlStringify } from 'yaml'; import { CommandModule } from 'yargs'; import { ChainName, ChainSubmissionStrategySchema } from '@hyperlane-xyz/sdk'; -import { objFilter } from '@hyperlane-xyz/utils'; +import { assert, objFilter } from '@hyperlane-xyz/utils'; import { runWarpRouteCheck } from '../check/warp.js'; import { @@ -309,7 +309,12 @@ const send: CommandModuleWithWriteContext< 'Select the destination chain:', ); - chains = chains.filter((c) => c === origin || c === destination); + chains = [origin, destination].filter((c) => chains.includes(c)); + + assert( + chains.length === 2, + `Origin (${origin}) or destination (${destination}) are not part of the warp route.`, + ); } logBlue(`🚀 Sending a message for chains: ${chains.join(' ➡️ ')}`); diff --git a/typescript/cli/src/tests/warp-deploy.e2e-test.ts b/typescript/cli/src/tests/warp-deploy.e2e-test.ts index d80508eb6a..71dc2e9183 100644 --- a/typescript/cli/src/tests/warp-deploy.e2e-test.ts +++ b/typescript/cli/src/tests/warp-deploy.e2e-test.ts @@ -28,7 +28,11 @@ import { deployToken, sendWarpRouteMessageRoundTrip, } from './commands/helpers.js'; -import { hyperlaneWarpDeploy, readWarpConfig } from './commands/warp.js'; +import { + hyperlaneWarpDeploy, + hyperlaneWarpSendRelay, + readWarpConfig, +} from './commands/warp.js'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -198,4 +202,49 @@ describe('hyperlane warp deploy e2e tests', async function () { normalizeConfig(hook), ); }); + + it('should send a message from origin to destination in the correct order', async function () { + const warpConfig: WarpRouteDeployConfig = { + [CHAIN_NAME_2]: { + type: TokenType.collateralVaultRebase, + token: vault.address, + mailbox: chain2Addresses.mailbox, + owner: chain2Addresses.mailbox, + }, + [CHAIN_NAME_3]: { + type: TokenType.syntheticRebase, + mailbox: chain3Addresses.mailbox, + owner: chain3Addresses.mailbox, + collateralChainName: CHAIN_NAME_2, + }, + }; + + writeYamlOrJson(WARP_CONFIG_PATH, warpConfig); + await hyperlaneWarpDeploy(WARP_CONFIG_PATH); + + // Try to send a transaction with the origin destination + const { stdout: chain2Tochain3Stdout } = await hyperlaneWarpSendRelay( + CHAIN_NAME_2, + CHAIN_NAME_3, + WARP_CORE_CONFIG_PATH_2_3, + ); + expect(chain2Tochain3Stdout).to.include('anvil2 ➡️ anvil3'); + + // Send another message with swapped origin destination + const { stdout: chain3Tochain2Stdout } = await hyperlaneWarpSendRelay( + CHAIN_NAME_3, + CHAIN_NAME_2, + WARP_CORE_CONFIG_PATH_2_3, + ); + expect(chain3Tochain2Stdout).to.include('anvil3 ➡️ anvil2'); + + // Should throw if invalid origin or destination + await hyperlaneWarpSendRelay( + 'anvil1', + CHAIN_NAME_3, + WARP_CORE_CONFIG_PATH_2_3, + ).should.be.rejectedWith( + 'Error: Origin (anvil1) or destination (anvil3) are not part of the warp route.', + ); + }); }); From 2d4963c62bdb1515c93f5fa5fa6da247af7b180b Mon Sep 17 00:00:00 2001 From: Lee <6251863+ltyu@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:05:49 -0500 Subject: [PATCH 45/81] feat: Add USDC to Ink <-> Ethereum (#5139) ### Description Add USDC between Ink and Ethereum ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .changeset/cold-cows-grow.md | 5 ++ .registryrc | 2 +- .../getEthereumInkUSDCWarpConfig.ts | 48 +++++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 1 + typescript/infra/config/warp.ts | 2 + typescript/infra/src/warp/helm.ts | 2 +- 6 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 .changeset/cold-cows-grow.md create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.ts diff --git a/.changeset/cold-cows-grow.md b/.changeset/cold-cows-grow.md new file mode 100644 index 0000000000..f0f601414a --- /dev/null +++ b/.changeset/cold-cows-grow.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/infra': minor +--- + +Add USDC between Ink and Ethereum diff --git a/.registryrc b/.registryrc index 5a0f111647..c80c30c543 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -8481aeb47ed242783c8dc6ccd366f90a95b471bf +62ccc4da05f48d62a5a0fd5d1498b68b596c627b diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.ts new file mode 100644 index 0000000000..7182a2a125 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.ts @@ -0,0 +1,48 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + OwnableConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getEthereumInkUSDCConfig = async ( + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: abacusWorksEnvOwnerConfig.ethereum.owner, + proxyAdmin: { + owner: abacusWorksEnvOwnerConfig.ethereum.owner, + address: '0xd702dCed4DDeC529Ea763ddeBD8fb180C4D1843F', + }, + type: TokenType.collateral, + token: tokens.ethereum.USDC, + interchainSecurityModule: ISM_CONFIG, + }; + + const ink: HypTokenRouterConfig = { + ...routerConfig.ink, + owner: abacusWorksEnvOwnerConfig.ink.owner, + proxyAdmin: { + owner: abacusWorksEnvOwnerConfig.ink.owner, + address: '0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D', + }, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + ethereum, + ink, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 58d8c7912e..aa48bea0cf 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -23,6 +23,7 @@ export enum WarpRouteIds { EthereumFlowCbBTC = 'CBBTC/ethereum-flowmainnet', EthereumInevmUSDC = 'USDC/ethereum-inevm', EthereumInevmUSDT = 'USDT/ethereum-inevm', + EthereumInkUSDC = 'USDC/ethereum-ink', EthereumSeiFastUSD = 'FASTUSD/ethereum-sei', EthereumSeiPumpBTC = 'pumpBTCsei/ethereum-sei', EthereumVanaETH = 'ETH/ethereum-vana', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index d87a010be1..cb5c2d72e9 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -32,6 +32,7 @@ import { getEthereumBscLUMIAWarpConfig } from './environments/mainnet3/warp/conf 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 { getEthereumInkUSDCConfig } from './environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.js'; import { getEthereumSeiFastUSDWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.js'; import { getEthereumSeiPumpBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.js'; import { getEthereumVictionETHWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.js'; @@ -61,6 +62,7 @@ export const warpConfigGetterMap: Record = { getRenzoEZETHWarpConfig, [WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig, [WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig, + [WarpRouteIds.EthereumInkUSDC]: getEthereumInkUSDCConfig, [WarpRouteIds.EthereumSeiFastUSD]: getEthereumSeiFastUSDWarpConfig, [WarpRouteIds.EthereumSeiPumpBTC]: getEthereumSeiPumpBTCWarpConfig, [WarpRouteIds.EthereumVictionETH]: getEthereumVictionETHWarpConfig, diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 4c7ddf60ef..98af5bc507 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'de11906-20241227-214834', + tag: '6da7f6f-20250109-210231', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From 1c652a6c8e274dc4cee8daa08c038895271f88f4 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:56:34 +0000 Subject: [PATCH 46/81] fix: svm gas price multipliers, relayer image (#5140) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../chains/hyperlane-sealevel/src/rpc/client.rs | 17 ++++++++++++++--- .../infra/config/environments/mainnet3/agent.ts | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs index 22b44497c8..b1ae47de11 100644 --- a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs +++ b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs @@ -33,6 +33,12 @@ use crate::{ tx_submitter::TransactionSubmitter, }; +const COMPUTE_UNIT_MULTIPLIER_NUMERATOR: u32 = 11; +const COMPUTE_UNIT_MULTIPLIER_DENOMINATOR: u32 = 10; + +const PRIORITY_FEE_MULTIPLIER_NUMERATOR: u64 = 125; +const PRIORITY_FEE_MULTIPLIER_DENOMINATOR: u64 = 100; + pub struct SealevelTxCostEstimate { compute_units: u32, compute_unit_price_micro_lamports: u64, @@ -389,11 +395,16 @@ impl SealevelRpcClient { )); } - // Bump the compute units by 10% to ensure we have enough, but cap it at the max. - let simulation_compute_units = - Self::MAX_COMPUTE_UNITS.min((simulation_compute_units * 11) / 10); + // Bump the compute units to be conservative + let simulation_compute_units = Self::MAX_COMPUTE_UNITS.min( + (simulation_compute_units * COMPUTE_UNIT_MULTIPLIER_NUMERATOR) + / COMPUTE_UNIT_MULTIPLIER_DENOMINATOR, + ); let priority_fee = priority_fee_oracle.get_priority_fee(&simulation_tx).await?; + // Bump the priority fee to be conservative + let priority_fee = (priority_fee * PRIORITY_FEE_MULTIPLIER_NUMERATOR) + / PRIORITY_FEE_MULTIPLIER_DENOMINATOR; Ok(SealevelTxCostEstimate { compute_units: simulation_compute_units, diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 29db8dcb68..cb3ef7eb59 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -630,7 +630,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '286b4de-20250108-194715', + tag: 'df9c1ed-20250109-151923', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, @@ -665,7 +665,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '234704d-20241226-192528', + tag: 'df9c1ed-20250109-151923', }, blacklist, // We're temporarily (ab)using the RC relayer as a way to increase From 0cc294dec6897a78e93d18019970a05a58d082d6 Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Fri, 10 Jan 2025 13:18:28 +0000 Subject: [PATCH 47/81] feat: Upgrade Validators and Scraper to latest version (#5143) ### Description Upgrade Validators and Scraper to latest version ### Related issues - Fixes [#[issue number here]](https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/5113) ### Backward compatibility Yes ### Testing Change was tested in RC --------- Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> --- typescript/infra/config/environments/mainnet3/agent.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index cb3ef7eb59..15be7f1540 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -640,7 +640,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '706f69b-20250107-230151', + tag: '2d4963c-20250109-221753', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -650,7 +650,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '706f69b-20250107-230151', + tag: '2d4963c-20250109-221753', }, resources: scraperResources, }, From 65e7d7215c7768d3a4dbb4f8fa56138a8b2e76cd Mon Sep 17 00:00:00 2001 From: xeno097 Date: Fri, 10 Jan 2025 11:32:57 -0400 Subject: [PATCH 48/81] feat(infra): form warp routes (#5138) ### Description Adds the config getters for newly deployed warp routes that connect base ethereum and form Related registry PR: - https://github.com/hyperlane-xyz/hyperlane-registry/pull/477 ### Drive-by changes - NO ### Related issues - ### Backward compatibility - YES ### Testing - CLI - UI --- .registryrc | 2 +- .../getBaseFormAIXBTWarpConfig.ts | 38 +++++++++++++++++++ .../getBaseFormGAMEWarpConfig.ts | 38 +++++++++++++++++++ .../getEthereumFormWBTCWarpConfig.ts | 38 +++++++++++++++++++ .../getEthereumFormWSTETHWarpConfig.ts | 38 +++++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 4 ++ typescript/infra/config/warp.ts | 8 ++++ typescript/infra/src/config/warp.ts | 3 ++ typescript/infra/src/warp/helm.ts | 2 +- 9 files changed, 169 insertions(+), 2 deletions(-) create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.ts create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.ts create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.ts create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.ts diff --git a/.registryrc b/.registryrc index c80c30c543..824e6518bd 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -62ccc4da05f48d62a5a0fd5d1498b68b596c627b +690e04993fc72d57b8008224c69d52245495a6c0 diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.ts new file mode 100644 index 0000000000..48fac9ebe0 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const formSafes: ChainMap

= { + base: '0xFCdf33C6461fE8476AA0b7aC92D631d58c4e0d84', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getBaseFormAIXBTWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const base: HypTokenRouterConfig = { + ...routerConfig.base, + owner: formSafes.base, + type: TokenType.collateral, + token: tokens.base.AIXBT, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + owner: formSafes.form, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + form, + base, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.ts new file mode 100644 index 0000000000..c6d071e62b --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const formSafes: ChainMap
= { + base: '0xFCdf33C6461fE8476AA0b7aC92D631d58c4e0d84', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getBaseFormGAMEWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const base: HypTokenRouterConfig = { + ...routerConfig.base, + owner: formSafes.base, + type: TokenType.collateral, + token: tokens.base.GAME, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + owner: formSafes.form, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + form, + base, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.ts new file mode 100644 index 0000000000..c7a1491fd1 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const formSafes: ChainMap
= { + ethereum: '0xec5ad23e29203301B2C1a765718Cc1de7A8d3FbF', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getEthereumFormWBTCWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: formSafes.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.WBTC, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + owner: formSafes.form, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + form, + ethereum, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.ts new file mode 100644 index 0000000000..b0cce79a35 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const formSafes: ChainMap
= { + ethereum: '0xec5ad23e29203301B2C1a765718Cc1de7A8d3FbF', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getEthereumFormWSTETHWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: formSafes.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.WSTETH, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + owner: formSafes.form, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + form, + ethereum, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index aa48bea0cf..14da057bb1 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -42,4 +42,8 @@ export enum WarpRouteIds { ArbitrumBaseBlastBscEthereumGnosisLiskMantleModeOptimismPolygonScrollZeroNetworkZoraMainnet = 'ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet', AppchainBaseUSDC = 'USDC/appchain-base', BobaBsquaredSwellUBTC = 'UBTC/boba-bsquared-swell', + EthereumFormWBTC = 'WBTC/ethereum-form', + EthereumFormWSTETH = 'WSTETH/ethereum-form', + BaseFormAIXBT = 'AIXBT/base-form', + BaseFormGAME = 'GAME/base-form', } diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index cb5c2d72e9..dec816d15b 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -20,6 +20,8 @@ import { getArbitrumEthereumMantleModePolygonScrollZeroNetworkUSDTWarpConfig } f import { getArbitrumEthereumZircuitAmphrETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.js'; import { getArbitrumNeutronEclipWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.js'; import { getArbitrumNeutronTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.js'; +import { getBaseFormAIXBTWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.js'; +import { getBaseFormGAMEWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.js'; import { getBaseZeroNetworkCBBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseZeroNetworkCBBTCWarpConfig.js'; import { getBobaBsquaredSwellUBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBobaBsquaredSwellUBTCWarpConfig.js'; import { getEclipseEthereumApxEthWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.js'; @@ -30,6 +32,8 @@ import { getEclipseStrideTiaWarpConfig } from './environments/mainnet3/warp/conf import { getEclipseStrideStTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.js'; import { getEthereumBscLUMIAWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.js'; import { getEthereumFlowCbBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.js'; +import { getEthereumFormWBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.js'; +import { getEthereumFormWSTETHWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.js'; import { getEthereumInevmUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.js'; import { getEthereumInevmUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.js'; import { getEthereumInkUSDCConfig } from './environments/mainnet3/warp/configGetters/getEthereumInkUSDCWarpConfig.js'; @@ -88,6 +92,10 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.AppchainBaseUSDC]: getAppChainBaseUSDCWarpConfig, [WarpRouteIds.BobaBsquaredSwellUBTC]: getBobaBsquaredSwellUBTCWarpConfig, [WarpRouteIds.EthereumZircuitRe7LRT]: getEthereumZircuitRe7LRTWarpConfig, + [WarpRouteIds.EthereumFormWBTC]: getEthereumFormWBTCWarpConfig, + [WarpRouteIds.EthereumFormWSTETH]: getEthereumFormWSTETHWarpConfig, + [WarpRouteIds.BaseFormAIXBT]: getBaseFormAIXBTWarpConfig, + [WarpRouteIds.BaseFormGAME]: getBaseFormGAMEWarpConfig, }; export async function getWarpConfig( diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 3a0ddb4110..6c8ff29132 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -14,6 +14,7 @@ export const tokens: ChainMap> = { weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88', pumpBTCsei: '0xe9ebd666954B7F0B5B044704c86B126651f6235d', Re7LRT: '0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a', + WSTETH: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', }, sei: { fastUSD: '0x37a4dD9CED2b19Cfe8FAC251cd727b5787E45269', @@ -21,6 +22,8 @@ export const tokens: ChainMap> = { base: { cbBTC: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', USDC: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', + AIXBT: '0x4F9Fd6Be4a90f2620860d680c0d4d5Fb53d1A825', + GAME: '0x1C4CcA7C5DB003824208aDDA61Bd749e55F463a3', }, bsquared: { uBTC: '0x796e4D53067FF374B89b2Ac101ce0c1f72ccaAc2', diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 98af5bc507..be9b752f88 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '6da7f6f-20250109-210231', + tag: '20a0c4b-20250109-221853', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From fc80df5b4aad38c44deeaba02be6261701ca398a Mon Sep 17 00:00:00 2001 From: Jason Guo <33064781+Xaroz@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:43:05 -0600 Subject: [PATCH 49/81] feat(infra): add rstETH/ethereum-zircuit warp route config (#5129) ### Description Adds rstETH/ethereum-zircuit warp route config ### Drive-by changes Add dummy soon owner ### Related issues ### Backward compatibility Yes ### Testing CLI testing --- .changeset/rare-windows-deny.md | 5 +++ .registryrc | 2 +- config.yaml | 12 ++++++ .../getEthereumZircuitRstETHWarpConfig.ts | 39 +++++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 1 + typescript/infra/config/warp.ts | 2 + typescript/infra/src/config/warp.ts | 1 + 7 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 .changeset/rare-windows-deny.md create mode 100644 config.yaml create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.ts diff --git a/.changeset/rare-windows-deny.md b/.changeset/rare-windows-deny.md new file mode 100644 index 0000000000..c744963c9c --- /dev/null +++ b/.changeset/rare-windows-deny.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/infra': minor +--- + +Add rstETH/ethereum-zircuit warp config diff --git a/.registryrc b/.registryrc index 824e6518bd..f1d8706f5d 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -690e04993fc72d57b8008224c69d52245495a6c0 +115d44069109f3ef43caeed5632f6255d9a3390a diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000000..feb0260b65 --- /dev/null +++ b/config.yaml @@ -0,0 +1,12 @@ +ethereum: + type: collateral + token: "0x7a4EffD87C2f3C55CA251080b1343b605f327E3a" + owner: "0xDA0d054265bB30F4f32C92066428FE57513E7ee1" + mailbox: "0xc005dc82818d67AF737725bD4bf75435d065D239" + interchainSecurityModule: "0x0000000000000000000000000000000000000000" +zircuit: + type: synthetic + owner: "0xA1895dF8AE7b7678E82E76b167A24c82Fb83ec9A" + mailbox: "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c" + interchainSecurityModule: "0x0000000000000000000000000000000000000000" + diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.ts new file mode 100644 index 0000000000..755714c719 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.ts @@ -0,0 +1,39 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const RstETHSafes = { + ethereum: '0xDA0d054265bB30F4f32C92066428FE57513E7ee1', + zircuit: '0xA1895dF8AE7b7678E82E76b167A24c82Fb83ec9A', +}; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getEthereumZircuitRstETHWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: RstETHSafes.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.rstETH, + interchainSecurityModule: ISM_CONFIG, + }; + + const zircuit: HypTokenRouterConfig = { + ...routerConfig.zircuit, + owner: RstETHSafes.zircuit, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + ethereum, + zircuit, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 14da057bb1..32db67821f 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -42,6 +42,7 @@ export enum WarpRouteIds { ArbitrumBaseBlastBscEthereumGnosisLiskMantleModeOptimismPolygonScrollZeroNetworkZoraMainnet = 'ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet', AppchainBaseUSDC = 'USDC/appchain-base', BobaBsquaredSwellUBTC = 'UBTC/boba-bsquared-swell', + EthereumZircuitRstETH = 'rstETH/ethereum-zircuit', EthereumFormWBTC = 'WBTC/ethereum-form', EthereumFormWSTETH = 'WSTETH/ethereum-form', BaseFormAIXBT = 'AIXBT/base-form', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index dec816d15b..75da6ba959 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -43,6 +43,7 @@ import { getEthereumVictionETHWarpConfig } from './environments/mainnet3/warp/co import { getEthereumVictionUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.js'; import { getEthereumVictionUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.js'; import { getEthereumZircuitRe7LRTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumZircuitRe7LRTWarpConfig.js'; +import { getEthereumZircuitRstETHWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumZircuitRstETHWarpConfig.js'; import { getInevmInjectiveINJWarpConfig } from './environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.js'; import { getMantapacificNeutronTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.js'; import { getRenzoEZETHWarpConfig } from './environments/mainnet3/warp/configGetters/getRenzoEZETHWarpConfig.js'; @@ -92,6 +93,7 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.AppchainBaseUSDC]: getAppChainBaseUSDCWarpConfig, [WarpRouteIds.BobaBsquaredSwellUBTC]: getBobaBsquaredSwellUBTCWarpConfig, [WarpRouteIds.EthereumZircuitRe7LRT]: getEthereumZircuitRe7LRTWarpConfig, + [WarpRouteIds.EthereumZircuitRstETH]: getEthereumZircuitRstETHWarpConfig, [WarpRouteIds.EthereumFormWBTC]: getEthereumFormWBTCWarpConfig, [WarpRouteIds.EthereumFormWSTETH]: getEthereumFormWSTETHWarpConfig, [WarpRouteIds.BaseFormAIXBT]: getBaseFormAIXBTWarpConfig, diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 6c8ff29132..e3a04dda95 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -14,6 +14,7 @@ export const tokens: ChainMap> = { weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88', pumpBTCsei: '0xe9ebd666954B7F0B5B044704c86B126651f6235d', Re7LRT: '0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a', + rstETH: '0x7a4EffD87C2f3C55CA251080b1343b605f327E3a', WSTETH: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', }, sei: { From 79c61c8919d3fb2d1f83bd7e9904a6394a40cad2 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Fri, 10 Jan 2025 17:02:52 +0000 Subject: [PATCH 50/81] feat: support safe tx parsing for zksync chains (#5042) ### Description 1. correctly generate core config for zksync chains - copied from `pb/zksync` https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/pb/zksync/typescript/infra/config/environments/mainnet3/core.ts - note the storage aggregation ism was not around when doing the first zksync chain deploys, and we haven't gone back and updated the config generation yet to include this - required so we infer the correct config for zksync changes and don't assume it's the same as non-zksync chains 2. update ISM reader to return storagemultisigism types on zksync - since static ISMs are not supported on zksync - the moduleType is the same, so the reader has to determine if it's static/storage - note: at the moment on non-zksync we assume it's a static multisig/aggregation ISM - required so we correctly compare the config vs onchain config ### Drive-by changes ### Related issues ### Backward compatibility ### Testing - these changes were used to verify SAFE txs for the last couple of batches - the config changes have also been used in production on zksync chains since October 23rd 2024 [`26d198a` (#4761)](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/4761/commits/26d198a18fe0dce0ebf28ab75c32788e7104e2fc#diff-d4db62438f3fd9acf24be52093e81d126292859f9f48c81aa1704d41fe8ddf1a) --- .changeset/eleven-carrots-shave.md | 5 ++ .../config/environments/mainnet3/core.ts | 90 ++++++++++++++----- .../config/environments/testnet4/core.ts | 88 +++++++++++++----- typescript/sdk/src/ism/EvmIsmReader.ts | 25 +++++- 4 files changed, 165 insertions(+), 43 deletions(-) create mode 100644 .changeset/eleven-carrots-shave.md diff --git a/.changeset/eleven-carrots-shave.md b/.changeset/eleven-carrots-shave.md new file mode 100644 index 0000000000..ef5f577bdb --- /dev/null +++ b/.changeset/eleven-carrots-shave.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': patch +--- + +Fix the return type of multisig and aggregation ISMs for zksync-stack chains. diff --git a/typescript/infra/config/environments/mainnet3/core.ts b/typescript/infra/config/environments/mainnet3/core.ts index b0655ae785..eb8315a690 100644 --- a/typescript/infra/config/environments/mainnet3/core.ts +++ b/typescript/infra/config/environments/mainnet3/core.ts @@ -4,9 +4,11 @@ import { AggregationHookConfig, AggregationIsmConfig, ChainMap, + ChainTechnicalStack, CoreConfig, FallbackRoutingHookConfig, HookType, + IgpConfig, IsmType, MerkleTreeHookConfig, MultisigConfig, @@ -20,10 +22,15 @@ import { } from '@hyperlane-xyz/sdk'; import { Address, objMap } from '@hyperlane-xyz/utils'; +import { getChain } from '../../registry.js'; + import { igp } from './igp.js'; import { DEPLOYER, ethereumChainOwners } from './owners.js'; import { supportedChainNames } from './supportedChainNames.js'; +// There are no static ISMs or hooks for zkSync, this means +// that the default ISM is a routing ISM and the default hook +// is a fallback routing hook. export const core: ChainMap = objMap( ethereumChainOwners, (local, owner) => { @@ -33,11 +40,26 @@ export const core: ChainMap = objMap( .map((origin) => [origin, defaultMultisigConfigs[origin]]), ); + const isZksyncChain = + getChain(local).technicalStack === ChainTechnicalStack.ZkSync; + + // zkSync uses a different ISM for the merkle root const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => - multisigConfigToIsmConfig(IsmType.MERKLE_ROOT_MULTISIG, multisig); + multisigConfigToIsmConfig( + isZksyncChain + ? IsmType.STORAGE_MERKLE_ROOT_MULTISIG + : IsmType.MERKLE_ROOT_MULTISIG, + multisig, + ); + // zkSync uses a different ISM for the message ID const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => - multisigConfigToIsmConfig(IsmType.MESSAGE_ID_MULTISIG, multisig); + multisigConfigToIsmConfig( + isZksyncChain + ? IsmType.STORAGE_MESSAGE_ID_MULTISIG + : IsmType.MESSAGE_ID_MULTISIG, + multisig, + ); const routingIsm: RoutingIsmConfig = { type: IsmType.ROUTING, @@ -52,17 +74,30 @@ export const core: ChainMap = objMap( ...owner, }; + // No static aggregation ISM support on zkSync + const defaultZkSyncIsm = (): RoutingIsmConfig => ({ + type: IsmType.ROUTING, + domains: objMap( + originMultisigs, + (_, multisig): MultisigIsmConfig => messageIdIsm(multisig), + ), + ...owner, + }); + const pausableIsm: PausableIsmConfig = { type: IsmType.PAUSABLE, paused: false, owner: DEPLOYER, // keep pausable hot }; - const defaultIsm: AggregationIsmConfig = { - type: IsmType.AGGREGATION, - modules: [routingIsm, pausableIsm], - threshold: 2, - }; + // No static aggregation ISM support on zkSync + const defaultIsm: AggregationIsmConfig | RoutingIsmConfig = isZksyncChain + ? defaultZkSyncIsm() + : { + type: IsmType.AGGREGATION, + modules: [routingIsm, pausableIsm], + threshold: 2, + }; const merkleHook: MerkleTreeHookConfig = { type: HookType.MERKLE_TREE, @@ -75,30 +110,45 @@ export const core: ChainMap = objMap( paused: false, owner: DEPLOYER, // keep pausable hot }; - const aggregationHooks = objMap( + + // No static aggregation hook support on zkSync + const defaultHookDomains = objMap( originMultisigs, - (_origin, _): AggregationHookConfig => ({ - type: HookType.AGGREGATION, - hooks: [pausableHook, merkleHook, igpHook], - }), + (_origin, _): AggregationHookConfig | IgpConfig => { + return isZksyncChain + ? igpHook + : { + type: HookType.AGGREGATION, + hooks: [pausableHook, merkleHook, igpHook], + }; + }, ); + const defaultHook: FallbackRoutingHookConfig = { type: HookType.FALLBACK_ROUTING, ...owner, - domains: aggregationHooks, + domains: defaultHookDomains, fallback: merkleHook, }; if (typeof owner.owner !== 'string') { throw new Error('beneficiary must be a string'); } - const requiredHook: ProtocolFeeHookConfig = { - type: HookType.PROTOCOL_FEE, - maxProtocolFee: ethers.utils.parseUnits('1', 'gwei').toString(), // 1 gwei of native token - protocolFee: BigNumber.from(0).toString(), // 0 wei - beneficiary: owner.owner as Address, // Owner can be AccountConfig - ...owner, - }; + + // No aggregation hook support on zkSync, so we ignore protocolFee + // and make the merkleTreeHook required + const requiredHook: ProtocolFeeHookConfig | MerkleTreeHookConfig = + isZksyncChain + ? { + type: HookType.MERKLE_TREE, + } + : { + type: HookType.PROTOCOL_FEE, + maxProtocolFee: ethers.utils.parseUnits('1', 'gwei').toString(), // 1 gwei of native token + protocolFee: BigNumber.from(0).toString(), // 0 wei + beneficiary: owner.owner as Address, // Owner can be AccountConfig + ...owner, + }; return { defaultIsm, diff --git a/typescript/infra/config/environments/testnet4/core.ts b/typescript/infra/config/environments/testnet4/core.ts index e40fafb051..a76ab9fd3c 100644 --- a/typescript/infra/config/environments/testnet4/core.ts +++ b/typescript/infra/config/environments/testnet4/core.ts @@ -4,9 +4,11 @@ import { AggregationHookConfig, AggregationIsmConfig, ChainMap, + ChainTechnicalStack, CoreConfig, FallbackRoutingHookConfig, HookType, + IgpConfig, IsmType, MerkleTreeHookConfig, MultisigConfig, @@ -36,11 +38,26 @@ export const core: ChainMap = objMap( .map((origin) => [origin, defaultMultisigConfigs[origin]]), ); - const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => - multisigConfigToIsmConfig(IsmType.MERKLE_ROOT_MULTISIG, multisig); + const isZksyncChain = + getChain(local).technicalStack === ChainTechnicalStack.ZkSync; + // zkSync uses a different ISM for the merkle root + const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => + multisigConfigToIsmConfig( + isZksyncChain + ? IsmType.STORAGE_MERKLE_ROOT_MULTISIG + : IsmType.MERKLE_ROOT_MULTISIG, + multisig, + ); + + // zkSync uses a different ISM for the message ID const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => - multisigConfigToIsmConfig(IsmType.MESSAGE_ID_MULTISIG, multisig); + multisigConfigToIsmConfig( + isZksyncChain + ? IsmType.STORAGE_MESSAGE_ID_MULTISIG + : IsmType.MESSAGE_ID_MULTISIG, + multisig, + ); const routingIsm: RoutingIsmConfig = { type: IsmType.ROUTING, @@ -55,17 +72,30 @@ export const core: ChainMap = objMap( ...ownerConfig, }; + // No static aggregation ISM support on zkSync + const defaultZkSyncIsm = (): RoutingIsmConfig => ({ + type: IsmType.ROUTING, + domains: objMap( + originMultisigs, + (_, multisig): MultisigIsmConfig => messageIdIsm(multisig), + ), + ...ownerConfig, + }); + const pausableIsm: PausableIsmConfig = { type: IsmType.PAUSABLE, paused: false, ...ownerConfig, }; - const defaultIsm: AggregationIsmConfig = { - type: IsmType.AGGREGATION, - modules: [routingIsm, pausableIsm], - threshold: 2, - }; + // No static aggregation ISM support on zkSync + const defaultIsm: AggregationIsmConfig | RoutingIsmConfig = isZksyncChain + ? defaultZkSyncIsm() + : { + type: IsmType.AGGREGATION, + modules: [routingIsm, pausableIsm], + threshold: 2, + }; const merkleHook: MerkleTreeHookConfig = { type: HookType.MERKLE_TREE, @@ -79,28 +109,44 @@ export const core: ChainMap = objMap( ...ownerConfig, }; - const aggregationHooks = objMap( + // No static aggregation hook support on zkSync + const defaultHookDomains = objMap( originMultisigs, - (_origin, _): AggregationHookConfig => ({ - type: HookType.AGGREGATION, - hooks: [pausableHook, merkleHook, igpHook], - }), + (_origin, _): AggregationHookConfig | IgpConfig => { + return isZksyncChain + ? igpHook + : { + type: HookType.AGGREGATION, + hooks: [pausableHook, merkleHook, igpHook], + }; + }, ); const defaultHook: FallbackRoutingHookConfig = { type: HookType.FALLBACK_ROUTING, ...ownerConfig, - domains: aggregationHooks, + domains: defaultHookDomains, fallback: merkleHook, }; - const requiredHook: ProtocolFeeHookConfig = { - type: HookType.PROTOCOL_FEE, - maxProtocolFee: ethers.utils.parseUnits('1', 'gwei').toString(), // 1 gwei of native token - protocolFee: BigNumber.from(1).toString(), // 1 wei of native token - beneficiary: ownerConfig.owner as Address, - ...ownerConfig, - }; + if (typeof ownerConfig.owner !== 'string') { + throw new Error('beneficiary must be a string'); + } + + // No aggregation hook support on zkSync, so we ignore protocolFee + // and make the merkleTreeHook required + const requiredHook: ProtocolFeeHookConfig | MerkleTreeHookConfig = + isZksyncChain + ? { + type: HookType.MERKLE_TREE, + } + : { + type: HookType.PROTOCOL_FEE, + maxProtocolFee: ethers.utils.parseUnits('1', 'gwei').toString(), // 1 gwei of native token + protocolFee: BigNumber.from(1).toString(), // 1 wei of native token + beneficiary: ownerConfig.owner as Address, + ...ownerConfig, + }; return { defaultIsm, diff --git a/typescript/sdk/src/ism/EvmIsmReader.ts b/typescript/sdk/src/ism/EvmIsmReader.ts index a6d0751188..2848fd18ec 100644 --- a/typescript/sdk/src/ism/EvmIsmReader.ts +++ b/typescript/sdk/src/ism/EvmIsmReader.ts @@ -23,6 +23,7 @@ import { import { DEFAULT_CONTRACT_READ_CONCURRENCY } from '../consts/concurrency.js'; import { DispatchedMessage } from '../core/types.js'; +import { ChainTechnicalStack } from '../metadata/chainMetadataTypes.js'; import { MultiProvider } from '../providers/MultiProvider.js'; import { ChainNameOrId } from '../types.js'; import { HyperlaneReader } from '../utils/HyperlaneReader.js'; @@ -62,6 +63,7 @@ export interface IsmReader { export class EvmIsmReader extends HyperlaneReader implements IsmReader { protected readonly logger = rootLogger.child({ module: 'EvmIsmReader' }); + protected isZkSyncChain: boolean; constructor( protected readonly multiProvider: MultiProvider, @@ -72,6 +74,12 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { protected readonly messageContext?: DispatchedMessage, ) { super(multiProvider, chain); + + // So we can distinguish between Storage/Static ISMs + const chainTechnicalStack = this.multiProvider.getChainMetadata( + this.chain, + ).technicalStack; + this.isZkSyncChain = chainTechnicalStack === ChainTechnicalStack.ZkSync; } async deriveIsmConfig(address: Address): Promise { @@ -208,9 +216,14 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { async (module) => this.deriveIsmConfig(module), ); + // If it's a zkSync chain, it must be a StorageAggregationIsm + const ismType = this.isZkSyncChain + ? IsmType.STORAGE_AGGREGATION + : IsmType.AGGREGATION; + return { address, - type: IsmType.AGGREGATION, + type: ismType, modules: ismConfigs, threshold, }; @@ -227,11 +240,19 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { `expected module type to be ${ModuleType.MERKLE_ROOT_MULTISIG} or ${ModuleType.MESSAGE_ID_MULTISIG}, got ${moduleType}`, ); - const ismType = + let ismType = moduleType === ModuleType.MERKLE_ROOT_MULTISIG ? IsmType.MERKLE_ROOT_MULTISIG : IsmType.MESSAGE_ID_MULTISIG; + // If it's a zkSync chain, it must be a StorageMultisigIsm + if (this.isZkSyncChain) { + ismType = + moduleType === ModuleType.MERKLE_ROOT_MULTISIG + ? IsmType.STORAGE_MERKLE_ROOT_MULTISIG + : IsmType.STORAGE_MESSAGE_ID_MULTISIG; + } + const [validators, threshold] = await ism.validatorsAndThreshold( ethers.constants.AddressZero, ); From 576558778ad7261f26356da2faa054da95a5c156 Mon Sep 17 00:00:00 2001 From: xeno097 Date: Fri, 10 Jan 2025 16:35:56 -0400 Subject: [PATCH 51/81] feat(infra): added superseed USDT and OP config getters (#5130) ### Description Adds config getters for OP and USDT routes on supersede Related registry PRs: - https://github.com/hyperlane-xyz/hyperlane-registry/pull/473 - https://github.com/hyperlane-xyz/hyperlane-registry/pull/474 ### Drive-by changes - NO ### Related issues - ### Backward compatibility - YES ### Testing - CLI - UI --- .../configGetters/getSuperseedWarpConfigs.ts | 55 +++++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 2 + typescript/infra/config/warp.ts | 6 ++ typescript/infra/src/config/warp.ts | 1 + 4 files changed, 64 insertions(+) create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.ts diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.ts new file mode 100644 index 0000000000..e10d681579 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.ts @@ -0,0 +1,55 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const safeOwners: ChainMap
= { + ethereum: '0x11BEBBf509248735203BAAAe90c1a27EEE70D567', + superseed: '0x6652010BaCE855DF870D427daA6141c313994929', + optimism: '0x0D493D7E51212bbBF0F1ca4bcfA1E5514C7fEF10', +}; + +export const getEthereumSuperseedUSDTConfig = async ( + routerConfig: ChainMap, +): Promise> => { + return { + ethereum: { + ...routerConfig.ethereum, + owner: safeOwners.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.USDT, + interchainSecurityModule: ethers.constants.AddressZero, + }, + superseed: { + ...routerConfig.superseed, + owner: safeOwners.superseed, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }, + }; +}; + +export const getOptimismSuperseedOPConfig = async ( + routerConfig: ChainMap, +): Promise> => { + return { + optimism: { + ...routerConfig.optimism, + owner: safeOwners.optimism, + type: TokenType.collateral, + token: tokens.optimism.OP, + interchainSecurityModule: ethers.constants.AddressZero, + }, + superseed: { + ...routerConfig.superseed, + owner: safeOwners.superseed, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 32db67821f..780ebc079c 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -42,6 +42,8 @@ export enum WarpRouteIds { ArbitrumBaseBlastBscEthereumGnosisLiskMantleModeOptimismPolygonScrollZeroNetworkZoraMainnet = 'ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet', AppchainBaseUSDC = 'USDC/appchain-base', BobaBsquaredSwellUBTC = 'UBTC/boba-bsquared-swell', + EthereumSuperseedUSDT = 'USDT/ethereum-superseed', + OptimismSuperseedOP = 'OP/optimism-superseed', EthereumZircuitRstETH = 'rstETH/ethereum-zircuit', EthereumFormWBTC = 'WBTC/ethereum-form', EthereumFormWSTETH = 'WSTETH/ethereum-form', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index 75da6ba959..5318a9ca2b 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -48,6 +48,10 @@ import { getInevmInjectiveINJWarpConfig } from './environments/mainnet3/warp/con import { getMantapacificNeutronTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.js'; import { getRenzoEZETHWarpConfig } from './environments/mainnet3/warp/configGetters/getRenzoEZETHWarpConfig.js'; import { getRenzoPZETHWarpConfig } from './environments/mainnet3/warp/configGetters/getRenzoPZETHWarpConfig.js'; +import { + getEthereumSuperseedUSDTConfig, + getOptimismSuperseedOPConfig, +} from './environments/mainnet3/warp/configGetters/getSuperseedWarpConfigs.js'; import { WarpRouteIds } from './environments/mainnet3/warp/warpIds.js'; type WarpConfigGetter = ( @@ -93,6 +97,8 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.AppchainBaseUSDC]: getAppChainBaseUSDCWarpConfig, [WarpRouteIds.BobaBsquaredSwellUBTC]: getBobaBsquaredSwellUBTCWarpConfig, [WarpRouteIds.EthereumZircuitRe7LRT]: getEthereumZircuitRe7LRTWarpConfig, + [WarpRouteIds.EthereumSuperseedUSDT]: getEthereumSuperseedUSDTConfig, + [WarpRouteIds.OptimismSuperseedOP]: getOptimismSuperseedOPConfig, [WarpRouteIds.EthereumZircuitRstETH]: getEthereumZircuitRstETHWarpConfig, [WarpRouteIds.EthereumFormWBTC]: getEthereumFormWBTCWarpConfig, [WarpRouteIds.EthereumFormWSTETH]: getEthereumFormWSTETHWarpConfig, diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index e3a04dda95..48e3425701 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -54,6 +54,7 @@ export const tokens: ChainMap> = { }, optimism: { USDC: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', + OP: '0x4200000000000000000000000000000000000042', }, gnosis: { WETH: '0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1', From 585404df9e28cd6d944e0caca088a3c6aa02c042 Mon Sep 17 00:00:00 2001 From: Tien Dao <15717476+tiendn@users.noreply.github.com> Date: Sat, 11 Jan 2025 20:32:42 +0700 Subject: [PATCH 52/81] feat: enhance block explorer utility tests with edge cases and multiple explorers (#5147) ### Description - Added comprehensive tests for block explorer utilities, covering edge cases such as chains without block explorers and chains without API URLs. - Implemented tests for handling multiple block explorers, ensuring correct explorer selection by index. - Included tests for special chain names and proper URL handling, particularly with trailing slashes. ### Drive-by changes ### Related issues ### Backward compatibility ### Testing All new tests have been implemented and verified for correctness. --- .../sdk/src/metadata/blockExplorer.test.ts | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/typescript/sdk/src/metadata/blockExplorer.test.ts b/typescript/sdk/src/metadata/blockExplorer.test.ts index 53a358876b..3856668410 100644 --- a/typescript/sdk/src/metadata/blockExplorer.test.ts +++ b/typescript/sdk/src/metadata/blockExplorer.test.ts @@ -1,5 +1,7 @@ import { expect } from 'chai'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + import { test1, testCosmosChain, @@ -8,6 +10,7 @@ import { import { getExplorerAddressUrl, + getExplorerApi, getExplorerApiUrl, getExplorerBaseUrl, getExplorerTxUrl, @@ -52,4 +55,120 @@ describe('Block explorer utils', () => { ); }); }); + + describe('Edge cases', () => { + const emptyChain = { + protocol: ProtocolType.Ethereum, + name: 'empty', + domainId: 1, + chainId: 1, + rpcUrls: [{ http: 'https://empty.test' }], + }; + + const chainWithoutApi = { + protocol: ProtocolType.Ethereum, + name: 'noapi', + chainId: 1, + domainId: 1, + rpcUrls: [{ http: 'https://noapi.test' }], + blockExplorers: [ + { + name: 'test', + url: 'https://test.com', + apiUrl: '', + }, + ], + }; + + it('handles chain without block explorers', () => { + expect(getExplorerBaseUrl(emptyChain)).to.be.null; + expect(getExplorerApi(emptyChain)).to.be.null; + expect(getExplorerTxUrl(emptyChain, '0x123')).to.be.null; + expect(getExplorerAddressUrl(emptyChain, '0x123')).to.be.null; + }); + + it('handles chain without api url', () => { + expect(getExplorerBaseUrl(chainWithoutApi)).to.equal('https://test.com/'); + expect(getExplorerApi(chainWithoutApi)).to.be.null; + }); + }); + + describe('Multiple block explorers', () => { + const multiExplorerChain = { + protocol: ProtocolType.Ethereum, + name: 'multi', + domainId: 1, + chainId: 1, + rpcUrls: [{ http: 'https://multi.test' }], + blockExplorers: [ + { + name: 'first', + url: 'https://first.com', + apiUrl: 'https://api.first.com', + apiKey: 'key1', + }, + { + name: 'second', + url: 'https://second.com', + apiUrl: 'https://api.second.com', + apiKey: 'key2', + }, + ], + }; + + it('uses correct explorer by index', () => { + expect(getExplorerBaseUrl(multiExplorerChain, 1)).to.equal( + 'https://second.com/', + ); + expect(getExplorerApiUrl(multiExplorerChain, 1)).to.equal( + 'https://api.second.com/?apikey=key2', + ); + }); + }); + + describe('Special chain names with different common paths', () => { + const nautilusChain = { + protocol: ProtocolType.Ethereum, + name: 'nautilus', + chainId: 1, + domainId: 1, + rpcUrls: [{ http: 'https://nautilus.test' }], + blockExplorers: [ + { + name: 'nautilus', + url: 'https://nautilus.com', + apiUrl: 'https://api.nautilus.com', + }, + ], + }; + + it('uses correct transaction path for special chains', () => { + expect(getExplorerTxUrl(nautilusChain, '0x123')).to.equal( + 'https://nautilus.com/transaction/0x123', + ); + }); + }); + + describe('URL handling', () => { + const chainWithTrailingSlash = { + protocol: ProtocolType.Ethereum, + name: 'test', + domainId: 1, + chainId: 1, + rpcUrls: [{ http: 'https://test.chain' }], + blockExplorers: [ + { + name: 'test', + url: 'https://test.com/', + apiUrl: 'https://api.test.com', + }, + ], + }; + + it('handles trailing slashes correctly', () => { + expect(getExplorerTxUrl(chainWithTrailingSlash, '0x123')).to.equal( + 'https://test.com/tx/0x123', + ); + }); + }); }); From 9ab961a797ff1a809e920efcb738cb2db884b255 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Mon, 13 Jan 2025 09:34:22 +0000 Subject: [PATCH 53/81] feat: deploy jan 6 batch (#5144) ### Description deploy jan 6 batch: - artela guru hemi nero xpla acala/subtensor deferred due to deploy issues ### Drive-by changes - igp updates - fix to validator config validity check - cherry-picked https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/5145 ### Related issues https://github.com/hyperlane-xyz/hyperlane-registry/pull/476 ### Backward compatibility ### Testing manual --------- Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com> Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> Co-authored-by: Trevor Porter --- .changeset/serious-kangaroos-chew.md | 5 + .registryrc | 2 +- .../hyperlane-sealevel/src/rpc/client.rs | 17 +- rust/main/config/mainnet_config.json | 339 +++++++++++++- .../config/environments/mainnet3/agent.ts | 30 +- .../mainnet3/aw-validators/hyperlane.json | 15 + .../mainnet3/core/verification.json | 326 +++++++++++++ .../config/environments/mainnet3/funding.ts | 9 +- .../environments/mainnet3/gasPrices.json | 50 +- .../mainnet3/ism/verification.json | 430 ++++++++++++++++++ .../middleware/accounts/verification.json | 105 +++++ .../mainnet3/supportedChainNames.ts | 7 + .../environments/mainnet3/tokenPrices.json | 225 ++++----- .../environments/mainnet3/validators.ts | 71 +++ typescript/infra/scripts/agent-utils.ts | 15 +- typescript/sdk/src/consts/multisigIsm.ts | 70 +++ 16 files changed, 1582 insertions(+), 134 deletions(-) create mode 100644 .changeset/serious-kangaroos-chew.md diff --git a/.changeset/serious-kangaroos-chew.md b/.changeset/serious-kangaroos-chew.md new file mode 100644 index 0000000000..87d5b072f9 --- /dev/null +++ b/.changeset/serious-kangaroos-chew.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Deploy to new chains: artela, guru, hemi, nero, xpla. diff --git a/.registryrc b/.registryrc index f1d8706f5d..4b56572aa1 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -115d44069109f3ef43caeed5632f6255d9a3390a +2184e5e3064ddec2734aa53c1aff6d9f7d958bdf diff --git a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs index b1ae47de11..f9b08170a5 100644 --- a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs +++ b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs @@ -36,7 +36,7 @@ use crate::{ const COMPUTE_UNIT_MULTIPLIER_NUMERATOR: u32 = 11; const COMPUTE_UNIT_MULTIPLIER_DENOMINATOR: u32 = 10; -const PRIORITY_FEE_MULTIPLIER_NUMERATOR: u64 = 125; +const PRIORITY_FEE_MULTIPLIER_NUMERATOR: u64 = 110; const PRIORITY_FEE_MULTIPLIER_DENOMINATOR: u64 = 100; pub struct SealevelTxCostEstimate { @@ -401,7 +401,20 @@ impl SealevelRpcClient { / COMPUTE_UNIT_MULTIPLIER_DENOMINATOR, ); - let priority_fee = priority_fee_oracle.get_priority_fee(&simulation_tx).await?; + let mut priority_fee = priority_fee_oracle.get_priority_fee(&simulation_tx).await?; + + if let Ok(max_priority_fee) = std::env::var("SVM_MAX_PRIORITY_FEE") { + let max_priority_fee = max_priority_fee.parse()?; + if priority_fee > max_priority_fee { + tracing::info!( + priority_fee, + max_priority_fee, + "Estimated priority fee is very high, capping to a max", + ); + priority_fee = max_priority_fee; + } + } + // Bump the priority fee to be conservative let priority_fee = (priority_fee * PRIORITY_FEE_MULTIPLIER_NUMERATOR) / PRIORITY_FEE_MULTIPLIER_DENOMINATOR; diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 4ba4dc3970..77ec76fbd9 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -6928,7 +6928,8 @@ "validatorAnnounce": "0x84444cE490233CFa76E3F1029bc166aa8c266907", "index": { "from": 469384 - } + }, + "gnosisSafeTransactionServiceUrl": "https://prod.form.keypersafe.xyz/" }, "ink": { "blockExplorers": [ @@ -6992,7 +6993,8 @@ "validatorAnnounce": "0x426a3CE72C1586b1867F9339550371E86DB3e396", "index": { "from": 860343 - } + }, + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-ink.safe.global/" }, "rivalz": { "blockExplorers": [ @@ -7294,7 +7296,7 @@ ], "technicalStack": "other", "interchainGasPaymaster": "Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ", - "interchainSecurityModule": "4fPoa26ayqY1cwY3AcqUPvdLLNHpjJGdDQevtnTLAAnH", + "interchainSecurityModule": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM", "mailbox": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", "merkleTreeHook": "Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj", "validatorAnnounce": "GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz" @@ -7331,6 +7333,9 @@ "rpcUrls": [ { "http": "https://api-hyperlane.nodes.torus.network" + }, + { + "http": "https://api.torus.network" } ], "technicalStack": "polkadotsubstrate", @@ -7362,6 +7367,334 @@ "index": { "from": 40622 } + }, + "artela": { + "blockExplorers": [ + { + "apiUrl": "https://artscan.artela.network/api", + "family": "other", + "name": "Artela Explorer", + "url": "https://artscan.artela.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 11820, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Artela", + "domainId": 11820, + "gasCurrencyCoinGeckoId": "artela", + "name": "artela", + "nativeToken": { + "decimals": 18, + "name": "Artela", + "symbol": "ART" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://node-euro.artela.network/rpc" + }, + { + "http": "https://node-hongkong.artela.network/rpc" + } + ], + "technicalStack": "other", + "aggregationHook": "0x79B1c9E49396A62AFf9B072A0DebD010D4b80455", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountIsm": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "interchainAccountRouter": "0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB", + "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "pausableIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", + "protocolFee": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "testRecipient": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "index": { + "from": 75891 + } + }, + "guru": { + "blockExplorers": [ + { + "apiUrl": "https://blockscout.gurunetwork.ai/api", + "family": "blockscout", + "name": "Guru Explorer", + "url": "https://blockscout.gurunetwork.ai" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 260, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Guru Network", + "domainId": 260, + "gasCurrencyCoinGeckoId": "guru-network", + "name": "guru", + "nativeToken": { + "decimals": 18, + "name": "Guru Network", + "symbol": "GURU" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.gurunetwork.ai/archive/260" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x84cfF1F756DF5d1532DAD539ABCE18eE328c84f7", + "domainRoutingIsm": "0x494415e823236A05c608D6b777bC80082cED6A2E", + "domainRoutingIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "fallbackRoutingHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "interchainAccountIsm": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "interchainAccountRouter": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187", + "interchainGasPaymaster": "0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b", + "interchainSecurityModule": "0xDbCf838Fbf126D0d99B7D384dA416663A97Da867", + "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "merkleTreeHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "pausableHook": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "pausableIsm": "0xD8aF449f8fEFbA2064863DCE5aC248F8B232635F", + "protocolFee": "0xff72A726Ce261846f2dF6F32113e514b5Ddb0E37", + "proxyAdmin": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "staticAggregationHookFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "staticAggregationIsm": "0xDbCf838Fbf126D0d99B7D384dA416663A97Da867", + "staticAggregationIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticMerkleRootMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMerkleRootWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "staticMessageIdMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMessageIdWeightedMultisigIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "storageGasOracle": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "testRecipient": "0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "index": { + "from": 4511934 + } + }, + "hemi": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.hemi.xyz/api", + "family": "blockscout", + "name": "Hemi Explorer", + "url": "https://explorer.hemi.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 12, + "reorgPeriod": 5 + }, + "chainId": 43111, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Hemi Network", + "domainId": 43111, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "hemi", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.hemi.network/rpc" + } + ], + "technicalStack": "other", + "aggregationHook": "0x79B1c9E49396A62AFf9B072A0DebD010D4b80455", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountIsm": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9", + "interchainAccountRouter": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", + "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "pausableIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", + "protocolFee": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "testRecipient": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "index": { + "from": 881513 + } + }, + "nero": { + "blockExplorers": [ + { + "apiUrl": "https://api.neroscan.io/api", + "family": "etherscan", + "name": "Neroscan", + "url": "https://www.neroscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 5 + }, + "chainId": 1689, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Nero", + "domainId": 1689, + "gasCurrencyCoinGeckoId": "nerochain", + "gnosisSafeTransactionServiceUrl": "https://multisign.nerochain.io/txs/", + "name": "nero", + "nativeToken": { + "decimals": 18, + "name": "Nero", + "symbol": "NERO" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.nerochain.io" + } + ], + "technicalStack": "other", + "aggregationHook": "0x79B1c9E49396A62AFf9B072A0DebD010D4b80455", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountIsm": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", + "interchainAccountRouter": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "pausableIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", + "protocolFee": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "testRecipient": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "index": { + "from": 1623141 + }, + "transactionOverrides": { + "maxFeePerGas": 10000000000, + "maxPriorityFeePerGas": 1000000000 + } + }, + "xpla": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.xpla.io/mainnet/api", + "family": "other", + "name": "XPLA Explorer", + "url": "https://explorer.xpla.io/mainnet" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 6, + "reorgPeriod": 5 + }, + "chainId": 37, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "XPLA", + "domainId": 37, + "gasCurrencyCoinGeckoId": "xpla", + "name": "xpla", + "nativeToken": { + "decimals": 18, + "name": "XPLA", + "symbol": "XPLA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://dimension-evm-rpc.xpla.dev" + } + ], + "technicalStack": "other", + "aggregationHook": "0xC4d5F57ac4C1D076E13D5fE299AB26c8f5698454", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "interchainAccountIsm": "0xE350143242a2F7962F23D71ee9Dd98f6e86D1772", + "interchainAccountRouter": "0x5B24EE24049582fF74c1d311d72c70bA5B76a554", + "interchainGasPaymaster": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "interchainSecurityModule": "0x4d33DB9EEb44274BA7362DF412392E70D9F53F16", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "pausableIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", + "protocolFee": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "testRecipient": "0x7Ce3a48cd9FD80004d95b088760bD05bA86C1f7b", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e", + "index": { + "from": 12446115 + } } }, "defaultRpcConsensusType": "fallback" diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 15be7f1540..32898263bc 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -59,12 +59,14 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< > = { // Generally, we run all production validators in the Hyperlane context. [Role.Validator]: { + // acala: true, ancient8: true, alephzeroevmmainnet: true, apechain: true, appchain: true, arbitrum: true, arbitrumnova: true, + artela: true, arthera: true, astar: true, astarzkevm: true, @@ -104,7 +106,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, injective: true, @@ -126,6 +130,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< molten: true, moonbeam: true, morph: true, + nero: true, neutron: true, oortmainnet: true, optimism: true, @@ -151,6 +156,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< sonic: true, soon: true, stride: false, + // subtensor: true, superseed: true, superpositionmainnet: true, swell: true, @@ -165,6 +171,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -173,12 +180,14 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< zoramainnet: true, }, [Role.Relayer]: { + // acala: true, ancient8: true, alephzeroevmmainnet: true, apechain: true, appchain: true, arbitrum: true, arbitrumnova: true, + artela: true, arthera: true, astar: true, astarzkevm: true, @@ -218,7 +227,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, injective: true, @@ -240,6 +251,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< molten: true, moonbeam: true, morph: true, + nero: true, // At the moment, we only relay between Neutron and Manta Pacific on the neutron context. neutron: false, oortmainnet: true, @@ -266,6 +278,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< sonic: true, soon: true, stride: true, + // subtensor: true, superseed: true, superpositionmainnet: true, swell: true, @@ -280,6 +293,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -288,17 +302,18 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< zoramainnet: true, }, [Role.Scraper]: { + // acala: true, ancient8: true, alephzeroevmmainnet: true, apechain: true, appchain: true, arbitrum: true, arbitrumnova: true, + artela: true, arthera: true, astar: true, astarzkevm: true, aurora: true, - flame: true, avalanche: true, b3: true, base: true, @@ -325,6 +340,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< everclear: true, evmos: true, fantom: true, + flame: true, flare: true, flowmainnet: true, form: true, @@ -333,7 +349,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< fusemainnet: true, gnosis: true, gravity: true, + guru: true, harmony: true, + hemi: true, immutablezkevmmainnet: true, inevm: true, ink: true, @@ -355,6 +373,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< molten: true, moonbeam: true, morph: true, + nero: true, neutron: true, oortmainnet: true, optimism: true, @@ -380,6 +399,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< sonic: true, soon: false, stride: true, + // subtensor: true, superseed: true, superpositionmainnet: true, swell: true, @@ -395,6 +415,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< worldchain: true, xai: true, xlayer: true, + xpla: true, zeronetwork: true, zetachain: true, zircuit: true, @@ -601,6 +622,7 @@ const blacklistedMessageIds = [ // MAGIC/ethereum-treasure native funding txs '0x9d51f4123be816cbaeef2e2b34a5760f633a7cb8a019fe16f88a3227cc22451e', '0x663c221137028ceeeb102a98e48b362a7b48d626b93c88c7fdf1871a948b1223', + '0xbcc3e52dbc909f75425f4bdd83c94a31d8e3bc816422396dbe1f796ff8a5aadd', // txs between unenrolled routers of // ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet @@ -630,7 +652,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'df9c1ed-20250109-151923', + tag: '53fafa6-20250110-125541', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, @@ -640,7 +662,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '2d4963c-20250109-221753', + tag: '53fafa6-20250110-125541', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -650,7 +672,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '2d4963c-20250109-221753', + tag: '53fafa6-20250110-125541', }, resources: scraperResources, }, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index cff89b8cc6..f187ecc3b2 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -21,6 +21,9 @@ "arbitrumnova": { "validators": ["0xd2a5e9123308d187383c87053811a2c21bd8af1f"] }, + "artela": { + "validators": ["0x8fcc1ebd4c0b463618db13f83e4565af3e166b00"] + }, "arthera": { "validators": ["0x13710ac11c36c169f62fba95767ae59a1e57098d"] }, @@ -159,9 +162,15 @@ "gravity": { "validators": ["0x23d549bf757a02a6f6068e9363196ecd958c974e"] }, + "guru": { + "validators": ["0x0d756d9051f12c4de6aee2ee972193a2adfe00ef"] + }, "harmony": { "validators": ["0xd677803a67651974b1c264171b5d7ca8838db8d5"] }, + "hemi": { + "validators": ["0x312dc72c17d01f3fd0abd31dd9b569bc473266dd"] + }, "immutablezkevmmainnet": { "validators": ["0xbdda85b19a5efbe09e52a32db1a072f043dd66da"] }, @@ -237,6 +246,9 @@ "morph": { "validators": ["0x4884535f393151ec419add872100d352f71af380"] }, + "nero": { + "validators": ["0xb86f872df37f11f33acbe75b6ed208b872b57183"] + }, "neutron": { "validators": [ "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", @@ -371,6 +383,9 @@ "xlayer": { "validators": ["0xa2ae7c594703e988f23d97220717c513db638ea3"] }, + "xpla": { + "validators": ["0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e"] + }, "zeronetwork": { "validators": ["0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87"] }, diff --git a/typescript/infra/config/environments/mainnet3/core/verification.json b/typescript/infra/config/environments/mainnet3/core/verification.json index e16dc3d9c4..26870e4077 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -7038,5 +7038,331 @@ "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", "isProxy": false } + ], + "artela": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000002e2c", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000007b032cbb00ad7438e802a66d8b64761a06e5df22", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "constructorArguments": "000000000000000000000000028b04386031b9648a8d78d06c58f6e763be5cd00000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0" + }, + { + "name": "ProtocolFee", + "address": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "guru": [ + { + "name": "ProxyAdmin", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000104", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E" + }, + { + "name": "MerkleTreeHook", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000011b76d93a9d39eb51f54ebf5566308640cde882b", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b", + "constructorArguments": "000000000000000000000000f457d831d9f55e87b2f0b35ad6d033fd6b4181ed000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed" + }, + { + "name": "ProtocolFee", + "address": "0xff72A726Ce261846f2dF6F32113e514b5Ddb0E37", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7", + "isProxy": false + } + ], + "xpla": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000025", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "InterchainGasPaymaster", + "address": "0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "constructorArguments": "000000000000000000000000e885941af52eab9e7f4c67392eacd96ea2a65d9b0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B" + }, + { + "name": "ProtocolFee", + "address": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "nero": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000699", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000007b032cbb00ad7438e802a66d8b64761a06e5df22", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "constructorArguments": "000000000000000000000000028b04386031b9648a8d78d06c58f6e763be5cd00000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0" + }, + { + "name": "ProtocolFee", + "address": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "hemi": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "000000000000000000000000000000000000000000000000000000000000a867", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000007b032cbb00ad7438e802a66d8b64761a06e5df22", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", + "constructorArguments": "000000000000000000000000028b04386031b9648a8d78d06c58f6e763be5cd00000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x028B04386031b9648A8D78d06c58F6E763Be5cD0" + }, + { + "name": "ProtocolFee", + "address": "0x46008F5971eFb16e6c354Ef993EA021B489bc055", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xb89c6ED617f5F46175E41551350725A09110bbCE", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } ] } diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index ae01eb3e5b..1e764c6707 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '706f69b-20250107-230147', + tag: 'dc89eb1-20250110-113045', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron @@ -26,12 +26,14 @@ export const keyFunderConfig: KeyFunderConfig< }, // desired balance config, must be set for each chain desiredBalancePerChain: { + // acala: '5', ancient8: '0.5', alephzeroevmmainnet: '100', apechain: '50', appchain: '0.05', arbitrum: '0.5', arbitrumnova: '0.05', + artela: '2', arthera: '0.1', astar: '100', astarzkevm: '0.05', @@ -70,7 +72,9 @@ export const keyFunderConfig: KeyFunderConfig< fusemainnet: '20', gnosis: '5', gravity: '500', + guru: '100', harmony: '500', + hemi: '0.05', immutablezkevmmainnet: '25', inevm: '3', ink: '0.05', @@ -91,6 +95,7 @@ export const keyFunderConfig: KeyFunderConfig< molten: '3', moonbeam: '100', morph: '0.1', + nero: '5', oortmainnet: '2000', optimism: '0.5', orderly: '0.05', @@ -113,6 +118,7 @@ export const keyFunderConfig: KeyFunderConfig< sonic: '0.5', // ignore non-evm chains stride: '0', + // subtensor: '0.05', superseed: '0.05', superpositionmainnet: '0.05', swell: '0.05', @@ -128,6 +134,7 @@ export const keyFunderConfig: KeyFunderConfig< worldchain: '0.2', xai: '20', xlayer: '0.5', + xpla: '100', zeronetwork: '0.05', zetachain: '20', zircuit: '0.02', diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index a001f27802..5703d9e54f 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -1,4 +1,8 @@ { + "acala": { + "amount": "100.007736839", + "decimals": 9 + }, "ancient8": { "amount": "0.001000252", "decimals": 9 @@ -16,15 +20,19 @@ "decimals": 9 }, "arbitrum": { - "amount": "0.123544", + "amount": "0.017143", "decimals": 9 }, "arbitrumnova": { "amount": "0.01", "decimals": 9 }, + "artela": { + "amount": "27.5", + "decimals": 9 + }, "arthera": { - "amount": "1.025057", + "amount": "1.025069", "decimals": 9 }, "astar": { @@ -32,7 +40,7 @@ "decimals": 9 }, "astarzkevm": { - "amount": "0.087", + "amount": "0.165", "decimals": 9 }, "aurora": { @@ -48,7 +56,7 @@ "decimals": 9 }, "b3": { - "amount": "0.001000285", + "amount": "0.001000252", "decimals": 9 }, "base": { @@ -132,7 +140,7 @@ "decimals": 9 }, "ethereum": { - "amount": "10.885220772", + "amount": "20.047740244", "decimals": 9 }, "everclear": { @@ -175,12 +183,20 @@ "amount": "1800.0", "decimals": 9 }, + "guru": { + "amount": "0.001000252", + "decimals": 9 + }, "harmony": { "amount": "100.0", "decimals": 9 }, + "hemi": { + "amount": "0.001000252", + "decimals": 9 + }, "immutablezkevmmainnet": { - "amount": "11.000000049", + "amount": "11.00000005", "decimals": 9 }, "inevm": { @@ -208,7 +224,7 @@ "decimals": 9 }, "lisk": { - "amount": "0.010752839", + "amount": "0.016350221", "decimals": 9 }, "lukso": { @@ -224,7 +240,7 @@ "decimals": 9 }, "mantapacific": { - "amount": "0.003000333", + "amount": "0.003000336", "decimals": 9 }, "mantle": { @@ -240,7 +256,7 @@ "decimals": 9 }, "metis": { - "amount": "1.105835936", + "amount": "1.30558024", "decimals": 9 }, "mint": { @@ -263,6 +279,10 @@ "amount": "0.201", "decimals": 9 }, + "nero": { + "amount": "1.000000007", + "decimals": 9 + }, "neutron": { "amount": "0.0053", "decimals": 1 @@ -332,7 +352,7 @@ "decimals": 9 }, "sei": { - "amount": "3.328028877", + "amount": "7.41885212", "decimals": 9 }, "shibarium": { @@ -363,6 +383,10 @@ "amount": "0.005", "decimals": 1 }, + "subtensor": { + "amount": "10.0", + "decimals": 9 + }, "superseed": { "amount": "0.001000252", "decimals": 9 @@ -408,7 +432,7 @@ "decimals": 9 }, "worldchain": { - "amount": "0.001000346", + "amount": "0.001000345", "decimals": 9 }, "xai": { @@ -419,6 +443,10 @@ "amount": "23.5", "decimals": 9 }, + "xpla": { + "amount": "280.0", + "decimals": 9 + }, "zeronetwork": { "amount": "0.06", "decimals": 9 diff --git a/typescript/infra/config/environments/mainnet3/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index de253c30cd..6c875f658c 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -8820,5 +8820,435 @@ "constructorArguments": "", "isProxy": true } + ], + "artela": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "nero": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "guru": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x7f51A658837A315134A97ff8B586d71B726B7e61", + "constructorArguments": "", + "isProxy": true + } + ], + "hemi": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "xpla": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } ] } diff --git a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json index f591378947..d6951a2ec2 100644 --- a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json +++ b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json @@ -2142,5 +2142,110 @@ "isProxy": true, "expectedimplementation": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785" } + ], + "artela": [ + { + "name": "InterchainAccountIsm", + "address": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB", + "constructorArguments": "000000000000000000000000b201817dfdd822b75fa9b595457e6ee466a7c1870000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000002351fbe24c1212f253b7a300ff0cbcfd97952a19000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187" + } + ], + "nero": [ + { + "name": "InterchainAccountIsm", + "address": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "constructorArguments": "0000000000000000000000008f23872dab3b166cef411eeb6c391ff6ce4195320000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009629c28990f11c31735765a6fd59e1e1bc197dbd000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532" + } + ], + "guru": [ + { + "name": "InterchainAccountIsm", + "address": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9", + "constructorArguments": "0000000000000000000000003a867fcffec2b790970eebdc9023e75b0a172aa7", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187", + "constructorArguments": "0000000000000000000000007937cb2886f01f38210506491a69b0d107ea0ad9000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f23872dab3b166cef411eeb6c391ff6ce419532000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9" + } + ], + "xpla": [ + { + "name": "InterchainAccountIsm", + "address": "0xE350143242a2F7962F23D71ee9Dd98f6e86D1772", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0xa8a750e0Ac90B3f6C05b11F3C0D7D5372cD1a90e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x5B24EE24049582fF74c1d311d72c70bA5B76a554", + "constructorArguments": "000000000000000000000000a8a750e0ac90b3f6c05b11f3c0d7d5372cd1a90e0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e350143242a2f7962f23d71ee9dd98f6e86d1772000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xa8a750e0Ac90B3f6C05b11F3C0D7D5372cD1a90e" + } + ], + "hemi": [ + { + "name": "InterchainAccountIsm", + "address": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", + "constructorArguments": "0000000000000000000000002351fbe24c1212f253b7a300ff0cbcfd97952a190000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000007937cb2886f01f38210506491a69b0d107ea0ad9000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19" + } ] } diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index d1cfa16043..c3d31269a9 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -1,12 +1,14 @@ // These chains may be any protocol type. // Placing them here instead of adjacent chains file to avoid circular dep export const mainnet3SupportedChainNames = [ + // 'acala', 'ancient8', 'alephzeroevmmainnet', 'apechain', 'appchain', 'arbitrum', 'arbitrumnova', + 'artela', 'arthera', 'astar', 'astarzkevm', @@ -46,7 +48,9 @@ export const mainnet3SupportedChainNames = [ 'fusemainnet', 'gnosis', 'gravity', + 'guru', 'harmony', + 'hemi', 'immutablezkevmmainnet', 'inevm', 'ink', @@ -68,6 +72,7 @@ export const mainnet3SupportedChainNames = [ 'molten', 'moonbeam', 'morph', + 'nero', 'neutron', 'oortmainnet', 'optimism', @@ -93,6 +98,7 @@ export const mainnet3SupportedChainNames = [ 'sonic', 'soon', 'stride', + // 'subtensor', 'superseed', 'superpositionmainnet', 'swell', @@ -107,6 +113,7 @@ export const mainnet3SupportedChainNames = [ 'worldchain', 'xai', 'xlayer', + 'xpla', 'zeronetwork', 'zetachain', 'zircuit', diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 21f2c84dbe..4782b19b88 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,113 +1,120 @@ { - "ancient8": "3453.7", - "alephzeroevmmainnet": "0.3486", - "apechain": "1.24", - "appchain": "3453.7", - "arbitrum": "3453.7", - "arbitrumnova": "3453.7", - "arthera": "0.067168", - "astar": "0.062423", - "astarzkevm": "3453.7", - "aurora": "3453.7", - "flame": "5.15", - "avalanche": "40.66", - "b3": "3453.7", - "base": "3453.7", - "bitlayer": "97242", - "blast": "3453.7", - "bob": "3453.7", - "boba": "3453.7", - "bsc": "706.99", - "bsquared": "97242", - "celo": "0.678158", - "cheesechain": "0.00103496", - "chilizmainnet": "0.087192", - "conflux": "0.162275", - "conwai": "0.00403541", - "coredao": "1.14", - "corn": "97242", - "cyber": "3453.7", - "degenchain": "0.01208991", - "dogechain": "0.364012", - "duckchain": "5.45", - "eclipsemainnet": "3453.7", - "endurance": "2.04", - "ethereum": "3453.7", - "everclear": "3453.7", - "evmos": "0.02209296", - "fantom": "0.71528", - "flare": "0.02537583", - "flowmainnet": "0.769569", - "form": "3453.7", - "fraxtal": "3447.2", - "fusemainnet": "0.03044328", - "gnosis": "1", - "gravity": "0.03592135", - "harmony": "0.02753767", - "immutablezkevmmainnet": "1.35", - "inevm": "24.38", - "ink": "3453.7", - "injective": "24.38", - "kaia": "0.214223", - "kroma": "3453.7", - "linea": "3453.7", - "lisk": "3453.7", - "lukso": "2.3", - "lumia": "1.43", - "lumiaprism": "1.33", - "mantapacific": "3453.7", - "mantle": "1.29", - "merlin": "96755", - "metal": "3453.7", - "metis": "44.5", - "mint": "3453.7", - "mode": "3453.7", - "molten": "0.818007", - "moonbeam": "0.246699", - "morph": "3453.7", - "neutron": "0.378078", - "oortmainnet": "0.151246", - "optimism": "3453.7", - "orderly": "3453.7", - "osmosis": "0.5229", - "polygon": "0.481248", - "polygonzkevm": "3453.7", - "polynomialfi": "3453.7", - "prom": "5.83", - "proofofplay": "3453.7", - "rarichain": "3453.7", - "real": "3453.7", - "redstone": "3453.7", - "rivalz": "3453.7", - "rootstockmainnet": "96769", - "sanko": "40.86", - "scroll": "3453.7", - "sei": "0.433317", - "shibarium": "0.474022", - "snaxchain": "3453.7", - "solanamainnet": "206.56", - "soneium": "3453.7", - "sonic": "0.71528", - "soon": "3453.7", - "stride": "0.604988", - "superseed": "3453.7", - "superpositionmainnet": "3453.7", - "swell": "3453.7", - "taiko": "3453.7", + "acala": "0.089653", + "ancient8": "3322.32", + "alephzeroevmmainnet": "0.304513", + "apechain": "1.12", + "appchain": "3322.32", + "arbitrum": "3322.32", + "arbitrumnova": "3322.32", + "artela": "1", + "arthera": "0.04381619", + "astar": "0.060902", + "astarzkevm": "3322.32", + "aurora": "3322.32", + "flame": "4.68", + "avalanche": "37.35", + "b3": "3322.32", + "base": "3322.32", + "bitlayer": "94486", + "blast": "3322.32", + "bob": "3322.32", + "boba": "3322.32", + "bsc": "697.34", + "bsquared": "94486", + "celo": "0.654458", + "cheesechain": "0.00095089", + "chilizmainnet": "0.083892", + "conflux": "0.150607", + "conwai": "0.00386317", + "coredao": "1.035", + "corn": "94486", + "cyber": "3322.32", + "degenchain": "0.01036196", + "dogechain": "0.334068", + "duckchain": "5.27", + "eclipsemainnet": "3322.32", + "endurance": "1.85", + "ethereum": "3322.32", + "everclear": "3322.32", + "evmos": "0.02100258", + "fantom": "0.657886", + "flare": "0.02377977", + "flowmainnet": "0.74421", + "form": "3322.32", + "fraxtal": "3305.2", + "fusemainnet": "0.02815644", + "gnosis": "1.001", + "gravity": "0.03240489", + "guru": "0.01323541", + "harmony": "0.0248972", + "hemi": "3322.32", + "immutablezkevmmainnet": "1.27", + "inevm": "21.94", + "ink": "3322.32", + "injective": "21.94", + "kaia": "0.208261", + "kroma": "3322.32", + "linea": "3322.32", + "lisk": "3322.32", + "lukso": "2.04", + "lumia": "1.36", + "lumiaprism": "1.18", + "mantapacific": "3322.32", + "mantle": "1.18", + "merlin": "94299", + "metal": "3322.32", + "metis": "39.11", + "mint": "3322.32", + "mode": "3322.32", + "molten": "0.774347", + "moonbeam": "0.229674", + "morph": "3322.32", + "nero": "1", + "neutron": "0.342006", + "oortmainnet": "0.141167", + "optimism": "3322.32", + "orderly": "3322.32", + "osmosis": "0.477102", + "polygon": "0.461528", + "polygonzkevm": "3322.32", + "polynomialfi": "3322.32", + "prom": "5.48", + "proofofplay": "3322.32", + "rarichain": "3322.32", + "real": "3322.32", + "redstone": "3322.32", + "rivalz": "3322.32", + "rootstockmainnet": "92811", + "sanko": "38.08", + "scroll": "3322.32", + "sei": "0.389316", + "shibarium": "0.449375", + "snaxchain": "3322.32", + "solanamainnet": "192.63", + "soneium": "3322.32", + "sonic": "0.657886", + "soon": "3322.32", + "stride": "0.559038", + "subtensor": "464.53", + "superseed": "3322.32", + "superpositionmainnet": "3322.32", + "swell": "3322.32", + "taiko": "3322.32", "tangle": "1", - "telos": "0.226868", + "telos": "0.198429", "torus": "1", - "treasure": "0.556455", - "unichain": "3453.7", - "vana": "15.95", - "viction": "0.409674", - "worldchain": "3453.7", - "xai": "0.24081", - "xlayer": "49.04", - "zeronetwork": "3453.7", - "zetachain": "0.590199", - "zircuit": "3453.7", - "zklink": "3453.7", - "zksync": "3453.7", - "zoramainnet": "3453.7" + "treasure": "0.487988", + "unichain": "3322.32", + "vana": "14.29", + "viction": "0.387143", + "worldchain": "3322.32", + "xai": "0.214185", + "xlayer": "47.19", + "xpla": "0.085456", + "zeronetwork": "3322.32", + "zetachain": "0.539346", + "zircuit": "3322.32", + "zklink": "3322.32", + "zksync": "3322.32", + "zoramainnet": "3322.32" } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index bbbf1cb355..a5daa63692 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -1421,5 +1421,76 @@ export const validatorChainConfig = ( 'torus', ), }, + + // acala: { + // interval: 5, + // reorgPeriod: getReorgPeriod('acala'), + // validators: validatorsConfig( + // { + // [Contexts.Hyperlane]: ['0x3229bbeeab163c102d0b1fa15119b9ae0ed37cfa'], + // }, + // 'acala', + // ), + // }, + artela: { + interval: 5, + reorgPeriod: getReorgPeriod('artela'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x8fcc1ebd4c0b463618db13f83e4565af3e166b00'], + }, + 'artela', + ), + }, + guru: { + interval: 5, + reorgPeriod: getReorgPeriod('guru'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x0d756d9051f12c4de6aee2ee972193a2adfe00ef'], + }, + 'guru', + ), + }, + hemi: { + interval: 5, + reorgPeriod: getReorgPeriod('hemi'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x312dc72c17d01f3fd0abd31dd9b569bc473266dd'], + }, + 'hemi', + ), + }, + nero: { + interval: 5, + reorgPeriod: getReorgPeriod('nero'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xb86f872df37f11f33acbe75b6ed208b872b57183'], + }, + 'nero', + ), + }, + // subtensor: { + // interval: 5, + // reorgPeriod: getReorgPeriod('subtensor'), + // validators: validatorsConfig( + // { + // [Contexts.Hyperlane]: ['0xd5f8196d7060b85bea491f0b52a671e05f3d10a2'], + // }, + // 'subtensor', + // ), + // }, + xpla: { + interval: 5, + reorgPeriod: getReorgPeriod('xpla'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e'], + }, + 'xpla', + ), + }, }; }; diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index 1832889cac..0d65657a9f 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -383,7 +383,7 @@ export async function getAgentConfigsBasedOnArgs(argv?: { } // Sanity check that the validator agent config is valid. - ensureValidatorConfigConsistency(agentConfig); + ensureValidatorConfigConsistency(agentConfig, context); return { agentConfig, @@ -411,12 +411,21 @@ export function getAgentConfig( } // Ensures that the validator context chain names are in sync with the validator config. -export function ensureValidatorConfigConsistency(agentConfig: RootAgentConfig) { +export function ensureValidatorConfigConsistency( + agentConfig: RootAgentConfig, + context: Contexts, +) { const validatorContextChainNames = new Set( agentConfig.contextChainNames.validator, ); const validatorConfigChains = new Set( - Object.keys(agentConfig.validators?.chains || {}), + Object.entries(agentConfig.validators?.chains || {}) + .filter(([_, chainConfig]) => + chainConfig.validators.some((validator) => + validator.name.startsWith(`${context}-`), + ), + ) + .map(([chain]) => chain), ); const symDiff = symmetricDifference( validatorContextChainNames, diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index a9ca34b888..9340fa0c71 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -44,6 +44,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + // acala: { + // threshold: 1, + // validators: [ + // { + // address: '0x3229bbeeab163c102d0b1fa15119b9ae0ed37cfa', + // alias: AW_VALIDATOR_ALIAS, + // }, + // ], + // }, + alephzeroevmmainnet: { threshold: 3, validators: [ @@ -176,6 +186,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + artela: { + threshold: 1, + validators: [ + { + address: '0x8fcc1ebd4c0b463618db13f83e4565af3e166b00', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + arthera: { threshold: 2, validators: [ @@ -842,6 +862,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + guru: { + threshold: 1, + validators: [ + { + address: '0x0d756d9051f12c4de6aee2ee972193a2adfe00ef', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + harmony: { threshold: 2, validators: [ @@ -854,6 +884,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + hemi: { + threshold: 1, + validators: [ + { + address: '0x312dc72c17d01f3fd0abd31dd9b569bc473266dd', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + holesky: { threshold: 1, validators: [ @@ -1219,6 +1259,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + nero: { + threshold: 1, + validators: [ + { + address: '0xb86f872df37f11f33acbe75b6ed208b872b57183', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + neutron: { threshold: 4, validators: [ @@ -1712,6 +1762,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + subtensor: { + threshold: 1, + validators: [ + { + address: '0xd5f8196d7060b85bea491f0b52a671e05f3d10a2', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + superpositionmainnet: { threshold: 2, validators: [ @@ -1959,6 +2019,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + xpla: { + threshold: 1, + validators: [ + { + address: '0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + zeronetwork: { threshold: 2, validators: [ From abb5a8bc1850c2fea4f5c00ddc3c7d972d5e1244 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Mon, 13 Jan 2025 12:10:24 +0000 Subject: [PATCH 54/81] fix: use middleware submission tweaks (#5100) ### Description Uses the short-term fixes described in this [design doc](https://www.notion.so/hyperlanexyz/State-of-EVM-provider-middleware-16c6d35200d680d8a6b5f0d32cd8c66b?pvs=4) and implemented in https://github.com/hyperlane-xyz/ethers-rs/pull/23 These fixes are expected to make the relayer self-recover from nonce gaps. An expected drawback is that tx hashes are dropped more often due to the nonce manager resyncing to nonces that end up being too low by 1, which can slow down submissions. After 12h of testing, any submit queue spikes were only 1 min long and the biggest one had 7 messages - so short enough not to trigger the "rising submit queue" alert which stays pending for 6min: https://abacusworks.grafana.net/alerting/de6hwplr7eakgc ### Drive-by changes - Removes verbosity from a bunch of logs (we had `HyperlaneMessage` in a single log occur 6-7 times, but wasn't noticeable in `span`s because it was originating from args named `message` which have a clash with inner workings of the `tracing` lib) - rewords some logs because they were misleading ### Related issues Fixes: https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/5107 ### Backward compatibility Yes ### Testing E2E with a gas escalator that randomly dropped every other tx - the nonce manager was able to recover but was slower to submit. Then evaluated on RC for 12h as described above. --- rust/main/Cargo.lock | 20 +++++++++---------- rust/main/Cargo.toml | 10 +++++----- .../relayer/src/msg/metadata/aggregation.rs | 2 +- .../agents/relayer/src/msg/metadata/base.rs | 4 ++-- .../relayer/src/msg/metadata/ccip_read.rs | 2 +- .../relayer/src/msg/metadata/routing.rs | 2 +- .../agents/relayer/src/msg/op_submitter.rs | 2 +- .../agents/relayer/src/msg/pending_message.rs | 2 +- .../src/ism/aggregation_ism.rs | 2 +- .../src/ism/multisig_ism.rs | 2 +- .../hyperlane-ethereum/src/ism/routing_ism.rs | 2 +- .../src/invariants/termination_invariants.rs | 5 ++++- 12 files changed, 29 insertions(+), 26 deletions(-) diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index 078b19fac9..aea92da917 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -2955,7 +2955,7 @@ dependencies = [ [[package]] name = "ethers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-addressbook", "ethers-contract", @@ -2969,7 +2969,7 @@ dependencies = [ [[package]] name = "ethers-addressbook" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-core", "once_cell", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "ethers-contract" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -2998,7 +2998,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "Inflector", "cfg-if", @@ -3022,7 +3022,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -3036,7 +3036,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "arrayvec", "bytes", @@ -3066,7 +3066,7 @@ dependencies = [ [[package]] name = "ethers-etherscan" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "ethers-core", "getrandom 0.2.15", @@ -3082,7 +3082,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "auto_impl 0.5.0", @@ -3131,7 +3131,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "auto_impl 1.2.0", @@ -3167,7 +3167,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "1.0.2" -source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-09#0afa80630b90fbc82ef42a0b3f26dd72e68285e4" +source = "git+https://github.com/hyperlane-xyz/ethers-rs?tag=2025-01-10#3ce1ce74f2d014a2f9df213084a700106e567740" dependencies = [ "async-trait", "coins-bip32 0.7.0", diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index db0ddd70ec..832bee0c42 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -198,27 +198,27 @@ overflow-checks = true [workspace.dependencies.ethers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2025-01-09" +tag = "2025-01-10" [workspace.dependencies.ethers-contract] features = ["legacy"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2025-01-09" +tag = "2025-01-10" [workspace.dependencies.ethers-core] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2025-01-09" +tag = "2025-01-10" [workspace.dependencies.ethers-providers] features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2025-01-09" +tag = "2025-01-10" [workspace.dependencies.ethers-signers] features = ["aws"] git = "https://github.com/hyperlane-xyz/ethers-rs" -tag = "2025-01-09" +tag = "2025-01-10" [patch.crates-io.curve25519-dalek] branch = "v3.2.2-relax-zeroize" diff --git a/rust/main/agents/relayer/src/msg/metadata/aggregation.rs b/rust/main/agents/relayer/src/msg/metadata/aggregation.rs index 072ce62b65..1d4ecbc732 100644 --- a/rust/main/agents/relayer/src/msg/metadata/aggregation.rs +++ b/rust/main/agents/relayer/src/msg/metadata/aggregation.rs @@ -117,7 +117,7 @@ impl AggregationIsmMetadataBuilder { #[async_trait] impl MetadataBuilder for AggregationIsmMetadataBuilder { - #[instrument(err, skip(self), ret)] + #[instrument(err, skip(self, message), ret)] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn build( &self, diff --git a/rust/main/agents/relayer/src/msg/metadata/base.rs b/rust/main/agents/relayer/src/msg/metadata/base.rs index be10af6110..b2e4e5d185 100644 --- a/rust/main/agents/relayer/src/msg/metadata/base.rs +++ b/rust/main/agents/relayer/src/msg/metadata/base.rs @@ -189,7 +189,7 @@ impl Deref for MessageMetadataBuilder { #[async_trait] impl MetadataBuilder for MessageMetadataBuilder { - #[instrument(err, skip(self), fields(destination_domain=self.destination_domain().name()))] + #[instrument(err, skip(self, message), fields(destination_domain=self.destination_domain().name()))] async fn build( &self, ism_address: H256, @@ -228,7 +228,7 @@ impl MessageMetadataBuilder { } } - #[instrument(err, skip(self), fields(destination_domain=self.destination_domain().name()), ret)] + #[instrument(err, skip(self, message), fields(destination_domain=self.destination_domain().name()), ret)] pub async fn build_ism_and_metadata( &self, ism_address: H256, diff --git a/rust/main/agents/relayer/src/msg/metadata/ccip_read.rs b/rust/main/agents/relayer/src/msg/metadata/ccip_read.rs index 507271c123..49b15837df 100644 --- a/rust/main/agents/relayer/src/msg/metadata/ccip_read.rs +++ b/rust/main/agents/relayer/src/msg/metadata/ccip_read.rs @@ -27,7 +27,7 @@ pub struct CcipReadIsmMetadataBuilder { #[async_trait] impl MetadataBuilder for CcipReadIsmMetadataBuilder { - #[instrument(err, skip(self))] + #[instrument(err, skip(self, message))] async fn build( &self, ism_address: H256, diff --git a/rust/main/agents/relayer/src/msg/metadata/routing.rs b/rust/main/agents/relayer/src/msg/metadata/routing.rs index 0f319e8251..f8d5a145bc 100644 --- a/rust/main/agents/relayer/src/msg/metadata/routing.rs +++ b/rust/main/agents/relayer/src/msg/metadata/routing.rs @@ -14,7 +14,7 @@ pub struct RoutingIsmMetadataBuilder { #[async_trait] impl MetadataBuilder for RoutingIsmMetadataBuilder { - #[instrument(err, skip(self), ret)] + #[instrument(err, skip(self, message), ret)] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn build( &self, diff --git a/rust/main/agents/relayer/src/msg/op_submitter.rs b/rust/main/agents/relayer/src/msg/op_submitter.rs index c1e295a24a..1f0a54234c 100644 --- a/rust/main/agents/relayer/src/msg/op_submitter.rs +++ b/rust/main/agents/relayer/src/msg/op_submitter.rs @@ -543,7 +543,7 @@ impl OperationBatch { }; if !excluded_ops.is_empty() { - warn!(excluded_ops=?excluded_ops, "Either the batch tx would revert, or the operations would revert in the batch. Falling back to serial submission."); + warn!(excluded_ops=?excluded_ops, "Either operations reverted in the batch or the txid wasn't included. Falling back to serial submission."); OperationBatch::new(excluded_ops, self.domain) .submit_serially(prepare_queue, confirm_queue, metrics) .await; diff --git a/rust/main/agents/relayer/src/msg/pending_message.rs b/rust/main/agents/relayer/src/msg/pending_message.rs index 3c03094fc5..92d279856d 100644 --- a/rust/main/agents/relayer/src/msg/pending_message.rs +++ b/rust/main/agents/relayer/src/msg/pending_message.rs @@ -32,7 +32,7 @@ pub const CONFIRM_DELAY: Duration = if cfg!(any(test, feature = "test-utils")) { // Wait 5 seconds after submitting the message before confirming in test mode Duration::from_secs(5) } else { - // Wait 1 min after submitting the message before confirming in normal/production mode + // Wait 10 min after submitting the message before confirming in normal/production mode Duration::from_secs(60 * 10) }; diff --git a/rust/main/chains/hyperlane-ethereum/src/ism/aggregation_ism.rs b/rust/main/chains/hyperlane-ethereum/src/ism/aggregation_ism.rs index 61b371f3b7..0d7bae757f 100644 --- a/rust/main/chains/hyperlane-ethereum/src/ism/aggregation_ism.rs +++ b/rust/main/chains/hyperlane-ethereum/src/ism/aggregation_ism.rs @@ -92,7 +92,7 @@ impl AggregationIsm for EthereumAggregationIsm where M: Middleware + 'static, { - #[instrument(err)] + #[instrument(err, skip(self, message))] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn modules_and_threshold( &self, diff --git a/rust/main/chains/hyperlane-ethereum/src/ism/multisig_ism.rs b/rust/main/chains/hyperlane-ethereum/src/ism/multisig_ism.rs index 2c71c900c5..b9acb2075d 100644 --- a/rust/main/chains/hyperlane-ethereum/src/ism/multisig_ism.rs +++ b/rust/main/chains/hyperlane-ethereum/src/ism/multisig_ism.rs @@ -98,7 +98,7 @@ impl MultisigIsm for EthereumMultisigIsm where M: Middleware + 'static, { - #[instrument(err)] + #[instrument(err, skip(self, message))] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn validators_and_threshold( &self, diff --git a/rust/main/chains/hyperlane-ethereum/src/ism/routing_ism.rs b/rust/main/chains/hyperlane-ethereum/src/ism/routing_ism.rs index 39aaf7ecdb..4a9e8204d2 100644 --- a/rust/main/chains/hyperlane-ethereum/src/ism/routing_ism.rs +++ b/rust/main/chains/hyperlane-ethereum/src/ism/routing_ism.rs @@ -89,7 +89,7 @@ impl RoutingIsm for EthereumRoutingIsm where M: Middleware + 'static, { - #[instrument(err)] + #[instrument(err, skip(self, message))] #[allow(clippy::blocks_in_conditions)] // TODO: `rustc` 1.80.1 clippy issue async fn route(&self, message: &HyperlaneMessage) -> ChainResult { let ism = self diff --git a/rust/main/utils/run-locally/src/invariants/termination_invariants.rs b/rust/main/utils/run-locally/src/invariants/termination_invariants.rs index cb851af8d2..b6e299c1bc 100644 --- a/rust/main/utils/run-locally/src/invariants/termination_invariants.rs +++ b/rust/main/utils/run-locally/src/invariants/termination_invariants.rs @@ -39,7 +39,10 @@ pub fn termination_invariants_met( )?; assert!(!lengths.is_empty(), "Could not find queue length metric"); if lengths.iter().sum::() != ZERO_MERKLE_INSERTION_KATHY_MESSAGES { - log!("Relayer queues not empty. Lengths: {:?}", lengths); + log!( + "Relayer queues contain more messages than the zero-merkle-insertion ones. Lengths: {:?}", + lengths + ); return Ok(false); }; From 26ec628085c6e83ce944c789105e5096954479c2 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Mon, 13 Jan 2025 13:29:37 +0000 Subject: [PATCH 55/81] chore: new relayer images (#5157) ### Description To include the changes from https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/5100 --- typescript/infra/config/environments/mainnet3/agent.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 32898263bc..19b331cd90 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -652,7 +652,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '53fafa6-20250110-125541', + tag: 'abb5a8b-20250113-122226', }, blacklist, gasPaymentEnforcement: gasPaymentEnforcement, @@ -687,7 +687,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'df9c1ed-20250109-151923', + tag: 'abb5a8b-20250113-122226', }, blacklist, // We're temporarily (ab)using the RC relayer as a way to increase From 6c6d2bc04ff1b340aeb75653068228bd3d7d4543 Mon Sep 17 00:00:00 2001 From: Kunal Arora <55632507+aroralanuk@users.noreply.github.com> Date: Mon, 13 Jan 2025 22:03:40 +0530 Subject: [PATCH 56/81] fix(e2e): reenable gas enforcement check in e2e (non-cosmwasm) (#5105) ### Description - Move to valid 'gaspaymentenforcement' for e2e, which was earlier shortcircuiting to none (the default value for enforcement policy). This meant we were not checking if the relayer was enforcing a non-zero gas payment for either sealevel or EVM gas payments. - The igpHook set as part of the default hook for Kathy was not configured properly, hence was giving a quote of 0. Now, Kathy does set the IGP config (oracle and overhead). (Note: Kathy is soon to be deprecated, so this is more of a quick patch for e2e coverage). - Added a check for deserilization of 'gaspaymentenforcement' and panic if invalid to prevent this bug in the future. ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/main/agents/relayer/src/settings/mod.rs | 44 ++++++++-- rust/main/utils/run-locally/src/main.rs | 2 +- .../infra/scripts/send-test-messages.ts | 81 +++++++++++++++++-- 3 files changed, 113 insertions(+), 14 deletions(-) diff --git a/rust/main/agents/relayer/src/settings/mod.rs b/rust/main/agents/relayer/src/settings/mod.rs index dc4c1e543e..df28d03dee 100644 --- a/rust/main/agents/relayer/src/settings/mod.rs +++ b/rust/main/agents/relayer/src/settings/mod.rs @@ -125,16 +125,50 @@ impl FromRawConf for RelayerSettings { .parse_from_str("Expected database path") .unwrap_or_else(|| std::env::current_dir().unwrap().join("hyperlane_db")); - let (raw_gas_payment_enforcement_path, raw_gas_payment_enforcement) = p - .get_opt_key("gasPaymentEnforcement") - .take_config_err_flat(&mut err) - .and_then(parse_json_array) - .unwrap_or_else(|| (&p.cwp + "gas_payment_enforcement", Value::Array(vec![]))); + // is_gas_payment_enforcement_set determines if we should be checking if the correct gas payment enforcement policy has been provided with "gasPaymentEnforcement" key + let ( + raw_gas_payment_enforcement_path, + raw_gas_payment_enforcement, + is_gas_payment_enforcement_set, + ) = { + match p.get_opt_key("gasPaymentEnforcement") { + Ok(Some(parser)) => match parse_json_array(parser) { + Some((path, value)) => (path, value, true), + None => ( + &p.cwp + "gas_payment_enforcement", + Value::Array(vec![]), + true, + ), + }, + Ok(None) => ( + &p.cwp + "gas_payment_enforcement", + Value::Array(vec![]), + false, + ), + Err(_) => ( + &p.cwp + "gas_payment_enforcement", + Value::Array(vec![]), + false, + ), + } + }; let gas_payment_enforcement_parser = ValueParser::new( raw_gas_payment_enforcement_path, &raw_gas_payment_enforcement, ); + + if is_gas_payment_enforcement_set + && gas_payment_enforcement_parser + .val + .as_array() + .unwrap() + .is_empty() + { + Err::<(), eyre::Report>(eyre!("GASPAYMENTENFORCEMENT policy cannot be parsed")) + .take_err(&mut err, || cwp + "gas_payment_enforcement"); + } + let mut gas_payment_enforcement = gas_payment_enforcement_parser.into_array_iter().map(|itr| { itr.filter_map(|policy| { let policy_type = policy.chain(&mut err).get_opt_key("type").parse_string().end(); diff --git a/rust/main/utils/run-locally/src/main.rs b/rust/main/utils/run-locally/src/main.rs index 4686c15446..a7e03b4094 100644 --- a/rust/main/utils/run-locally/src/main.rs +++ b/rust/main/utils/run-locally/src/main.rs @@ -227,7 +227,7 @@ fn main() -> ExitCode { "GASPAYMENTENFORCEMENT", r#"[{ "type": "minimum", - "payment": "1", + "payment": "1" }]"#, ) .arg( diff --git a/typescript/infra/scripts/send-test-messages.ts b/typescript/infra/scripts/send-test-messages.ts index d028263982..6775ac5534 100644 --- a/typescript/infra/scripts/send-test-messages.ts +++ b/typescript/infra/scripts/send-test-messages.ts @@ -1,9 +1,16 @@ import { Provider } from '@ethersproject/providers'; -import { Wallet } from 'ethers'; +import { BigNumber, Wallet } from 'ethers'; import fs from 'fs'; import yargs from 'yargs'; -import { Mailbox, TestSendReceiver__factory } from '@hyperlane-xyz/core'; +import { + InterchainGasPaymaster, + InterchainGasPaymaster__factory, + Mailbox, + StorageGasOracle, + StorageGasOracle__factory, + TestSendReceiver__factory, +} from '@hyperlane-xyz/core'; import { ChainName, HookType, @@ -11,7 +18,7 @@ import { MultiProvider, TestChainName, } from '@hyperlane-xyz/sdk'; -import { addressToBytes32, sleep } from '@hyperlane-xyz/utils'; +import { addressToBytes32, formatMessage, sleep } from '@hyperlane-xyz/utils'; const ANVIL_KEY = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'; @@ -47,6 +54,44 @@ async function setMailboxHook( console.log(`set the ${mailboxHookType} hook on ${local} to ${hook}`); } +async function setIgpConfig( + remoteId: number, + signer: Wallet, + provider: Provider, + mailbox: Mailbox, + addresses: any, + local: ChainName, +) { + const storageGasOracleF = new StorageGasOracle__factory( + signer.connect(provider), + ); + const storageGasOracle = await storageGasOracleF.deploy(); + await storageGasOracle.deployTransaction.wait(); + + const oracleConfigs: Array = []; + oracleConfigs.push({ + remoteDomain: remoteId, + tokenExchangeRate: '10000000000', + gasPrice: '1000000000', + }); + await storageGasOracle.setRemoteGasDataConfigs(oracleConfigs); + + const gasParamsToSet: InterchainGasPaymaster.GasParamStruct[] = []; + gasParamsToSet.push({ + remoteDomain: remoteId, + config: { + gasOracle: storageGasOracle.address, + gasOverhead: 1000000, + }, + }); + + const igpHook = InterchainGasPaymaster__factory.connect( + addresses[local].interchainGasPaymaster, + signer.connect(provider), + ); + await igpHook.setDestinationGasConfigs(gasParamsToSet); +} + const chainSummary = async (core: HyperlaneCore, chain: ChainName) => { const coreContracts = core.getContracts(chain); const mailbox = coreContracts.mailbox; @@ -157,15 +202,33 @@ async function main() { MailboxHookType.REQUIRED, requiredHook, ); + + if ( + defaultHook === HookType.AGGREGATION || + defaultHook === HookType.INTERCHAIN_GAS_PAYMASTER + ) { + console.log('Setting IGP config for message ...'); + await setIgpConfig(remoteId, signer, provider, mailbox, addresses, local); + } + + const message = formatMessage( + 1, + 0, + multiProvider.getDomainId(local), + recipient.address, + multiProvider.getDomainId(remote), + recipient.address, + '0x1234', + ); const quote = await mailbox['quoteDispatch(uint32,bytes32,bytes)']( remoteId, addressToBytes32(recipient.address), - '0x1234', + message, ); - await recipient['dispatchToSelf(address,uint32,bytes)']( - mailbox.address, + await mailbox['dispatch(uint32,bytes32,bytes)']( remoteId, - '0x1234', + addressToBytes32(recipient.address), + message, { value: quote, }, @@ -173,7 +236,9 @@ async function main() { console.log( `send to ${recipient.address} on ${remote} via mailbox ${ mailbox.address - } on ${local} with nonce ${(await mailbox.nonce()) - 1}`, + } on ${local} with nonce ${ + (await mailbox.nonce()) - 1 + } and quote ${quote.toString()}`, ); console.log(await chainSummary(core, local)); console.log(await chainSummary(core, remote)); From b505997e6658c65e5bbd4118c590d17d2cc31c14 Mon Sep 17 00:00:00 2001 From: Kunal Arora <55632507+aroralanuk@users.noreply.github.com> Date: Mon, 13 Jan 2025 23:45:35 +0530 Subject: [PATCH 57/81] fix(agents/sealevel): handle non configured igp account payments (#5075) ### Description - Handles the case where igp fees are paid to a non-configured igp account in a backward compatible way. - Zero out payment for non-matching igp accounts so that the db stays continuous to prevent an infinite loop in the sequencer aware parser but at the same time, enforce payments to the right igp account was made before processing the message. Note: If we want to display these neutralized payments (in say, the Explorer), we'll need to think of a more breaking solution, which isn't necessary today. ### Drive-by changes None ### Related issues - fixes https://github.com/hyperlane-xyz/issues/issues/1392 ### Backward compatibility Yes ### Testing - integration test paying to a different newly deployed account --- rust/main/agents/relayer/src/settings/mod.rs | 2 +- .../hyperlane-sealevel/src/interchain_gas.rs | 14 ++- .../run-locally/src/invariants/common.rs | 1 + .../src/invariants/termination_invariants.rs | 25 +++-- rust/main/utils/run-locally/src/main.rs | 5 + rust/main/utils/run-locally/src/solana.rs | 91 +++++++++++++++++++ rust/sealevel/client/src/igp.rs | 44 ++++++++- rust/sealevel/client/src/main.rs | 6 ++ .../local-e2e/gas-oracle-configs.json | 20 ++++ 9 files changed, 191 insertions(+), 17 deletions(-) create mode 100644 rust/sealevel/environments/local-e2e/gas-oracle-configs.json diff --git a/rust/main/agents/relayer/src/settings/mod.rs b/rust/main/agents/relayer/src/settings/mod.rs index df28d03dee..2d3d9375de 100644 --- a/rust/main/agents/relayer/src/settings/mod.rs +++ b/rust/main/agents/relayer/src/settings/mod.rs @@ -125,7 +125,7 @@ impl FromRawConf for RelayerSettings { .parse_from_str("Expected database path") .unwrap_or_else(|| std::env::current_dir().unwrap().join("hyperlane_db")); - // is_gas_payment_enforcement_set determines if we should be checking if the correct gas payment enforcement policy has been provided with "gasPaymentEnforcement" key + // is_gas_payment_enforcement_set determines if we should be checking for the correct gas payment enforcement policy has been provided with "gasPaymentEnforcement" key let ( raw_gas_payment_enforcement_path, raw_gas_payment_enforcement, diff --git a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs index 4d5e819de3..95cd97eb35 100644 --- a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs +++ b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs @@ -248,11 +248,17 @@ impl Indexer for SealevelInterchainGasPaymasterIndexer { for nonce in range { if let Ok(sealevel_payment) = self.get_payment_with_sequence(nonce.into()).await { let igp_account_filter = self.igp.igp_account; - if igp_account_filter == sealevel_payment.igp_account_pubkey { - payments.push((sealevel_payment.payment, sealevel_payment.log_meta)); - } else { - tracing::debug!(sealevel_payment=?sealevel_payment, igp_account_filter=?igp_account_filter, "Found interchain gas payment for a different IGP account, skipping"); + let mut payment = *sealevel_payment.payment.inner(); + // If fees is paid to a different IGP account, we zero out the payment to make sure the db entries are contiguous, but at the same time, gasEnforcer will reject the message (if not set to none policy) + if igp_account_filter != sealevel_payment.igp_account_pubkey { + tracing::debug!(sealevel_payment=?sealevel_payment, igp_account_filter=?igp_account_filter, "Found interchain gas payment for a different IGP account, neutralizing payment"); + + payment.payment = U256::from(0); } + payments.push(( + Indexed::new(payment).with_sequence(nonce), + sealevel_payment.log_meta, + )); } } Ok(payments) diff --git a/rust/main/utils/run-locally/src/invariants/common.rs b/rust/main/utils/run-locally/src/invariants/common.rs index 35a0c5eae4..1f603db53b 100644 --- a/rust/main/utils/run-locally/src/invariants/common.rs +++ b/rust/main/utils/run-locally/src/invariants/common.rs @@ -1,3 +1,4 @@ // This number should be even, so the messages can be split into two equal halves // sent before and after the relayer spins up, to avoid rounding errors. pub const SOL_MESSAGES_EXPECTED: u32 = 20; +pub const SOL_MESSAGES_WITH_NON_MATCHING_IGP: u32 = 1; diff --git a/rust/main/utils/run-locally/src/invariants/termination_invariants.rs b/rust/main/utils/run-locally/src/invariants/termination_invariants.rs index b6e299c1bc..6e69fd5e63 100644 --- a/rust/main/utils/run-locally/src/invariants/termination_invariants.rs +++ b/rust/main/utils/run-locally/src/invariants/termination_invariants.rs @@ -7,7 +7,7 @@ use crate::utils::get_matching_lines; use maplit::hashmap; use relayer::GAS_EXPENDITURE_LOG_MESSAGE; -use crate::invariants::SOL_MESSAGES_EXPECTED; +use crate::invariants::common::{SOL_MESSAGES_EXPECTED, SOL_MESSAGES_WITH_NON_MATCHING_IGP}; use crate::logging::log; use crate::solana::solana_termination_invariants_met; use crate::{ @@ -30,7 +30,15 @@ pub fn termination_invariants_met( } else { 0 }; + let sol_messages_with_non_matching_igp = if config.sealevel_enabled { + SOL_MESSAGES_WITH_NON_MATCHING_IGP + } else { + 0 + }; + + // this is total messages expected to be delivered let total_messages_expected = eth_messages_expected + sol_messages_expected; + let total_messages_dispatched = total_messages_expected + sol_messages_with_non_matching_igp; let lengths = fetch_metric( RELAYER_METRICS_PORT, @@ -38,7 +46,9 @@ pub fn termination_invariants_met( &hashmap! {}, )?; assert!(!lengths.is_empty(), "Could not find queue length metric"); - if lengths.iter().sum::() != ZERO_MERKLE_INSERTION_KATHY_MESSAGES { + if lengths.iter().sum::() + != ZERO_MERKLE_INSERTION_KATHY_MESSAGES + sol_messages_with_non_matching_igp + { log!( "Relayer queues contain more messages than the zero-merkle-insertion ones. Lengths: {:?}", lengths @@ -131,11 +141,11 @@ pub fn termination_invariants_met( // TestSendReceiver randomly breaks gas payments up into // two. So we expect at least as many gas payments as messages. - if gas_payment_events_count < total_messages_expected { + if gas_payment_events_count < total_messages_dispatched { log!( "Relayer has {} gas payment events, expected at least {}", gas_payment_events_count, - total_messages_expected + total_messages_dispatched ); return Ok(false); } @@ -156,12 +166,13 @@ pub fn termination_invariants_met( )? .iter() .sum::(); - if dispatched_messages_scraped != total_messages_expected + ZERO_MERKLE_INSERTION_KATHY_MESSAGES + if dispatched_messages_scraped + != total_messages_dispatched + ZERO_MERKLE_INSERTION_KATHY_MESSAGES { log!( "Scraper has scraped {} dispatched messages, expected {}", dispatched_messages_scraped, - total_messages_expected + ZERO_MERKLE_INSERTION_KATHY_MESSAGES, + total_messages_dispatched + ZERO_MERKLE_INSERTION_KATHY_MESSAGES, ); return Ok(false); } @@ -193,7 +204,7 @@ pub fn termination_invariants_met( log!( "Scraper has scraped {} delivered messages, expected {}", delivered_messages_scraped, - total_messages_expected + total_messages_expected + sol_messages_with_non_matching_igp ); return Ok(false); } diff --git a/rust/main/utils/run-locally/src/main.rs b/rust/main/utils/run-locally/src/main.rs index a7e03b4094..7aeb3ae101 100644 --- a/rust/main/utils/run-locally/src/main.rs +++ b/rust/main/utils/run-locally/src/main.rs @@ -465,6 +465,11 @@ fn main() -> ExitCode { initiate_solana_hyperlane_transfer(solana_path.clone(), solana_config_path.clone()) .join(); } + initiate_solana_non_matching_igp_paying_transfer( + solana_path.clone(), + solana_config_path.clone(), + ) + .join(); } log!("Setup complete! Agents running in background..."); diff --git a/rust/main/utils/run-locally/src/solana.rs b/rust/main/utils/run-locally/src/solana.rs index 6dd137857f..3e32524cdd 100644 --- a/rust/main/utils/run-locally/src/solana.rs +++ b/rust/main/utils/run-locally/src/solana.rs @@ -73,6 +73,8 @@ const SOLANA_REMOTE_CHAIN_ID: &str = "13376"; pub const SOLANA_CHECKPOINT_LOCATION: &str = "/tmp/test_sealevel_checkpoints_0x70997970c51812dc3a010c7d01b50e0d17dc79c8"; +const SOLANA_GAS_ORACLE_CONFIG_FILE: &str = + "../sealevel/environments/local-e2e/gas-oracle-configs.json"; const SOLANA_OVERHEAD_CONFIG_FILE: &str = "../sealevel/environments/local-e2e/overheads.json"; // Install the CLI tools and return the path to the bin dir. @@ -280,6 +282,7 @@ pub fn start_solana_test_validator( .join(); sealevel_client + .clone() .cmd("validator-announce") .cmd("announce") .arg("validator", "0x70997970c51812dc3a010c7d01b50e0d17dc79c8") @@ -291,6 +294,43 @@ pub fn start_solana_test_validator( .run() .join(); + sealevel_client + .clone() + .cmd("igp") + .cmd("init-igp-account") + .arg("program-id", "GwHaw8ewMyzZn9vvrZEnTEAAYpLdkGYs195XWcLDCN4U") + .arg("environment", SOLANA_ENV_NAME) + .arg("environments-dir", SOLANA_ENVS_DIR) + .arg("chain", "sealeveltest1") + .arg("chain-config-file", SOLANA_CHAIN_CONFIG_FILE) + .arg("gas-oracle-config-file", SOLANA_GAS_ORACLE_CONFIG_FILE) + .arg( + "account-salt", + "0x0000000000000000000000000000000000000000000000000000000000000001", + ) + .run() + .join(); + + sealevel_client + .cmd("igp") + .cmd("init-overhead-igp-account") + .arg("program-id", "GwHaw8ewMyzZn9vvrZEnTEAAYpLdkGYs195XWcLDCN4U") + .arg("environment", SOLANA_ENV_NAME) + .arg("environments-dir", SOLANA_ENVS_DIR) + .arg("chain", "sealeveltest1") + .arg("chain-config-file", SOLANA_CHAIN_CONFIG_FILE) + .arg("overhead-config-file", SOLANA_OVERHEAD_CONFIG_FILE) + .arg( + "inner-igp-account", + "8EniU8dQaGQ3HWWtT77V7hrksheygvEu6TtzJ3pX1nKM", + ) + .arg( + "account-salt", + "0x0000000000000000000000000000000000000000000000000000000000000001", + ) + .run() + .join(); + log!("Local Solana chain started and hyperlane programs deployed and initialized successfully"); (solana_config_path, validator) @@ -341,6 +381,57 @@ pub fn initiate_solana_hyperlane_transfer( message_id } +#[apply(as_task)] +#[allow(clippy::get_first)] +pub fn initiate_solana_non_matching_igp_paying_transfer( + solana_cli_tools_path: PathBuf, + solana_config_path: PathBuf, +) -> String { + let sender = Program::new(concat_path(&solana_cli_tools_path, "solana")) + .arg("config", solana_config_path.to_str().unwrap()) + .arg("keypair", SOLANA_KEYPAIR) + .cmd("address") + .run_with_output() + .join() + .get(0) + .expect("failed to get sender address") + .trim() + .to_owned(); + + let output = sealevel_client(&solana_cli_tools_path, &solana_config_path) + .cmd("token") + .cmd("transfer-remote") + .cmd(SOLANA_KEYPAIR) + .cmd("10000000000") + .cmd(SOLANA_REMOTE_CHAIN_ID) + .cmd(sender) // send to self + .cmd("native") + .arg("program-id", "CGn8yNtSD3aTTqJfYhUb6s1aVTN75NzwtsFKo1e83aga") + .run_with_output() + .join(); + let non_matching_igp_message_id = get_message_id_from_logs(output.clone()) + .unwrap_or_else(|| panic!("failed to get message id from logs: {:?}", output)); + + log!( + "paying gas to a different IGP account for message id: {}", + non_matching_igp_message_id + ); + sealevel_client(&solana_cli_tools_path, &solana_config_path) + .cmd("igp") + .cmd("pay-for-gas") + .arg("program-id", "GwHaw8ewMyzZn9vvrZEnTEAAYpLdkGYs195XWcLDCN4U") + .arg("message-id", non_matching_igp_message_id.clone()) + .arg("destination-domain", SOLANA_REMOTE_CHAIN_ID) + .arg("gas", "100000") + .arg( + "account-salt", + "0x0000000000000000000000000000000000000000000000000000000000000001", + ) + .run() + .join(); + non_matching_igp_message_id +} + fn get_message_id_from_logs(logs: Vec) -> Option { let message_id_regex = Regex::new(r"Dispatched message to \d+, ID 0x([0-9a-fA-F]+)").unwrap(); for log in logs { diff --git a/rust/sealevel/client/src/igp.rs b/rust/sealevel/client/src/igp.rs index cf9d6042b2..60f51479d9 100644 --- a/rust/sealevel/client/src/igp.rs +++ b/rust/sealevel/client/src/igp.rs @@ -90,11 +90,24 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { let context_dir = create_new_directory(&chain_dir, get_context_dir_name(init.context.as_ref())); - let artifacts_path = context_dir.join("igp-accounts.json"); + let artifacts_path = if init.account_salt.is_some() { + context_dir.join(format!( + "igp-accounts-{}.json", + init.account_salt.clone().unwrap() + )) + } else { + context_dir.join("igp-accounts.json") + }; let existing_artifacts = try_read_json::(&artifacts_path).ok(); - let salt = get_context_salt(init.context.as_ref()); + let salt = init + .account_salt + .map(|s| { + let salt_str = s.trim_start_matches("0x"); + H256::from_str(salt_str).expect("Invalid salt format") + }) + .unwrap_or_else(|| get_context_salt(init.context.as_ref())); let chain_configs = read_json::>(&init.chain_config_file); @@ -123,11 +136,24 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { let context_dir = create_new_directory(&chain_dir, get_context_dir_name(init.context.as_ref())); - let artifacts_path = context_dir.join("igp-accounts.json"); + let artifacts_path = if init.account_salt.is_some() { + context_dir.join(format!( + "igp-accounts-{}.json", + init.account_salt.clone().unwrap() + )) + } else { + context_dir.join("igp-accounts.json") + }; let existing_artifacts = try_read_json::(&artifacts_path).ok(); - let salt = get_context_salt(init.context.as_ref()); + let salt = init + .account_salt + .map(|s| { + let salt_str = s.trim_start_matches("0x"); + H256::from_str(salt_str).expect("Invalid salt format") + }) + .unwrap_or_else(|| get_context_salt(init.context.as_ref())); let chain_configs = read_json::>(&init.chain_config_file); @@ -190,7 +216,15 @@ pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { } IgpSubCmd::PayForGas(payment_details) => { let unique_gas_payment_keypair = Keypair::new(); - let salt = H256::zero(); + + let salt = payment_details + .account_salt + .map(|s| { + let salt_str = s.trim_start_matches("0x"); + H256::from_str(salt_str).expect("Invalid salt format") + }) + .unwrap_or_else(H256::zero); + let (igp_account, _igp_account_bump) = Pubkey::find_program_address( hyperlane_sealevel_igp::igp_pda_seeds!(salt), &payment_details.program_id, diff --git a/rust/sealevel/client/src/main.rs b/rust/sealevel/client/src/main.rs index 4b76a7cf0a..c9ea55b548 100644 --- a/rust/sealevel/client/src/main.rs +++ b/rust/sealevel/client/src/main.rs @@ -430,6 +430,8 @@ struct InitIgpAccountArgs { context: Option, #[arg(long)] gas_oracle_config_file: Option, + #[arg(long)] + account_salt: Option, // optional salt for deterministic account creation } #[derive(Args)] @@ -448,6 +450,8 @@ struct InitOverheadIgpAccountArgs { context: Option, #[arg(long)] overhead_config_file: Option, + #[arg(long)] + account_salt: Option, // optional salt for deterministic account creation } #[derive(Args)] @@ -481,6 +485,8 @@ struct PayForGasArgs { destination_domain: u32, #[arg(long)] gas: u64, + #[arg(long)] + account_salt: Option, // optional salt for paying gas to a deterministically derived account } #[derive(Args)] diff --git a/rust/sealevel/environments/local-e2e/gas-oracle-configs.json b/rust/sealevel/environments/local-e2e/gas-oracle-configs.json new file mode 100644 index 0000000000..1d69e4c3bf --- /dev/null +++ b/rust/sealevel/environments/local-e2e/gas-oracle-configs.json @@ -0,0 +1,20 @@ +[ + { + "domain": 13375, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "10000000000000000000", + "gasPrice": "0", + "tokenDecimals": 18 + } + }, + { + "domain": 13376, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "10000000000000000000", + "gasPrice": "0", + "tokenDecimals": 18 + } + } +] From fd255efa64644a62f99faf31a871db142ad2c150 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Mon, 13 Jan 2025 19:37:39 -0500 Subject: [PATCH 58/81] feat: configure PNDR warp route (#5104) ### Description configure PNDR warp route ### Drive-by changes ### Related issues ### Backward compatibility Yes ### Testing Manual --- .../getBscEthereumLumiaPNDRWarpConfig.ts | 48 +++++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 1 + typescript/infra/config/warp.ts | 3 ++ typescript/infra/src/config/warp.ts | 1 + 4 files changed, 53 insertions(+) create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.ts diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.ts new file mode 100644 index 0000000000..263e13fc76 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.ts @@ -0,0 +1,48 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const owners = { + ethereum: '0x9b948CC7CfC4B67262CbbcC37f9d09B61ea6f0E3', + bsc: '0xA788b57518bBE602ac94CCEE5ae7E4831a546Bfd', + lumiaprism: '0x1C4A50f3E9Bfeb268448D19d0D3fe6d58CB0f7BE', +}; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getBscEthereumLumiaPrismPNDRWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + owner: owners.ethereum, + type: TokenType.collateral, + token: tokens.ethereum.PNDR, + interchainSecurityModule: ISM_CONFIG, + }; + + const bsc: HypTokenRouterConfig = { + ...routerConfig.bsc, + owner: owners.bsc, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + const lumiaprism: HypTokenRouterConfig = { + ...routerConfig.lumiaprism, + owner: owners.lumiaprism, + type: TokenType.synthetic, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + ethereum, + bsc, + lumiaprism, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 780ebc079c..2ce06831ea 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -6,6 +6,7 @@ export enum WarpRouteIds { ArbitrumNeutronEclip = 'ECLIP/arbitrum-neutron', ArbitrumNeutronTIA = 'TIA/arbitrum-neutron', ArbitrumTreasureMAGIC = 'MAGIC/arbitrum-treasure', + BscEthereumLumiaPrismPNDR = 'PNDR/bsc-ethereum-lumiaprism', EclipseEthereumApxEth = 'APXETH/eclipsemainnet-ethereum', EclipseEthereumSolanaUSDC = 'USDC/eclipsemainnet-ethereum-solanamainnet', EclipseEthereumSolanaUSDT = 'USDT/eclipsemainnet-ethereum-solanamainnet', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index 5318a9ca2b..e15ec37e71 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -24,6 +24,7 @@ import { getBaseFormAIXBTWarpConfig } from './environments/mainnet3/warp/configG import { getBaseFormGAMEWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.js'; import { getBaseZeroNetworkCBBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseZeroNetworkCBBTCWarpConfig.js'; import { getBobaBsquaredSwellUBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBobaBsquaredSwellUBTCWarpConfig.js'; +import { getBscEthereumLumiaPrismPNDRWarpConfig } from './environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.js'; import { getEclipseEthereumApxEthWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.js'; import { getEclipseEthereumSolanaUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.js'; import { getEclipseEthereumWBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.js'; @@ -70,6 +71,8 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiSwellTaikoZircuitEZETH]: getRenzoEZETHWarpConfig, [WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig, + [WarpRouteIds.BscEthereumLumiaPrismPNDR]: + getBscEthereumLumiaPrismPNDRWarpConfig, [WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig, [WarpRouteIds.EthereumInkUSDC]: getEthereumInkUSDCConfig, [WarpRouteIds.EthereumSeiFastUSD]: getEthereumSeiFastUSDWarpConfig, diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 48e3425701..1660b54dd9 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -14,6 +14,7 @@ export const tokens: ChainMap> = { weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88', pumpBTCsei: '0xe9ebd666954B7F0B5B044704c86B126651f6235d', Re7LRT: '0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a', + PNDR: '0x73624d2dEF952C77a1f3B5AD995eef53E49639EC', rstETH: '0x7a4EffD87C2f3C55CA251080b1343b605f327E3a', WSTETH: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', }, From d365e55e0b392d371e57e3b92b2544fb50db4c81 Mon Sep 17 00:00:00 2001 From: Tien Dao <15717476+tiendn@users.noreply.github.com> Date: Tue, 14 Jan 2025 07:58:35 +0700 Subject: [PATCH 59/81] fix: correct spelling of 'Separated' in agent configuration regex patterns (#5152) ### Description Fix typo `Seperated` -> `Separated` ### Drive-by changes ### Related issues ### Backward compatibility ### Testing No update test --- typescript/sdk/src/metadata/agentConfig.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/typescript/sdk/src/metadata/agentConfig.ts b/typescript/sdk/src/metadata/agentConfig.ts index 9ff999c0dc..58a80dc709 100644 --- a/typescript/sdk/src/metadata/agentConfig.ts +++ b/typescript/sdk/src/metadata/agentConfig.ts @@ -310,8 +310,8 @@ export const AgentConfigSchema = z.object({ .optional(), }); -const CommaSeperatedChainList = z.string().regex(/^[a-z0-9]+(,[a-z0-9]+)*$/); -const CommaSeperatedDomainList = z.string().regex(/^\d+(,\d+)*$/); +const CommaSeparatedChainList = z.string().regex(/^[a-z0-9]+(,[a-z0-9]+)*$/); +const CommaSeparatedDomainList = z.string().regex(/^\d+(,\d+)*$/); export enum GasPaymentEnforcementPolicyType { None = 'none', @@ -355,7 +355,7 @@ export const RelayerAgentConfigSchema = AgentConfigSchema.extend({ .min(1) .optional() .describe('The path to the relayer database.'), - relayChains: CommaSeperatedChainList.describe( + relayChains: CommaSeparatedChainList.describe( 'Comma separated list of chains to relay messages between.', ), gasPaymentEnforcement: z @@ -383,7 +383,7 @@ export const RelayerAgentConfigSchema = AgentConfigSchema.extend({ transactionGasLimit: ZUWei.optional().describe( 'This is optional. If not specified, any amount of gas will be valid, otherwise this is the max allowed gas in wei to relay a transaction.', ), - skipTransactionGasLimitFor: CommaSeperatedDomainList.optional().describe( + skipTransactionGasLimitFor: CommaSeparatedDomainList.optional().describe( 'Comma separated List of chain names to skip applying the transaction gas limit to.', ), allowLocalCheckpointSyncers: z @@ -404,7 +404,7 @@ export type RelayerConfig = z.infer; export const ScraperAgentConfigSchema = AgentConfigSchema.extend({ db: z.string().min(1).describe('Database connection string'), - chainsToScrape: CommaSeperatedChainList.describe( + chainsToScrape: CommaSeparatedChainList.describe( 'Comma separated list of chain names to scrape', ), }); From 0c726fe6f757d51dddf6949fc65c4ee44ff91597 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 14 Jan 2025 10:39:19 +0000 Subject: [PATCH 60/81] fix: use non-AW proxy admin for pumpBTC deploy (#5078) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Moves away from the AW proxy admin for the pumpBTC deploy. I deployed new proxy admins that have already had ownership transferred to the pumpBTC team addresses that I deployed using the CLI (using a dummy warp route): - https://etherscan.io/address/0x64d4ba42f033927ca3babbbebaa11ac8caed9472#code - https://seitrace.com/address/0x932a0a357cbe9a06c0fcec8c56335da162c5d071?chain=pacific-1 Checker output atm: ``` $ yarn tsx ./scripts/check/check-deploy.ts -e mainnet3 -m warp --warpRouteId pumpBTCsei/ethereum-sei ┌─────────┬────────────┬────────┬──────────────┬──────────────┬─────────┬──────────────────────────────────────────────┬──────────────────────────────────────────────┐ │ (index) │ chain │ remote │ name │ type │ subType │ actual │ expected │ ├─────────┼────────────┼────────┼──────────────┼──────────────┼─────────┼──────────────────────────────────────────────┼──────────────────────────────────────────────┤ │ 0 │ 'ethereum' │ │ 'collateral' │ 'ProxyAdmin' │ │ '0x75EE15Ee1B4A75Fa3e2fDF5DF3253c25599cc659' │ '0x64d4ba42f033927ca3babbbebaa11ac8caed9472' │ │ 1 │ 'sei' │ │ 'synthetic' │ 'ProxyAdmin' │ │ '0x0761b0827849abbf7b0cC09CE14e1C93D87f5004' │ '0x932a0a357CbE9a06c0FCec8C56335DA162c5D071' │ └─────────┴────────────┴────────┴──────────────┴──────────────┴─────────┴──────────────────────────────────────────────┴──────────────────────────────────────────────┘ Error: Checking warp deploy yielded 2 violations at main (/Users/trevor/abacus-monorepo/typescript/infra/scripts/check/check-deploy.ts:48:15) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) ``` Haven't yet ran with `--govern`. This will result in some multisig txs. ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../configGetters/getEthereumSeiPumpBTCWarpConfig.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts index 9d073230a8..2f65c69323 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiPumpBTCWarpConfig.ts @@ -13,6 +13,7 @@ import { tokens, } from '../../../../../src/config/warp.js'; +// pumpBTC team const ethereumOwner = '0x77A0545Dc1Dc6bAee8d9c1d436c6688a75Ae5777'; const seiOwner = '0x14A359aE2446eaC89495b3F28b7a29cE2A17f392'; @@ -23,6 +24,11 @@ export const getEthereumSeiPumpBTCWarpConfig = async ( const ethereum: HypTokenRouterConfig = { ...routerConfig.ethereum, ...getOwnerConfigForAddress(ethereumOwner), + proxyAdmin: { + // Address explicitly specified as move away from the AW proxy admin + address: '0x64d4ba42f033927ca3babbbebaa11ac8caed9472', + owner: ethereumOwner, + }, type: TokenType.collateral, token: tokens.ethereum.pumpBTCsei, interchainSecurityModule: ethers.constants.AddressZero, @@ -31,6 +37,11 @@ export const getEthereumSeiPumpBTCWarpConfig = async ( const sei: HypTokenRouterConfig = { ...routerConfig.sei, ...getOwnerConfigForAddress(seiOwner), + proxyAdmin: { + // Address explicitly specified as move away from the AW proxy admin + address: '0x932a0a357CbE9a06c0FCec8C56335DA162c5D071', + owner: seiOwner, + }, type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, }; From ebcc119a3466be2ff5b879edbbe258659a7c5f14 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 14 Jan 2025 10:49:48 +0000 Subject: [PATCH 61/81] feat: scrape SOON (#5165) ### Description - Scrapes SOON - Temporarily disabling Neutron due to a chain stall and RPC issues there that cause the scraper to panic upon startup ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/agent.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 19b331cd90..d143d5849c 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -374,7 +374,8 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< moonbeam: true, morph: true, nero: true, - neutron: true, + // Jan 14th - temporarily disabled while Neutron chain is down and RPCs give issues, causing scraper startup problems + neutron: false, oortmainnet: true, optimism: true, orderly: true, @@ -397,7 +398,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< solanamainnet: true, soneium: true, sonic: true, - soon: false, + soon: true, stride: true, // subtensor: true, superseed: true, @@ -672,7 +673,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '53fafa6-20250110-125541', + tag: 'd365e55-20250114-011047', }, resources: scraperResources, }, From 9518dbc842335ebf5f718ee9be99138e7e057186 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:31:43 +0000 Subject: [PATCH 62/81] feat: enroll jan 6 batch (#5154) ### Description - feat: enroll jan 6 batch + torus - artela guru hemi nero torus xpla - add superlane validators for soneium - update validators for soon ### Drive-by changes - igp updates - improve resilience + error logging in HyperlaneHaasGovernor ### Related issues ### Backward compatibility ### Testing --------- Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com> --- .changeset/lucky-shirts-wait.md | 5 + .../environments/mainnet3/gasPrices.json | 22 +- .../config/environments/mainnet3/owners.ts | 9 + .../environments/mainnet3/tokenPrices.json | 224 +++++++++--------- .../infra/src/govern/HyperlaneHaasGovernor.ts | 54 ++++- typescript/sdk/src/consts/multisigIsm.ts | 44 +++- 6 files changed, 220 insertions(+), 138 deletions(-) create mode 100644 .changeset/lucky-shirts-wait.md diff --git a/.changeset/lucky-shirts-wait.md b/.changeset/lucky-shirts-wait.md new file mode 100644 index 0000000000..2fcf84f406 --- /dev/null +++ b/.changeset/lucky-shirts-wait.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': patch +--- + +Enroll new validators for artela, guru, hemi, nero, soneium, torus, xpla. diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index 5703d9e54f..57fb77c685 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -1,8 +1,4 @@ { - "acala": { - "amount": "100.007736839", - "decimals": 9 - }, "ancient8": { "amount": "0.001000252", "decimals": 9 @@ -32,7 +28,7 @@ "decimals": 9 }, "arthera": { - "amount": "1.025069", + "amount": "1.025195", "decimals": 9 }, "astar": { @@ -56,7 +52,7 @@ "decimals": 9 }, "b3": { - "amount": "0.001000252", + "amount": "0.001000265", "decimals": 9 }, "base": { @@ -100,7 +96,7 @@ "decimals": 9 }, "conflux": { - "amount": "20.0", + "amount": "20.0137155", "decimals": 9 }, "conwai": { @@ -224,7 +220,7 @@ "decimals": 9 }, "lisk": { - "amount": "0.016350221", + "amount": "0.068378422", "decimals": 9 }, "lukso": { @@ -240,7 +236,7 @@ "decimals": 9 }, "mantapacific": { - "amount": "0.003000336", + "amount": "0.003000503", "decimals": 9 }, "mantle": { @@ -260,7 +256,7 @@ "decimals": 9 }, "mint": { - "amount": "0.001000252", + "amount": "0.001000258", "decimals": 9 }, "mode": { @@ -383,10 +379,6 @@ "amount": "0.005", "decimals": 1 }, - "subtensor": { - "amount": "10.0", - "decimals": 9 - }, "superseed": { "amount": "0.001000252", "decimals": 9 @@ -432,7 +424,7 @@ "decimals": 9 }, "worldchain": { - "amount": "0.001000345", + "amount": "0.00100025", "decimals": 9 }, "xai": { diff --git a/typescript/infra/config/environments/mainnet3/owners.ts b/typescript/infra/config/environments/mainnet3/owners.ts index 27d3d5915c..45b707218f 100644 --- a/typescript/infra/config/environments/mainnet3/owners.ts +++ b/typescript/infra/config/environments/mainnet3/owners.ts @@ -188,6 +188,15 @@ export const icas: Partial< soneium: '0x5926599B8Aff45f1708b804B30213babdAD78C83', sonic: '0x5926599B8Aff45f1708b804B30213babdAD78C83', telos: '0xDde4Ce691d1c0579d48BCdd3491aA71472b6cC38', + + // Jan 13, 2025 batch + // ---------------------------------------------------------- + artela: '0x745CEA119757ea3e27093da590bC91f408bD4448', + guru: '0x825cF3d703F384E4aA846BA72eCf70f1985C91b6', + hemi: '0x8D18CBB212920e5ef070b23b813d82F8981cC276', + nero: '0xbBdb1682B2922C282b56DD716C29db5EFbdb5632', + torus: '0xc1e20A0D78E79B94D71d4bDBC8FD0Af7c856Dd7A', + xpla: '0x24832680dF0468967F413be1C83acfE24154F88D', } as const; export const DEPLOYER = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 4782b19b88..e61445708c 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,120 +1,118 @@ { - "acala": "0.089653", - "ancient8": "3322.32", - "alephzeroevmmainnet": "0.304513", - "apechain": "1.12", - "appchain": "3322.32", - "arbitrum": "3322.32", - "arbitrumnova": "3322.32", + "ancient8": "3157.26", + "alephzeroevmmainnet": "0.289682", + "apechain": "1.033", + "appchain": "3157.26", + "arbitrum": "3157.26", + "arbitrumnova": "3157.26", "artela": "1", - "arthera": "0.04381619", - "astar": "0.060902", - "astarzkevm": "3322.32", - "aurora": "3322.32", - "flame": "4.68", - "avalanche": "37.35", - "b3": "3322.32", - "base": "3322.32", - "bitlayer": "94486", - "blast": "3322.32", - "bob": "3322.32", - "boba": "3322.32", - "bsc": "697.34", - "bsquared": "94486", - "celo": "0.654458", - "cheesechain": "0.00095089", - "chilizmainnet": "0.083892", - "conflux": "0.150607", - "conwai": "0.00386317", - "coredao": "1.035", - "corn": "94486", - "cyber": "3322.32", - "degenchain": "0.01036196", - "dogechain": "0.334068", - "duckchain": "5.27", - "eclipsemainnet": "3322.32", - "endurance": "1.85", - "ethereum": "3322.32", - "everclear": "3322.32", - "evmos": "0.02100258", - "fantom": "0.657886", - "flare": "0.02377977", - "flowmainnet": "0.74421", - "form": "3322.32", - "fraxtal": "3305.2", - "fusemainnet": "0.02815644", + "arthera": "0.064897", + "astar": "0.055919", + "astarzkevm": "3157.26", + "aurora": "3157.26", + "flame": "4.59", + "avalanche": "34.4", + "b3": "3157.26", + "base": "3157.26", + "bitlayer": "92945", + "blast": "3157.26", + "bob": "3157.26", + "boba": "3157.26", + "bsc": "673.59", + "bsquared": "92945", + "celo": "0.581847", + "cheesechain": "0.00078503", + "chilizmainnet": "0.076522", + "conflux": "0.136733", + "conwai": "0.00370253", + "coredao": "0.911992", + "corn": "92945", + "cyber": "3157.26", + "degenchain": "0.00881689", + "dogechain": "0.324508", + "duckchain": "5.12", + "eclipsemainnet": "3157.26", + "endurance": "1.67", + "ethereum": "3157.26", + "everclear": "3157.26", + "evmos": "0.01831153", + "fantom": "0.691242", + "flare": "0.02285478", + "flowmainnet": "0.684473", + "form": "3157.26", + "fraxtal": "3168.75", + "fusemainnet": "0.02671613", "gnosis": "1.001", - "gravity": "0.03240489", - "guru": "0.01323541", - "harmony": "0.0248972", - "hemi": "3322.32", - "immutablezkevmmainnet": "1.27", - "inevm": "21.94", - "ink": "3322.32", - "injective": "21.94", - "kaia": "0.208261", - "kroma": "3322.32", - "linea": "3322.32", - "lisk": "3322.32", - "lukso": "2.04", - "lumia": "1.36", - "lumiaprism": "1.18", - "mantapacific": "3322.32", - "mantle": "1.18", - "merlin": "94299", - "metal": "3322.32", - "metis": "39.11", - "mint": "3322.32", - "mode": "3322.32", - "molten": "0.774347", - "moonbeam": "0.229674", - "morph": "3322.32", + "gravity": "0.02856525", + "guru": "0.01237776", + "harmony": "0.02187577", + "hemi": "3157.26", + "immutablezkevmmainnet": "1.15", + "inevm": "19.6", + "ink": "3157.26", + "injective": "19.6", + "kaia": "0.196648", + "kroma": "3157.26", + "linea": "3157.26", + "lisk": "3157.26", + "lukso": "1.86", + "lumia": "1.22", + "lumiaprism": "1.028", + "mantapacific": "3157.26", + "mantle": "1.075", + "merlin": "93829", + "metal": "3157.26", + "metis": "33.39", + "mint": "3157.26", + "mode": "3157.26", + "molten": "0.684775", + "moonbeam": "0.203587", + "morph": "3157.26", "nero": "1", - "neutron": "0.342006", - "oortmainnet": "0.141167", - "optimism": "3322.32", - "orderly": "3322.32", - "osmosis": "0.477102", - "polygon": "0.461528", - "polygonzkevm": "3322.32", - "polynomialfi": "3322.32", - "prom": "5.48", - "proofofplay": "3322.32", - "rarichain": "3322.32", - "real": "3322.32", - "redstone": "3322.32", - "rivalz": "3322.32", - "rootstockmainnet": "92811", - "sanko": "38.08", - "scroll": "3322.32", - "sei": "0.389316", - "shibarium": "0.449375", - "snaxchain": "3322.32", - "solanamainnet": "192.63", - "soneium": "3322.32", - "sonic": "0.657886", - "soon": "3322.32", - "stride": "0.559038", - "subtensor": "464.53", - "superseed": "3322.32", - "superpositionmainnet": "3322.32", - "swell": "3322.32", - "taiko": "3322.32", + "neutron": "0.311287", + "oortmainnet": "0.130473", + "optimism": "3157.26", + "orderly": "3157.26", + "osmosis": "0.424539", + "polygon": "0.426288", + "polygonzkevm": "3157.26", + "polynomialfi": "3157.26", + "prom": "8.71", + "proofofplay": "3157.26", + "rarichain": "3157.26", + "real": "3157.26", + "redstone": "3157.26", + "rivalz": "3157.26", + "rootstockmainnet": "92886", + "sanko": "28.27", + "scroll": "3157.26", + "sei": "0.354988", + "shibarium": "0.428417", + "snaxchain": "3157.26", + "solanamainnet": "180", + "soneium": "3157.26", + "sonic": "0.691242", + "soon": "3157.26", + "stride": "0.496384", + "superseed": "3157.26", + "superpositionmainnet": "3157.26", + "swell": "3157.26", + "taiko": "3157.26", "tangle": "1", - "telos": "0.198429", + "telos": "0.187567", "torus": "1", - "treasure": "0.487988", - "unichain": "3322.32", - "vana": "14.29", - "viction": "0.387143", - "worldchain": "3322.32", - "xai": "0.214185", - "xlayer": "47.19", - "xpla": "0.085456", - "zeronetwork": "3322.32", - "zetachain": "0.539346", - "zircuit": "3322.32", - "zklink": "3322.32", - "zksync": "3322.32", - "zoramainnet": "3322.32" + "treasure": "0.431467", + "unichain": "3157.26", + "vana": "12.43", + "viction": "0.342602", + "worldchain": "3157.26", + "xai": "0.188817", + "xlayer": "46.4", + "xpla": "0.082477", + "zeronetwork": "3157.26", + "zetachain": "0.483465", + "zircuit": "3157.26", + "zklink": "3157.26", + "zksync": "3157.26", + "zoramainnet": "3157.26" } diff --git a/typescript/infra/src/govern/HyperlaneHaasGovernor.ts b/typescript/infra/src/govern/HyperlaneHaasGovernor.ts index 6fa6ebcd18..42703c1726 100644 --- a/typescript/infra/src/govern/HyperlaneHaasGovernor.ts +++ b/typescript/infra/src/govern/HyperlaneHaasGovernor.ts @@ -1,3 +1,5 @@ +import chalk from 'chalk'; + import { ChainName, CheckerViolation, @@ -5,7 +7,11 @@ import { HyperlaneCore, HyperlaneCoreChecker, InterchainAccount, + ViolationType, } from '@hyperlane-xyz/sdk'; +import { ProtocolType, rootLogger } from '@hyperlane-xyz/utils'; + +import { chainsToSkip } from '../config/chain.js'; import { AnnotatedCallData, @@ -71,8 +77,52 @@ export class HyperlaneHaasGovernor extends HyperlaneAppGovernor< } async check(chainsToCheck?: ChainName[]) { - await this.icaChecker.check(chainsToCheck); - await this.coreChecker.check(chainsToCheck); + // Get all EVM chains from core config + const evmChains = this.coreChecker.getEvmChains(); + + // Mark any EVM chains that are not deployed + const appChains = this.coreChecker.app.chains(); + for (const chain of evmChains) { + if (!appChains.includes(chain)) { + this.coreChecker.addViolation({ + type: ViolationType.NotDeployed, + chain, + expected: '', + actual: '', + }); + } + } + + // Finally, check the chains that were explicitly requested + // If no chains were requested, check all app chains + const chains = + !chainsToCheck || chainsToCheck.length === 0 ? appChains : chainsToCheck; + const failedChains: ChainName[] = []; + if (chainsToSkip.length > 0) { + rootLogger.info( + chalk.yellow('Skipping chains:', chainsToSkip.join(', ')), + ); + } + await Promise.allSettled( + chains + .filter( + (chain) => + this.coreChecker.multiProvider.getChainMetadata(chain).protocol === + ProtocolType.Ethereum && !chainsToSkip.includes(chain), + ) + .map(async (chain) => { + try { + await this.checkChain(chain); + } catch (err) { + rootLogger.error(chalk.red(`Failed to check chain ${chain}:`, err)); + failedChains.push(chain); + } + }), + ); + + if (failedChains.length > 0) { + rootLogger.error(chalk.red('Failed chains:', failedChains.join(', '))); + } } async checkChain(chain: ChainName) { diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 9340fa0c71..fcf940aa7a 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -187,12 +187,14 @@ export const defaultMultisigConfigs: ChainMap = { }, artela: { - threshold: 1, + threshold: 2, validators: [ { address: '0x8fcc1ebd4c0b463618db13f83e4565af3e166b00', alias: AW_VALIDATOR_ALIAS, }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, @@ -863,12 +865,14 @@ export const defaultMultisigConfigs: ChainMap = { }, guru: { - threshold: 1, + threshold: 2, validators: [ { address: '0x0d756d9051f12c4de6aee2ee972193a2adfe00ef', alias: AW_VALIDATOR_ALIAS, }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, @@ -885,12 +889,14 @@ export const defaultMultisigConfigs: ChainMap = { }, hemi: { - threshold: 1, + threshold: 2, validators: [ { address: '0x312dc72c17d01f3fd0abd31dd9b569bc473266dd', alias: AW_VALIDATOR_ALIAS, }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, @@ -1260,12 +1266,14 @@ export const defaultMultisigConfigs: ChainMap = { }, nero: { - threshold: 1, + threshold: 2, validators: [ { address: '0xb86f872df37f11f33acbe75b6ed208b872b57183', alias: AW_VALIDATOR_ALIAS, }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, @@ -1667,12 +1675,26 @@ export const defaultMultisigConfigs: ChainMap = { }, soneium: { - threshold: 1, + threshold: 4, validators: [ { address: '0xd4b7af853ed6a2bfc329ecef545df90c959cbee8', alias: AW_VALIDATOR_ALIAS, }, + { + address: '0x9f4fa50ce49815b0932428a0eb1988382cef4a97', + alias: 'Imperator', + }, + { + address: '0x8d2f8ebd61d055d58768cf3b07cb2fb565d87716', + alias: 'Enigma', + }, + { + address: '0x6c5f6ab7a369222e6691218ad981fe08a5def094', + alias: 'Luganodes', + }, + DEFAULT_BWARE_LABS_VALIDATOR, + DEFAULT_TESSELLATED_VALIDATOR, ], }, @@ -1709,12 +1731,14 @@ export const defaultMultisigConfigs: ChainMap = { }, soon: { - threshold: 1, + threshold: 2, validators: [ { address: '0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76', alias: AW_VALIDATOR_ALIAS, }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, @@ -1882,12 +1906,14 @@ export const defaultMultisigConfigs: ChainMap = { }, torus: { - threshold: 1, + threshold: 2, validators: [ { address: '0x96982a325c28a842bc8cf61b63000737bb9f1f7d', alias: AW_VALIDATOR_ALIAS, }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, @@ -2020,12 +2046,14 @@ export const defaultMultisigConfigs: ChainMap = { }, xpla: { - threshold: 1, + threshold: 2, validators: [ { address: '0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e', alias: AW_VALIDATOR_ALIAS, }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, From fa3ef92b50596b923d8f908e1d0a0f707d348a3f Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 14 Jan 2025 13:23:05 +0000 Subject: [PATCH 63/81] feat: update Solana ISM, add new SOON warp IDs (#5148) ### Description - Updates the Solana ISM to include the new SOON set. Did this by created a new multisig ISM program (used to be rc) and moving it up in the world as the hyperlane context. ISM update has already occurred. - Added SOL and Bonk warp routes to enum with the goal of deploying warp route monitors. Moved them back to using the default ISM ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../gas-oracle-configs-eclipsemainnet.json | 2 +- .../hyperlane/multisig-config.json | 762 +++++++++--- .../{rc => hyperlane}/program-ids.json | 0 .../solanamainnet/rc/multisig-config.json | 1047 ----------------- .../solanamainnet/core/program-ids.json | 2 +- .../soon/gas-oracle-configs-soon.json | 2 +- .../Bonk-solanamainnet-soon/token-config.json | 1 - .../SOL-solanamainnet-soon/program-ids.json | 8 +- .../SOL-solanamainnet-soon/token-config.json | 3 +- .../environments/mainnet3/warp/warpIds.ts | 2 + typescript/infra/src/warp/helm.ts | 2 +- 11 files changed, 631 insertions(+), 1200 deletions(-) rename rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/{rc => hyperlane}/program-ids.json (100%) delete mode 100644 rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json diff --git a/rust/sealevel/environments/mainnet3/eclipsemainnet/gas-oracle-configs-eclipsemainnet.json b/rust/sealevel/environments/mainnet3/eclipsemainnet/gas-oracle-configs-eclipsemainnet.json index b459e88d4c..22fb0da678 100644 --- a/rust/sealevel/environments/mainnet3/eclipsemainnet/gas-oracle-configs-eclipsemainnet.json +++ b/rust/sealevel/environments/mainnet3/eclipsemainnet/gas-oracle-configs-eclipsemainnet.json @@ -13,7 +13,7 @@ "gasOracle": { "type": "remoteGasData", "tokenExchangeRate": "887000000000000000", - "gasPrice": "15", + "gasPrice": "20", "tokenDecimals": 9 } }, diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/multisig-config.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/multisig-config.json index 7ae8ee840f..b95441b72e 100644 --- a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/multisig-config.json +++ b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/multisig-config.json @@ -1,14 +1,43 @@ { + "alephzeroevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x33f20e6e775747d60301c6ea1c50e51f0389740c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa" + ] + }, "ancient8": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xbb5842ae0e05215b53df4787a29144efb7e67551", "0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969", "0x95c7bf235837cb5a609fe6c95870410b9f68bcff" - ], - "type": 3 + ] + }, + "apechain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "appchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x0531251bbadc1f9f19ccce3ca6b3f79f08eae1be", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "arbitrum": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", @@ -16,37 +45,73 @@ "0x5450447aee7b544c462c9352bef7cad049b0c2dc", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" - ], - "type": 3 + ] + }, + "arbitrumnova": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd2a5e9123308d187383c87053811a2c21bd8af1f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "arthera": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x13710ac11c36c169f62fba95767ae59a1e57098d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "astar": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x4d1b2cade01ee3493f44304653d8e352c66ec3e7", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "astarzkevm": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x89ecdd6caf138934bf3a2fb7b323984d72fd66de", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "aurora": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "avalanche": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x3fb8263859843bffb02950c492d492cae169f4cf", "0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" - ], - "type": 3 + ] + }, + "b3": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd77b516730a836fc41934e7d5864e72c165b934e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "base": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9", @@ -54,47 +119,66 @@ "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xcff391b4e516452d424db66beb9052b041a9ed79", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] }, "bitlayer": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "blast": { - "threshold": 2, + "type": "messageIdMultisigIsm", + "threshold": 3, "validators": [ "0xf20c0b09f597597c8d2430d3d72dfddaf09177d1", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0xae53467a5c2a9d9420c188d10fef5e1d9b9a5b80" - ], - "type": 3 + "0x1652d8ba766821cf01aeea34306dfc1cab964a32", + "0x54bb0036f777202371429e062fe6aee0d59442f9" + ] }, "bob": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x20f283be1eb0e81e22f51705dcb79883cfdd34aa", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "boba": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xebeb92c94ca8408e73aa16fd554cb3a7df075c59", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "bsc": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x570af9b7b36568c8877eebba6c6727aa9dab7268", "0x8292b1a53907ece0f76af8a50724e9492bcdc8a3", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] + }, + "bsquared": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcadc90933c9fbe843358a4e70e46ad2db78e28aa", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "celo": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x63478422679303c3e4fc611b771fa4a707ef7f4a", @@ -102,73 +186,119 @@ "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] }, "cheesechain": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x478fb53c6860ae8fc35235ba0d38d49b13128226", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ], - "type": 3 + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "chilizmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conflux": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "conwai": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "coredao": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xbd6e158a3f5830d99d7d2bce192695bc4a148de2", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "corn": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xc80b2e3e38220e02d194a0effa9d5bfe89894c07", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "cyber": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x94d7119ceeb802173b6924e6cc8c4cd731089a27", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "degenchain": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x433e311f19524cd64fb2123ad0aa1579a4e1fc83", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "dogechain": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xe43f742c37858746e6d7e458bc591180d0cba440", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "duckchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x91d55fe6dac596a6735d96365e21ce4bca21d83c", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "eclipsemainnet": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0", "0x3571223e745dc0fcbdefa164c9b826b90c0d2dac", "0xea83086a62617a7228ce4206fae2ea8b0ab23513", "0x4d4629f5bfeabe66edc7a78da26ef5273c266f97" - ], - "type": 3 + ] }, "endurance": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x28c5b322da06f184ebf68693c5d19df4d4af13e5", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x7419021c0de2772b763e554480158a82a291c1f2" - ], - "type": 3 + ] }, "ethereum": { + "type": "messageIdMultisigIsm", "threshold": 4, "validators": [ "0x03c842db86a6a3e524d4a6615390c1ea8e2b9541", @@ -178,111 +308,232 @@ "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", "0xb683b742b378632a5f73a2a5a45801b3489bba44", "0xbf1023eff3dba21263bf2db2add67a0d6bcda2de" - ], - "type": 3 + ] }, "everclear": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0xD79DFbF56ee2268f061cc613027a44A880f61Ba2" - ], - "type": 3 + ] + }, + "evmos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fantom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa779572028e634e16f26af5dfd4fa685f619457d", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "flame": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x1fa928ce884fa16357d4b8866e096392d4d81f43", + "0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab", + "0x09f9de08f7570c4146caa708dc9f75b56958957f", + "0xf1f4ae9959490380ad7863e79c3faf118c1fbf77", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] }, "flare": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xb65e52be342dba3ab2c088ceeb4290c744809134", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, - "fraxtal": { + "flowmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xe132235c958ca1f3f24d772e5970dd58da4c0f6e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59" + ] + }, + "form": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ - "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", + "0x58554b2e76167993b5fc000d0070a2f883cd333a", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "fraxtal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82", + "0x573e960e07ad74ea2c5f1e3c31b2055994b12797", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", "0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91" - ], - "type": 3 + ] }, "fusemainnet": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9", "0x6760226b34213d262D41D5291Ed57E81a68b4E0b", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ], - "type": 3 + ] }, "gnosis": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xd4df66a859585678f2ea8357161d896be19cc1ca", "0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] + }, + "gravity": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d549bf757a02a6f6068e9363196ecd958c974e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "harmony": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd677803a67651974b1c264171b5d7ca8838db8d5", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "immutablezkevmmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbdda85b19a5efbe09e52a32db1a072f043dd66da", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "inevm": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xf9e35ee88e4448a3673b4676a4e153e3584a08eb", - "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", + "0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc", "0x9ab11f38a609940153850df611c9a2175dcffe0f" - ], - "type": 3 + ] }, "injective": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xbfb8911b72cfb138c7ce517c57d9c691535dc517", "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", "0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9" - ], - "type": 3 + ] + }, + "ink": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xb533b8b104522958b984fb258e0684dec0f1a6a5", + "0xd207a6dfd887d91648b672727ff1aef6223cb15a", + "0xa40203b5301659f1e201848d92f5e81f64f206f5", + "0xff9c1e7b266a36eda0d9177d4236994d94819dc0", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "kaia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9de0b3abb221d19719882fa4d61f769fdc2be9a4", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "kroma": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x71b83c21342787d758199e4b8634d3a15f02dc6e", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "linea": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xf2d5409a59e0f5ae7635aff73685624904a77d94", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "lisk": { - "threshold": 2, + "type": "messageIdMultisigIsm", + "threshold": 4, "validators": [ "0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e", + "0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf0da628f3fb71652d48260bad4691054045832ce", + "0xead4141b6ea149901ce4f4b556953f66d04b1d0c" + ] }, "lukso": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xa5e953701dcddc5b958b5defb677a829d908df6d", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x101cE77261245140A0871f9407d6233C8230Ec47" - ], - "type": 3 + ] + }, + "lumia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "lumiaprism": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb69731640ffd4338a2c9358a935b0274c6463f85", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "mantapacific": { - "threshold": 5, + "type": "messageIdMultisigIsm", + "threshold": 4, "validators": [ "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", "0x521a3e6bf8d24809fde1c1fd3494a859a16f132c", @@ -291,75 +542,98 @@ "0xa0eE95e280D46C14921e524B075d0C341e7ad1C8", "0xcc9a0b6de7fe314bd99223687d784730a75bb957", "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" - ], - "type": 3 + ] }, "mantle": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "merlin": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "metal": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xd9f7f1a05826197a93df51e86cefb41dfbfb896a", + "0x01e3909133d20c05bbc94247769235d30101f748", + "0xaba06266f47e3ef554d218b879bd86114a8dabd4", + "0x05d91f80377ff5e9c6174025ffaf094c57a4766a", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] }, "metis": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xc4a3d25107060e800a43842964546db508092260", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "mint": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x0230505530b80186f8cdccfaf9993eb97aebe98a" - ], - "type": 3 + ] }, "mode": { - "threshold": 3, + "type": "messageIdMultisigIsm", + "threshold": 4, "validators": [ "0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x7e29608c6e5792bbf9128599ca309be0728af7b4", - "0x101cE77261245140A0871f9407d6233C8230Ec47" - ], - "type": 3 + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0x65C140e3a05F33192384AffEF985696Fe3cDDE42", + "0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x485a4f0009d9afbbf44521016f9b8cdd718e36ea" + ] }, "molten": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "moonbeam": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x2225e2f4e9221049456da93b71d2de41f3b6b2a8", "0x645428d198d2e76cbd9c1647f5c80740bb750b97", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" - ], - "type": 3 + ] + }, + "morph": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x4884535f393151ec419add872100d352f71af380", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "neutron": { + "type": "messageIdMultisigIsm", "threshold": 4, "validators": [ "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", @@ -369,203 +643,407 @@ "0x47aa126e05933b95c5eb90b26e6b668d84f4b25a", "0x54b2cca5091b098a1a993dec03c4d1ee9af65999", "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" - ], - "type": 3 + ] }, "oortmainnet": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x032dE4f94676bF9314331e7D83E8Db4aC74c9E21" - ], - "type": 3 + "0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1" + ] }, "optimism": { - "threshold": 3, + "type": "messageIdMultisigIsm", + "threshold": 4, "validators": [ "0x20349eadc6c72e94ce38268b96692b1a5c20de4f", - "0x5b7d47b76c69740462432f6a5a0ca5005e014157", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", + "0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB", + "0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12" + ] + }, + "orderly": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "osmosis": { + "type": "messageIdMultisigIsm", "threshold": 1, "validators": [ "0xea483af11c19fa41b16c31d1534c2a486a92bcac" - ], - "type": 3 + ] }, "polygon": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", "0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ], - "type": 3 + ] }, "polygonzkevm": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x86f2a44592bb98da766e880cfd70d3bbb295e61a", "0x865818fe1db986036d5fd0466dcd462562436d1a", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" - ], - "type": 3 + ] + }, + "polynomialfi": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x23d348c2d365040e56f3fee07e6897122915f513", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "prom": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb0c4042b7c9a95345be8913f4cdbf4043b923d98", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "proofofplay": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xcda40baa71970a06e5f55e306474de5ca4e21c3b", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "rarichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xeac012df7530720dd7d6f9b727e4fe39807d1516", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "real": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "redstone": { - "threshold": 2, + "type": "messageIdMultisigIsm", + "threshold": 3, "validators": [ "0x1400b9737007f7978d8b4bbafb4a69c83f0641a7", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x101cE77261245140A0871f9407d6233C8230Ec47" + ] + }, + "rivalz": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "rootstockmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x8675eb603d62ab64e3efe90df914e555966e04ac", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "sanko": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x795c37d5babbc44094b084b0c89ed9db9b5fae39", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "scroll": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xad557170a9f2f21c35e03de07cb30dcbcc3dff63", "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", "0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948" - ], - "type": 3 + ] }, "sei": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x101cE77261245140A0871f9407d6233C8230Ec47", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "shibarium": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xfa33391ee38597cbeef72ccde8c9e13e01e78521", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] + }, + "snaxchain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "soneium": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd4b7af853ed6a2bfc329ecef545df90c959cbee8" + ] + }, + "sonic": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "soon": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "stride": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", + "0x88f0E5528131b10e3463C4c68108217Dd33462ac", + "0xa3eaa1216827ad63dd9db43f6168258a89177990", + "0x3f869C36110F00D10dC74cca3ac1FB133cf019ad", + "0x502dC6135d16E74056f609FBAF76846814C197D3", + "0xc36979780c1aD43275182600a61Ce41f1C390FbE", + "0x87460dcEd16a75AECdBffD4189111d30B099f5b0", + "0xf54982134e52Eb7253236943FBffE0886C5bde0C", + "0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d", + "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" + ] + }, + "superpositionmainnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "superseed": { + "type": "messageIdMultisigIsm", + "threshold": 4, + "validators": [ + "0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88", + "0x68f3a3b244f6ddc135130200a6b8729e290b4240", + "0x6ff4554cffbc2e4e4230b78e526eab255101d05a", + "0x55880ac03fdf15fccff54ed6f8a83455033edd22", + "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", + "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" + ] + }, + "swell": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x4f51e4f4c7fb45d82f91568480a1a2cfb69216ed", + "0x9eadf9217be22d9878e0e464727a2176d5c69ff8", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] }, "taiko": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xa930073c8f2d0b2f7423ea32293e0d1362e65d79", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", "0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a" - ], - "type": 3 + ] }, "tangle": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0xe271ef9a6e312540f099a378865432fa73f26689" - ], - "type": 3 + ] + }, + "telos": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "treasure": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0x6ad994819185553e8baa01533f0cd2c7cadfe6cc", + "0x278460fa51ff448eb53ffa62951b4b8e3e8f74e3", + "0xe92ff70bb463e2aa93426fd2ba51afc39567d426", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" + ] + }, + "unichain": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x9773a382342ebf604a2e5de0a1f462fb499e28b1", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "vana": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0xba2f4f89cae6863d8b49e4ca0208ed48ad9ac354" + ] }, "viction": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ - "0x4E53dA92cD5Bf0a032b6B4614b986926456756A7", + "0x6D113Ae51bfeA7b63a8828f97e9dcE393B25c189", "0xa3f93fe365bf99f431d8fde740b140615e24f99b", "0x1f87c368f8e05a85ef9126d984a980a20930cb9c" - ], - "type": 3 + ] }, "worldchain": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x31048785845325b22817448b68d08f8a8fe36854", "0x11e2a683e83617f186614071e422b857256a9aae", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ], - "type": 3 + ] }, "xai": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "xlayer": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xa2ae7c594703e988f23d97220717c513db638ea3", "0xfed056cC0967F5BC9C6350F6C42eE97d3983394d", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ], - "type": 3 + ] + }, + "zeronetwork": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] }, "zetachain": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x101cE77261245140A0871f9407d6233C8230Ec47", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] }, "zircuit": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb", "0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061", "0x0180444c9342BD672867Df1432eb3dA354413a6E", "0x1da9176C2CE5cC7115340496fa7D1800a98911CE" - ], - "type": 3 + ] + }, + "zklink": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x217a8cb4789fc45abf56cb6e2ca96f251a5ac181", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" + ] + }, + "zksync": { + "type": "messageIdMultisigIsm", + "threshold": 3, + "validators": [ + "0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a", + "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", + "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", + "0x75237d42ce8ea27349a0254ada265db94157e0c1" + ] }, "zoramainnet": { + "type": "messageIdMultisigIsm", "threshold": 3, "validators": [ "0x35130945b625bb69b28aee902a3b9a76fa67125f", "0x7089b6352d37d23fb05a7fee4229c78e038fba09", "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ], - "type": 3 + ] } } diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/program-ids.json similarity index 100% rename from rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/program-ids.json rename to rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/hyperlane/program-ids.json diff --git a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json b/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json deleted file mode 100644 index 490a5ab2ba..0000000000 --- a/rust/sealevel/environments/mainnet3/multisig-ism-message-id/solanamainnet/rc/multisig-config.json +++ /dev/null @@ -1,1047 +0,0 @@ -{ - "alephzeroevmmainnet": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x33f20e6e775747d60301c6ea1c50e51f0389740c", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa" - ] - }, - "ancient8": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xbb5842ae0e05215b53df4787a29144efb7e67551", - "0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969", - "0x95c7bf235837cb5a609fe6c95870410b9f68bcff" - ] - }, - "apechain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "appchain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x0531251bbadc1f9f19ccce3ca6b3f79f08eae1be", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "arbitrum": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", - "0xec68258a7c882ac2fc46b81ce80380054ffb4ef2", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" - ] - }, - "arbitrumnova": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xd2a5e9123308d187383c87053811a2c21bd8af1f", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "arthera": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x13710ac11c36c169f62fba95767ae59a1e57098d", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "astar": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x4d1b2cade01ee3493f44304653d8e352c66ec3e7", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "astarzkevm": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x89ecdd6caf138934bf3a2fb7b323984d72fd66de", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "aurora": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "avalanche": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x3fb8263859843bffb02950c492d492cae169f4cf", - "0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" - ] - }, - "b3": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xd77b516730a836fc41934e7d5864e72c165b934e", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "base": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0xcff391b4e516452d424db66beb9052b041a9ed79", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ] - }, - "bitlayer": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "blast": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xf20c0b09f597597c8d2430d3d72dfddaf09177d1", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x1652d8ba766821cf01aeea34306dfc1cab964a32", - "0x54bb0036f777202371429e062fe6aee0d59442f9" - ] - }, - "bob": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x20f283be1eb0e81e22f51705dcb79883cfdd34aa", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "boba": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xebeb92c94ca8408e73aa16fd554cb3a7df075c59", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "bsc": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x570af9b7b36568c8877eebba6c6727aa9dab7268", - "0x8292b1a53907ece0f76af8a50724e9492bcdc8a3", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ] - }, - "bsquared": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xcadc90933c9fbe843358a4e70e46ad2db78e28aa", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "celo": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x63478422679303c3e4fc611b771fa4a707ef7f4a", - "0x622e43baf06ad808ca8399360d9a2d9a1a12688b", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ] - }, - "cheesechain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x478fb53c6860ae8fc35235ba0d38d49b13128226", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x101cE77261245140A0871f9407d6233C8230Ec47" - ] - }, - "chilizmainnet": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "conflux": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "conwai": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "coredao": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xbd6e158a3f5830d99d7d2bce192695bc4a148de2", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "corn": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xc80b2e3e38220e02d194a0effa9d5bfe89894c07", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "cyber": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x94d7119ceeb802173b6924e6cc8c4cd731089a27", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "degenchain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x433e311f19524cd64fb2123ad0aa1579a4e1fc83", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "dogechain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xe43f742c37858746e6d7e458bc591180d0cba440", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "duckchain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x91d55fe6dac596a6735d96365e21ce4bca21d83c", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "eclipsemainnet": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0", - "0x3571223e745dc0fcbdefa164c9b826b90c0d2dac", - "0xea83086a62617a7228ce4206fae2ea8b0ab23513", - "0x4d4629f5bfeabe66edc7a78da26ef5273c266f97" - ] - }, - "endurance": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x28c5b322da06f184ebf68693c5d19df4d4af13e5", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x7419021c0de2772b763e554480158a82a291c1f2" - ] - }, - "ethereum": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0x03c842db86a6a3e524d4a6615390c1ea8e2b9541", - "0x94438a7de38d4548ae54df5c6010c4ebc5239eae", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", - "0xb683b742b378632a5f73a2a5a45801b3489bba44", - "0xbf1023eff3dba21263bf2db2add67a0d6bcda2de" - ] - }, - "everclear": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0xD79DFbF56ee2268f061cc613027a44A880f61Ba2" - ] - }, - "evmos": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "fantom": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xa779572028e634e16f26af5dfd4fa685f619457d", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "flame": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x1fa928ce884fa16357d4b8866e096392d4d81f43", - "0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab", - "0x09f9de08f7570c4146caa708dc9f75b56958957f", - "0xf1f4ae9959490380ad7863e79c3faf118c1fbf77", - "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" - ] - }, - "flare": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xb65e52be342dba3ab2c088ceeb4290c744809134", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "flowmainnet": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xe132235c958ca1f3f24d772e5970dd58da4c0f6e", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59" - ] - }, - "form": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x58554b2e76167993b5fc000d0070a2f883cd333a", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "fraxtal": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1", - "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", - "0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82", - "0x573e960e07ad74ea2c5f1e3c31b2055994b12797", - "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", - "0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91" - ] - }, - "fusemainnet": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9", - "0x6760226b34213d262D41D5291Ed57E81a68b4E0b", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ] - }, - "gnosis": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xd4df66a859585678f2ea8357161d896be19cc1ca", - "0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ] - }, - "gravity": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x23d549bf757a02a6f6068e9363196ecd958c974e", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "harmony": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xd677803a67651974b1c264171b5d7ca8838db8d5", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "immutablezkevmmainnet": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xbdda85b19a5efbe09e52a32db1a072f043dd66da", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "inevm": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xf9e35ee88e4448a3673b4676a4e153e3584a08eb", - "0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc", - "0x9ab11f38a609940153850df611c9a2175dcffe0f" - ] - }, - "injective": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xbfb8911b72cfb138c7ce517c57d9c691535dc517", - "0x6B1d09A97b813D53e9D4b7523DA36604C0B52242", - "0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9" - ] - }, - "ink": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0xb533b8b104522958b984fb258e0684dec0f1a6a5", - "0xd207a6dfd887d91648b672727ff1aef6223cb15a", - "0xa40203b5301659f1e201848d92f5e81f64f206f5", - "0xff9c1e7b266a36eda0d9177d4236994d94819dc0", - "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", - "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" - ] - }, - "kaia": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x9de0b3abb221d19719882fa4d61f769fdc2be9a4", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "kroma": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x71b83c21342787d758199e4b8634d3a15f02dc6e", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "linea": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xf2d5409a59e0f5ae7635aff73685624904a77d94", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "lisk": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5", - "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", - "0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e", - "0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf", - "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", - "0xf0da628f3fb71652d48260bad4691054045832ce", - "0xead4141b6ea149901ce4f4b556953f66d04b1d0c" - ] - }, - "lukso": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xa5e953701dcddc5b958b5defb677a829d908df6d", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x101cE77261245140A0871f9407d6233C8230Ec47" - ] - }, - "lumia": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "lumiaprism": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xb69731640ffd4338a2c9358a935b0274c6463f85", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "mantapacific": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", - "0x521a3e6bf8d24809fde1c1fd3494a859a16f132c", - "0x14025fe092f5f8a401dd9819704d9072196d2125", - "0x25b9a0961c51e74fd83295293bc029131bf1e05a", - "0xa0eE95e280D46C14921e524B075d0C341e7ad1C8", - "0xcc9a0b6de7fe314bd99223687d784730a75bb957", - "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" - ] - }, - "mantle": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "merlin": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "metal": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0xd9f7f1a05826197a93df51e86cefb41dfbfb896a", - "0x01e3909133d20c05bbc94247769235d30101f748", - "0xaba06266f47e3ef554d218b879bd86114a8dabd4", - "0x05d91f80377ff5e9c6174025ffaf094c57a4766a", - "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", - "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" - ] - }, - "metis": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xc4a3d25107060e800a43842964546db508092260", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "mint": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x0230505530b80186f8cdccfaf9993eb97aebe98a" - ] - }, - "mode": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7", - "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", - "0x65C140e3a05F33192384AffEF985696Fe3cDDE42", - "0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b", - "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", - "0x485a4f0009d9afbbf44521016f9b8cdd718e36ea" - ] - }, - "molten": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "moonbeam": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x2225e2f4e9221049456da93b71d2de41f3b6b2a8", - "0x645428d198d2e76cbd9c1647f5c80740bb750b97", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" - ] - }, - "morph": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x4884535f393151ec419add872100d352f71af380", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "neutron": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", - "0xb65438a014fb05fbadcfe35bc6e25d372b6ba460", - "0x42fa752defe92459370a052b6387a87f7de9b80c", - "0xc79503a3e3011535a9c60f6d21f76f59823a38bd", - "0x47aa126e05933b95c5eb90b26e6b668d84f4b25a", - "0x54b2cca5091b098a1a993dec03c4d1ee9af65999", - "0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf" - ] - }, - "oortmainnet": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1" - ] - }, - "optimism": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0x20349eadc6c72e94ce38268b96692b1a5c20de4f", - "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4", - "0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB", - "0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99", - "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", - "0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12" - ] - }, - "orderly": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "osmosis": { - "type": "messageIdMultisigIsm", - "threshold": 1, - "validators": [ - "0xea483af11c19fa41b16c31d1534c2a486a92bcac" - ] - }, - "polygon": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", - "0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0x5450447aee7b544c462c9352bef7cad049b0c2dc" - ] - }, - "polygonzkevm": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x86f2a44592bb98da766e880cfd70d3bbb295e61a", - "0x865818fe1db986036d5fd0466dcd462562436d1a", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8" - ] - }, - "polynomialfi": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x23d348c2d365040e56f3fee07e6897122915f513", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "prom": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xb0c4042b7c9a95345be8913f4cdbf4043b923d98", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "proofofplay": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xcda40baa71970a06e5f55e306474de5ca4e21c3b", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "rarichain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xeac012df7530720dd7d6f9b727e4fe39807d1516", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "real": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "redstone": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x1400b9737007f7978d8b4bbafb4a69c83f0641a7", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x101cE77261245140A0871f9407d6233C8230Ec47" - ] - }, - "rivalz": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "rootstockmainnet": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x8675eb603d62ab64e3efe90df914e555966e04ac", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "sanko": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x795c37d5babbc44094b084b0c89ed9db9b5fae39", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "scroll": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xad557170a9f2f21c35e03de07cb30dcbcc3dff63", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b", - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948" - ] - }, - "sei": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x101cE77261245140A0871f9407d6233C8230Ec47", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "shibarium": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xfa33391ee38597cbeef72ccde8c9e13e01e78521", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "snaxchain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "soneium": { - "type": "messageIdMultisigIsm", - "threshold": 1, - "validators": [ - "0xd4b7af853ed6a2bfc329ecef545df90c959cbee8" - ] - }, - "sonic": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "soon": { - "type": "messageIdMultisigIsm", - "threshold": 1, - "validators": [ - "0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76" - ] - }, - "stride": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8", - "0x88f0E5528131b10e3463C4c68108217Dd33462ac", - "0xa3eaa1216827ad63dd9db43f6168258a89177990", - "0x3f869C36110F00D10dC74cca3ac1FB133cf019ad", - "0x502dC6135d16E74056f609FBAF76846814C197D3", - "0xc36979780c1aD43275182600a61Ce41f1C390FbE", - "0x87460dcEd16a75AECdBffD4189111d30B099f5b0", - "0xf54982134e52Eb7253236943FBffE0886C5bde0C", - "0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d", - "0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b" - ] - }, - "superpositionmainnet": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "superseed": { - "type": "messageIdMultisigIsm", - "threshold": 4, - "validators": [ - "0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88", - "0x68f3a3b244f6ddc135130200a6b8729e290b4240", - "0x6ff4554cffbc2e4e4230b78e526eab255101d05a", - "0x55880ac03fdf15fccff54ed6f8a83455033edd22", - "0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3", - "0x0d4c1394a255568ec0ecd11795b28d1bda183ca4" - ] - }, - "swell": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x4f51e4f4c7fb45d82f91568480a1a2cfb69216ed", - "0x9eadf9217be22d9878e0e464727a2176d5c69ff8", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" - ] - }, - "taiko": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xa930073c8f2d0b2f7423ea32293e0d1362e65d79", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a" - ] - }, - "tangle": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0xe271ef9a6e312540f099a378865432fa73f26689" - ] - }, - "telos": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "treasure": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x6ad994819185553e8baa01533f0cd2c7cadfe6cc", - "0x278460fa51ff448eb53ffa62951b4b8e3e8f74e3", - "0xe92ff70bb463e2aa93426fd2ba51afc39567d426", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb" - ] - }, - "unichain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x9773a382342ebf604a2e5de0a1f462fb499e28b1", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "vana": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0xba2f4f89cae6863d8b49e4ca0208ed48ad9ac354" - ] - }, - "viction": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x6D113Ae51bfeA7b63a8828f97e9dcE393B25c189", - "0xa3f93fe365bf99f431d8fde740b140615e24f99b", - "0x1f87c368f8e05a85ef9126d984a980a20930cb9c" - ] - }, - "worldchain": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x31048785845325b22817448b68d08f8a8fe36854", - "0x11e2a683e83617f186614071e422b857256a9aae", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ] - }, - "xai": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "xlayer": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0xa2ae7c594703e988f23d97220717c513db638ea3", - "0xfed056cC0967F5BC9C6350F6C42eE97d3983394d", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" - ] - }, - "zeronetwork": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "zetachain": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x101cE77261245140A0871f9407d6233C8230Ec47", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "zircuit": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb", - "0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061", - "0x0180444c9342BD672867Df1432eb3dA354413a6E", - "0x1da9176C2CE5cC7115340496fa7D1800a98911CE" - ] - }, - "zklink": { - "type": "messageIdMultisigIsm", - "threshold": 2, - "validators": [ - "0x217a8cb4789fc45abf56cb6e2ca96f251a5ac181", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - }, - "zksync": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36", - "0x75237d42ce8ea27349a0254ada265db94157e0c1" - ] - }, - "zoramainnet": { - "type": "messageIdMultisigIsm", - "threshold": 3, - "validators": [ - "0x35130945b625bb69b28aee902a3b9a76fa67125f", - "0x7089b6352d37d23fb05a7fee4229c78e038fba09", - "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f", - "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" - ] - } -} diff --git a/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json b/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json index 642218fbae..fb347daf42 100644 --- a/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json +++ b/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json @@ -1,7 +1,7 @@ { "mailbox": "E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi", "validator_announce": "pRgs5vN4Pj7WvFbxf6QDHizo2njq2uksqEUbaSghVA8", - "multisig_ism_message_id": "372D5YP7jMYUgYBXTVJ7BZtzKv1mq1J6wvjSFLNTRreC", + "multisig_ism_message_id": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM", "igp_program_id": "BhNcatUDC2D5JTyeaqrdSukiVFsEHK7e3hVmKMztwefv", "overhead_igp_account": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", "igp_account": "JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M" diff --git a/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json b/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json index 5a0f6bc9a9..4e0dad08ce 100644 --- a/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json +++ b/rust/sealevel/environments/mainnet3/soon/gas-oracle-configs-soon.json @@ -13,7 +13,7 @@ "gasOracle": { "type": "remoteGasData", "tokenExchangeRate": "887000000000000000", - "gasPrice": "15", + "gasPrice": "20", "tokenDecimals": 9 } } diff --git a/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json index 9f4972c9c0..1f8e4421e1 100644 --- a/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json +++ b/rust/sealevel/environments/mainnet3/warp-routes/Bonk-solanamainnet-soon/token-config.json @@ -3,7 +3,6 @@ "type": "collateral", "decimals": 5, "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", - "interchainSecurityModule": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM", "token": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", "splTokenProgram": "token" }, diff --git a/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json index 6d68609266..87a3366874 100644 --- a/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json +++ b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/program-ids.json @@ -1,10 +1,10 @@ { - "solanamainnet": { - "hex": "0xe492f8f3cb623b87d8ae46ecdb541424ae870a39110ad09087a793b0237aaff7", - "base58": "GPFwRQ5Cw6dTWnmappUKJt76DD8yawxPx28QugfCaGaA" - }, "soon": { "hex": "0x50c3447854a0cf980f4a562fd34ce4031a0b7fe725521ad21482b74cb2b733ac", "base58": "6SGK4PnHefm4egyUUeVro8wKBkuPexVehsjuUK8auJ8b" + }, + "solanamainnet": { + "hex": "0xe492f8f3cb623b87d8ae46ecdb541424ae870a39110ad09087a793b0237aaff7", + "base58": "GPFwRQ5Cw6dTWnmappUKJt76DD8yawxPx28QugfCaGaA" } } \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json index e4d638b0fc..b443d2756d 100644 --- a/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json +++ b/rust/sealevel/environments/mainnet3/warp-routes/SOL-solanamainnet-soon/token-config.json @@ -2,8 +2,7 @@ "solanamainnet": { "type": "native", "decimals": 9, - "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", - "interchainSecurityModule": "HPNQHcc7wRcwsPG1aVBpPgpYuV7h2MJiVgKnAgTdDRBM" + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF" }, "soon": { "type": "synthetic", diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 2ce06831ea..97655e7c6b 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -50,4 +50,6 @@ export enum WarpRouteIds { EthereumFormWSTETH = 'WSTETH/ethereum-form', BaseFormAIXBT = 'AIXBT/base-form', BaseFormGAME = 'GAME/base-form', + SolanaSoonBonk = 'Bonk/solanamainnet-soon', + SolanaSoonSOL = 'SOL/solanamainnet-soon', } diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index be9b752f88..830e8f3e81 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '20a0c4b-20250109-221853', + tag: '98f8c26-20250110-182641', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From 8ca7121c5eb4cd7589fbf17b000e76f6367ca91b Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 14 Jan 2025 14:58:20 +0000 Subject: [PATCH 64/81] feat: deploy sonicsvmtestnet, revive solanatestnet (#5092) ### Description - Solanatestnet was deployed prior to adding protocol fees. I did a program upgrade and migration to have it support protocol fees now, was a fun exercise that can be found in the commit history. This made it once again compatible with the agents, hence the "revival" - Deployed to sonicsvmtestnet - Deployed a SOl warp route between solana testnet and sonicsvmtestnet ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .registryrc | 2 +- rust/main/config/mainnet_config.json | 210 ++-- rust/main/config/testnet_config.json | 94 +- .../environments/testnet4/chain-config.json | 1046 +++++++++++++++-- .../testnet4/gas-oracle-configs.json | 9 + .../hyperlane/multisig-config.json | 194 ++- .../hyperlane/multisig-config.json | 215 ++++ .../sonicsvmtestnet/core/program-ids.json | 8 + .../program-ids.json | 10 + .../token-config.json | 12 + .../hyperlane-sealevel-igp/Cargo.toml | 1 + rust/sealevel/programs/mailbox/Cargo.toml | 1 + .../config/environments/testnet4/agent.ts | 11 +- .../testnet4/aw-validators/hyperlane.json | 6 + .../config/environments/testnet4/funding.ts | 4 +- .../environments/testnet4/gasPrices.json | 40 +- .../config/environments/testnet4/owners.ts | 7 +- .../testnet4/supportedChainNames.ts | 1 + .../environments/testnet4/validators.ts | 24 + typescript/sdk/src/consts/multisigIsm.ts | 10 + 20 files changed, 1638 insertions(+), 267 deletions(-) create mode 100644 rust/sealevel/environments/testnet4/multisig-ism-message-id/sonicsvmtestnet/hyperlane/multisig-config.json create mode 100644 rust/sealevel/environments/testnet4/sonicsvmtestnet/core/program-ids.json create mode 100644 rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/program-ids.json create mode 100644 rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/token-config.json diff --git a/.registryrc b/.registryrc index 4b56572aa1..41ee7283ce 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -2184e5e3064ddec2734aa53c1aff6d9f7d958bdf +9d7868fa55b97d610c9c1916d22d71d3e67b5aa8 diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 77ec76fbd9..4aa9b27a4b 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -34,7 +34,7 @@ "interchainAccountIsm": "0xd766e7C7517f2d0D92754b2fe4aE7AdEf7bDEC3e", "interchainAccountRouter": "0x25C87e735021F72d8728438C2130b02E3141f2cb", "interchainGasPaymaster": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", - "interchainSecurityModule": "0xd3fA56EDc496f986df5D2464E4C2c6027F8b4cEf", + "interchainSecurityModule": "0x5860cdaD159184105b7473882376cA4E5Cf1916D", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x811808Dd29ba8B0FC6C0ec0b5537035E59745162", @@ -100,7 +100,7 @@ "interchainAccountIsm": "0x2A7574358Ec53522CE2452887661AB4c86F7d400", "interchainAccountRouter": "0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6", "interchainGasPaymaster": "0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22", - "interchainSecurityModule": "0xe99C998dd9823B9b713A100fB885dd192C0d86DA", + "interchainSecurityModule": "0xC53D7f366B1CB2EA7Dd99E6105B191Af100BDBEb", "mailbox": "0x979Ca5202784112f4738403dBec5D0F3B9daabB9", "merkleTreeHook": "0x748040afB89B8FdBb992799808215419d36A0930", "name": "arbitrum", @@ -172,7 +172,7 @@ "interchainAccountIsm": "0x27a3233c05C1Df7c163123301D14bE9349E3Cb48", "interchainAccountRouter": "0xa82a0227e6d6db53AF4B264A852bfF91C6504a51", "interchainGasPaymaster": "0x95519ba800BBd0d34eeAE026fEc620AD978176C0", - "interchainSecurityModule": "0xFf2139af114d1D43C7348CA7471e08c7B31213A3", + "interchainSecurityModule": "0xa52E6beDFaA418E0A3E34b698C440cCB43fb5092", "mailbox": "0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6", "merkleTreeHook": "0x84eea61D679F42D92145fA052C89900CBAccE95A", "name": "avalanche", @@ -245,7 +245,7 @@ "interchainAccountIsm": "0x223F7D3f27E6272266AE4B5B91Fd5C7A2d798cD8", "interchainAccountRouter": "0x4767D22117bBeeb295413000B620B93FD8522d53", "interchainGasPaymaster": "0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94", - "interchainSecurityModule": "0x22c3D036C518A3953c57Ec3101b404a78158b7e4", + "interchainSecurityModule": "0xEB5e4E0b7c4284221e456846057D179249a9009F", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x19dc38aeae620380430C200a6E990D5Af5480117", "name": "base", @@ -316,7 +316,7 @@ "interchainAccountIsm": "0xe93f2f409ad8B5000431D234472973fe848dcBEC", "interchainAccountRouter": "0x2f4Eb04189e11Af642237Da62d163Ab714614498", "interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9", - "interchainSecurityModule": "0xff226D43F30B95Fac99D225E6aD36f308ff03d7A", + "interchainSecurityModule": "0xa91A5Cd4847DDec9F66C523CfEC167C2016bE43F", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465", "name": "blast", @@ -384,7 +384,7 @@ "interchainAccountIsm": "0x451dF8AB0936D85526D816f0b4dCaDD934A034A4", "interchainAccountRouter": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "interchainGasPaymaster": "0x62B7592C1B6D1E43f4630B8e37f4377097840C05", - "interchainSecurityModule": "0xD94FA19BaC0A4f8Aa14D4ccB4B7A7Efb777F0A1e", + "interchainSecurityModule": "0x136aB2D5748536fF0BE18110a1ce479Ac4344fa1", "mailbox": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", "merkleTreeHook": "0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB", "name": "bob", @@ -450,7 +450,7 @@ "interchainAccountIsm": "0x9e22945bE593946618383B108CC5bce09eBA4C26", "interchainAccountRouter": "0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1", "interchainGasPaymaster": "0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451", - "interchainSecurityModule": "0x8ca30D8d1406B820b411dD1799fAa2A5E15a9D93", + "interchainSecurityModule": "0x789b6C094a281F31D6A0819c0e08F87438A7BFA8", "mailbox": "0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4", "merkleTreeHook": "0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26", "name": "bsc", @@ -531,7 +531,7 @@ "interchainAccountIsm": "0xB732c83aeE29596E3163Da2260710eAB67Bc0B29", "interchainAccountRouter": "0x27a6cAe33378bB6A6663b382070427A01fc9cB37", "interchainGasPaymaster": "0x571f1435613381208477ac5d6974310d88AC7cB7", - "interchainSecurityModule": "0x0df8056AB4fd95D7c8f848BcF95d63b76F6bFA04", + "interchainSecurityModule": "0x41888Ae3E1B3441067AA5842f536C90ec8Aa2e80", "mailbox": "0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb", "merkleTreeHook": "0x04dB778f05854f26E67e0a66b740BBbE9070D366", "name": "celo", @@ -596,7 +596,7 @@ "interchainAccountIsm": "0x4Eb82Ee35b0a1c1d776E3a3B547f9A9bA6FCC9f2", "interchainAccountRouter": "0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0xB8508EecB14dd8d3762782eefC1ead0E92D89Ea5", + "interchainSecurityModule": "0xaD4c4F5Be297FAEaC83FB7Db6c76f8964c64d627", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "cheesechain", @@ -659,7 +659,7 @@ "from": 4842212 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x18250E686438602607205154288f160065d5F600", + "interchainSecurityModule": "0x567C3824E93bAc4a6c24a4deaCE7B285d342CCf5", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "cyber", @@ -726,7 +726,7 @@ "from": 23783929 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x7fc28AE86f109B1F2f2aeCb9aDFaFF10A5440E02", + "interchainSecurityModule": "0x778c735A6682649299abD5a6B8A1A2C7CD172417", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "degenchain", @@ -839,7 +839,7 @@ "interchainAccountIsm": "0xCeafc098e5c3c7768b9229Be2FEC275862A81Abd", "interchainAccountRouter": "0xed9a722c543883FB7e07E78F3879762DE09eA7D5", "interchainGasPaymaster": "0xB30EAB08aa87138D57168D0e236850A530f49921", - "interchainSecurityModule": "0x99d4146DC4910e3881b63C3471198F3Cb6aBAc52", + "interchainSecurityModule": "0x131a22Abe8BAAfaaf1c51217a6D3DB27626C927F", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xC831271c1fB212012811a91Dd43e5926C1020563", "name": "endurance", @@ -910,7 +910,7 @@ "interchainAccountIsm": "0x292C614ED53DaaDBf971521bc2C652d1ca51cB47", "interchainAccountRouter": "0x5E532F7B610618eE73C2B462978e94CB1F7995Ce", "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611", - "interchainSecurityModule": "0x8C3c9e95091A504b28902dF319F4cE8Bd77D2f59", + "interchainSecurityModule": "0xF59f09C08e4aE8b510C8e6B0f56024E583CAD0dF", "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239", "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA", "name": "ethereum", @@ -982,7 +982,7 @@ "interchainAccountIsm": "0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF", "interchainAccountRouter": "0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9", "interchainGasPaymaster": "0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E", - "interchainSecurityModule": "0xd0C1FC10c922434452DAc6DA518Fe91582CF2407", + "interchainSecurityModule": "0xd24b1995Fa04dB66937d4a2a8Fc8880Df4C6cB9b", "mailbox": "0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3", "merkleTreeHook": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147", "name": "fraxtal", @@ -1050,7 +1050,7 @@ "interchainAccountIsm": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", "interchainAccountRouter": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", "interchainGasPaymaster": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", - "interchainSecurityModule": "0xE62f55C6760CE12688Ae4C4FDBf2Cb7f08C468A6", + "interchainSecurityModule": "0x73D9664b1d6103b2463c2AA8e7eDE8B8AF9Dc582", "mailbox": "0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696", "merkleTreeHook": "0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f", "name": "fusemainnet", @@ -1124,7 +1124,7 @@ "interchainAccountIsm": "0x07E2062A1bC66a2C1d05cb5C3870a4AF86e0056E", "interchainAccountRouter": "0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064", "interchainGasPaymaster": "0xDd260B99d302f0A3fF885728c086f729c06f227f", - "interchainSecurityModule": "0x93BC454D1E8049a286EC84E75e628AB23e5E61f8", + "interchainSecurityModule": "0x7E81A58E2364eC787688f1226cf5998D0687eC1D", "mailbox": "0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "name": "gnosis", @@ -1195,7 +1195,7 @@ "interchainAccountIsm": "0x708E002637792FDC031E6B62f23DD60014AC976a", "interchainAccountRouter": "0xfB8cea1c7F45608Da30655b50bbF355D123A4358", "interchainGasPaymaster": "0x19dc38aeae620380430C200a6E990D5Af5480117", - "interchainSecurityModule": "0xe6a1cA2c655FD86E5bD0307b1577f11e031E4691", + "interchainSecurityModule": "0x85bDBb452CE1780d74Ca31AC37F1E38375b7Ce90", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65", "name": "inevm", @@ -1326,7 +1326,7 @@ "from": 14616307 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xc11B492a516F839F3f05D0CE8f79E51Bf65a66E9", + "interchainSecurityModule": "0xD6CdCb7bd3964f47616E339BbdB3EAc71B5E87DC", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "kroma", @@ -1399,7 +1399,7 @@ "interchainAccountIsm": "0xdcA646C56E7768DD11654956adE24bfFf9Ba4893", "interchainAccountRouter": "0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C", "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", - "interchainSecurityModule": "0x73171e4CAAe12ae90EFA6f5D33818021b2C8F80F", + "interchainSecurityModule": "0x7Ef099711F83Bf584579d9e8375ED3cA8be44FEB", "mailbox": "0x02d16BC51af6BfD153d67CA61754cF912E82C4d9", "merkleTreeHook": "0xC077A0Cc408173349b1c9870C667B40FE3C01dd7", "name": "linea", @@ -1470,7 +1470,7 @@ "from": 4195553 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x629c7Bf8586256624f5D925360F4382defa04eBf", + "interchainSecurityModule": "0x95E3044e32b296Fa19054A071dbe523834d24Bd4", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "lisk", @@ -1534,7 +1534,7 @@ "from": 3088760 }, "interchainGasPaymaster": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", - "interchainSecurityModule": "0x6f3e2043611307bE33016a9aaDf1943cCd10d7db", + "interchainSecurityModule": "0x3173260205bfa065728Dc08227FcfA5819D55Df7", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x062200d92dF6bB7bA89Ce4D6800110450f94784e", "name": "lukso", @@ -1608,7 +1608,7 @@ "interchainAccountIsm": "0x8Ea50255C282F89d1A14ad3F159437EE5EF0507f", "interchainAccountRouter": "0x693A4cE39d99e46B04cb562329e3F0141cA17331", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x809253E828b9F94781Ee58089bA696883D05dDca", + "interchainSecurityModule": "0xd1278Cd952a341D463924c5597FE61691d5559a5", "isTestnet": false, "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", @@ -1678,7 +1678,7 @@ "interchainAccountIsm": "0xe039DA3A0071BEd087A12660D7b03cf669c7776E", "interchainAccountRouter": "0x45285463352c53a481e882cD5E2AF2E25BBdAd0D", "interchainGasPaymaster": "0x8105a095368f1a184CceA86cCe21318B5Ee5BE28", - "interchainSecurityModule": "0xA9dfB22e46133f23bB635818aeB04Ae31645D2a8", + "interchainSecurityModule": "0xD11F603E537931b00f9B0B6297A9E1bE7173FEc6", "mailbox": "0x398633D19f4371e1DB5a8EFE90468eB70B1176AA", "merkleTreeHook": "0x5332D1AC0A626D265298c14ff681c0A8D28dB86d", "name": "mantle", @@ -1740,7 +1740,7 @@ "from": 13523607 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x8Dc8e217071F55C772Ffa21CCCCf3B70FCec40c7", + "interchainSecurityModule": "0x3cf2196283C7d7428bD5aF3111bF3588F2038173", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "merlin", @@ -1807,7 +1807,7 @@ "from": 17966274 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x67F16B702A2b8AC3d8fc1ffAEfBAB7Fe6fe762AD", + "interchainSecurityModule": "0x33faE85Cd15667f6ECeBaB7C75A394b4359f104a", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "metis", @@ -1872,7 +1872,7 @@ "from": 3752032 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xFE82E2d4278124122e9771D7A525846e506BbAD3", + "interchainSecurityModule": "0xAd5516892b5526C42cb616DD080aB193Ab0b0Ce7", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "mint", @@ -1939,7 +1939,7 @@ "interchainAccountIsm": "0xa377b8269e0A47cdd2fD5AAeAe860b45623c6d82", "interchainAccountRouter": "0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8", "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0xA54Cca261C76B09663Ae4bCe042d644e6F822e2E", + "interchainSecurityModule": "0x2Afc4338CB37a502874c73f17E2960Ba70439c1d", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "mode", @@ -2007,7 +2007,7 @@ "interchainAccountIsm": "0x79b3730CE3685f65802aF1771319992bA960EB9D", "interchainAccountRouter": "0xc4482f66191754a8629D35289043C4EB0285F10E", "interchainGasPaymaster": "0x14760E32C0746094cF14D97124865BC7F0F7368F", - "interchainSecurityModule": "0xe12cd1ddf6AA5f71FBee45CE9A819a0B3B2fb67F", + "interchainSecurityModule": "0x9cC2AE36315e381753E50083d0a3D73eB5F97cAA", "mailbox": "0x094d03E751f49908080EFf000Dd6FD177fd44CC3", "merkleTreeHook": "0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547", "name": "moonbeam", @@ -2149,7 +2149,7 @@ "interchainAccountIsm": "0x2c46BF14641d00549ECa4779BF5CBf91602C1DEd", "interchainAccountRouter": "0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD", "interchainGasPaymaster": "0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C", - "interchainSecurityModule": "0x10b4d96f8D4F095f0B708195B502FDeC165b739b", + "interchainSecurityModule": "0x1344a2c08C9Db084130841a2b68A7064403c4407", "mailbox": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", "merkleTreeHook": "0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f", "name": "optimism", @@ -2284,7 +2284,7 @@ "interchainAccountIsm": "0xBAC4529cdfE7CCe9E858BF706e41F8Ed096C1BAd", "interchainAccountRouter": "0xF163949AD9F88977ebF649D0461398Ca752E64B9", "interchainGasPaymaster": "0x0071740Bf129b05C4684abfbBeD248D80971cce2", - "interchainSecurityModule": "0x47E840c5537547E0Fff9aB9cCd05eDe70A6D9139", + "interchainSecurityModule": "0x4E1AaA32bb43C75B760729AA0fe99881dcf6a7D8", "mailbox": "0x5d934f4e2f797775e53561bB72aca21ba36B96BB", "merkleTreeHook": "0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6", "name": "polygon", @@ -2357,7 +2357,7 @@ "interchainAccountIsm": "0xc1198e241DAe48BF5AEDE5DCE49Fe4A6064cF7a7", "interchainAccountRouter": "0x20a0A32a110362920597F72974E1E0d7e25cA20a", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x008cF37Cf63dE3179A9a93F558537daB1A73a46C", + "interchainSecurityModule": "0xFC49D822b69Fe6680d3653B4bd4d985B9fdc451c", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "polygonzkevm", @@ -2425,7 +2425,7 @@ "from": 32018468 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x56c8e2Ca77EA631D049e9AdbCC81902c4A420AF8", + "interchainSecurityModule": "0x824277dDAEfF0fEa50e39843a64818A82B0A8091", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "proofofplay", @@ -2489,7 +2489,7 @@ "from": 363159 }, "interchainGasPaymaster": "0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696", - "interchainSecurityModule": "0x16a780d2f0d39B0e0e7B3d05a7E9d0BA772D2e2D", + "interchainSecurityModule": "0xA7326Ee1E3eb222bEfEbE1b2B35AA7Db25260E11", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x55E4F0bc6b7Bb493D50839A8592e7ad8d5e93cf7", "name": "real", @@ -2556,7 +2556,7 @@ "interchainAccountIsm": "0x5DA60220C5dDe35b7aE91c042ff5979047FA0785", "interchainAccountRouter": "0x7a4d31a686A36285d68e14EDD53631417eB19603", "interchainGasPaymaster": "0x2Fa570E83009eaEef3a1cbd496a9a30F05266634", - "interchainSecurityModule": "0xF11b43b26e1Df7A7fc9E2fB7982630Ca9E78Db17", + "interchainSecurityModule": "0x270015959B6A9448c7187DBB1b5527A234ee90c0", "mailbox": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", "merkleTreeHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA", "name": "redstone", @@ -2618,7 +2618,7 @@ "from": 937117 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0xa8dBD60A10bC4f2B807Abc040c620453b1Ad9fb0", + "interchainSecurityModule": "0xc314df199F9e88Eb6a1cF22bb70cfB7de0f27ab8", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "sanko", @@ -2686,7 +2686,7 @@ "interchainAccountIsm": "0x32af5Df81fEd5E26119F6640FBB13f3d63a94CDe", "interchainAccountRouter": "0x0B48a744698ba8dFa514742dFEB6728f52fD66f7", "interchainGasPaymaster": "0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2", - "interchainSecurityModule": "0x86e427d91d26eCD2542846D4C9b57186e9339a37", + "interchainSecurityModule": "0xac053C51B7B4C2E293d28F01018297cA936BBf08", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76", "name": "scroll", @@ -2767,7 +2767,7 @@ "interchainAccountIsm": "0xf35dc7B9eE4Ebf0cd3546Bd6EE3b403dE2b9F5D6", "interchainAccountRouter": "0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5", "interchainGasPaymaster": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72", - "interchainSecurityModule": "0xFDd69b3E4c13c6D65f856F99A12BFA0F0cc529D7", + "interchainSecurityModule": "0x8A4C9513186383C6408781E76B9d7C69a7b46b1a", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49", "name": "sei", @@ -2882,7 +2882,7 @@ "interchainAccountIsm": "0xAE557e108b3336130370aC74836f1356B4b30Cf2", "interchainAccountRouter": "0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B", "interchainGasPaymaster": "0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42", - "interchainSecurityModule": "0xd663Fb2EE0F8E351869e3E4CdbDeA3b0e440Eb98", + "interchainSecurityModule": "0x5B1Cd9A9d68adC495b3f5291c8817aCDb2030B68", "mailbox": "0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3", "merkleTreeHook": "0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd", "name": "taiko", @@ -2944,7 +2944,7 @@ "from": 1678063 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x56c8e2Ca77EA631D049e9AdbCC81902c4A420AF8", + "interchainSecurityModule": "0xc314df199F9e88Eb6a1cF22bb70cfB7de0f27ab8", "isTestnet": false, "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", @@ -3012,7 +3012,7 @@ "interchainAccountIsm": "0x551BbEc45FD665a8C95ca8731CbC32b7653Bc59B", "interchainAccountRouter": "0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8", "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "interchainSecurityModule": "0x83D407ebFa89d1D64833F314f6ad6bBc57728D66", + "interchainSecurityModule": "0x164639E2982A5D9612d1Ce64667a4880904D2B43", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", "name": "viction", @@ -3080,7 +3080,7 @@ "interchainAccountIsm": "0xCB9f90EE5d83Ea52ABd922BD70898f0155D54798", "interchainAccountRouter": "0x473884010F0C1742DA8Ad01E7E295624B931076b", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0x85bD389452743323afF638a3486A8cC451a33329", + "interchainSecurityModule": "0xa623E6d8A39129f8A5BcA295f5c4aE8AE69249F9", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "worldchain", @@ -3142,7 +3142,7 @@ "from": 24395308 }, "interchainGasPaymaster": "0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF", - "interchainSecurityModule": "0x1E6fdCA7fda50eD32c2c54b28a0E0557e6065fba", + "interchainSecurityModule": "0x8b63d0db57F1206B18D2d3cD7C31Ed1f36029917", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "name": "xai", @@ -3210,7 +3210,7 @@ "interchainAccountIsm": "0x29B37088724B745C0ABcE591449Cf042772160C2", "interchainAccountRouter": "0x03cF708E42C89623bd83B281A56935cB562b9258", "interchainGasPaymaster": "0x7E27456a839BFF31CA642c060a2b68414Cb6e503", - "interchainSecurityModule": "0x0F95bC504568913673CB7C1e6BeFc605a31bD945", + "interchainSecurityModule": "0x90F075E47525eB9B06a7F4E6014acA41A03baC34", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0x0054D19613f20dD72721A146ED408971a2CCA9BD", "name": "xlayer", @@ -3278,7 +3278,7 @@ "interchainAccountIsm": "0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29", "interchainAccountRouter": "0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5", "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d", - "interchainSecurityModule": "0x0c979c68c88459F6b4cCfEc73B6d6Ac262f7159e", + "interchainSecurityModule": "0x3b050Ba353fCc205d2d2f5340Ac752ec578b8E84", "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6", "name": "zetachain", @@ -3344,7 +3344,7 @@ "from": 1511458 }, "interchainGasPaymaster": "0x03cF708E42C89623bd83B281A56935cB562b9258", - "interchainSecurityModule": "0x3abC1e4D81c96C7cF6E80638dD8dBcc9FF1BD4C3", + "interchainSecurityModule": "0xebBAFb81e2cA423c97e644e0Cd65a6D3F0ea6730", "mailbox": "0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c", "merkleTreeHook": "0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28", "name": "zircuit", @@ -3417,7 +3417,7 @@ "interchainAccountIsm": "0xb2674E213019972f937CCFc5e23BF963D915809e", "interchainAccountRouter": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainGasPaymaster": "0x18B0688990720103dB63559a3563f7E8d0f63EDb", - "interchainSecurityModule": "0x0393C0ba78562BCC043c0C7c76Ed09230b04A35f", + "interchainSecurityModule": "0x6A4b341dd41Cd0fB09Df1F867bA4E40e4D776a8A", "mailbox": "0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a", "merkleTreeHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", "name": "zoramainnet", @@ -3488,7 +3488,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xa5a09C88941410515A5Fc6D42FFb4Db3B6722274", + "interchainSecurityModule": "0xA4f5333B6e912E0dc89C46cE5D39e018f44D8D8f", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3555,7 +3555,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xa221Fda4b2fd4b586BbE14aB39E79F186de16CA9", + "interchainSecurityModule": "0x801e251A6617b7eF882322Ba873401735853F6EF", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3625,7 +3625,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xdC6E982Ea3091006b1Ef0CB6Acfe018b058eEd19", + "interchainSecurityModule": "0xE91F8E99e35Cb250024f9E5920f6a844aB186714", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3701,7 +3701,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x27d3ADAA10646b8787A614D5d1ef257593BEe1Ea", + "interchainSecurityModule": "0x6752F23f44888c82Fd1d22875010B7799edbaFAD", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3765,7 +3765,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xe43d5f9b4da11ef7F775Ba2B40b112A7F706dF83", + "interchainSecurityModule": "0xDA0C302Acd89678e67912a6246fC0B3A1CaA0dC7", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3838,7 +3838,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xb9B8bD14661DE405F7597CC5b0D859C568700dF6", + "interchainSecurityModule": "0x18cC3841135Bc9829eb7c597Fc9B6CC952A2dC56", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3906,7 +3906,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0x0081c30768c4C91C73d7871E5ae25B0d27276Fc0", + "interchainSecurityModule": "0x0f6F356fe85bC7a92111449479d70F23cF4ef498", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -3969,7 +3969,7 @@ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", "fallbackRoutingHook": "0xc401e251CCa7A364114504A994D6fC7cb1c243AB", "interchainGasPaymaster": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", - "interchainSecurityModule": "0xa4D428c24332A7E42a49b47A8c56f489ce43426F", + "interchainSecurityModule": "0xB3A24e2F4EbA5fC5bB021E754E5e370BBeF050d0", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x441a01Fca2eD731C0Fc4633998332f9FEDB17575", "pausableHook": "0x5Ed813B8b41f25c8002B01A72bbDBe6A0232Fe27", @@ -4039,7 +4039,7 @@ "interchainAccountIsm": "0xcd9D3744512F07AE844c40E27912092d7c503565", "interchainAccountRouter": "0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8", "interchainGasPaymaster": "0xb58257cc81E47EC72fD38aE16297048de23163b4", - "interchainSecurityModule": "0x621711bf30D680256460884a626b6B2A3F8Fa2Bd", + "interchainSecurityModule": "0xe6fA4476Dbca22f06Db8355cB847aCc4A5BBa59f", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1", "pausableHook": "0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd", @@ -4099,7 +4099,7 @@ "interchainAccountIsm": "0xc23BaF5Eb5848D19701BbE7f139645e6bd58a319", "interchainAccountRouter": "0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE", "interchainGasPaymaster": "0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86", - "interchainSecurityModule": "0x70a1E8ee35227962f03a767c2b1073D2000c0c3D", + "interchainSecurityModule": "0x46ACEeDA62f2f4032bB1105D63d421106acD7050", "mailbox": "0xb129828B9EDa48192D0B2db35D0E40dCF51B3594", "merkleTreeHook": "0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59", "pausableHook": "0x6Fb36672365C7c797028C400A61c58c0ECc53cD2", @@ -4230,7 +4230,7 @@ "interchainAccountIsm": "0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1", "interchainAccountRouter": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "interchainGasPaymaster": "0x18B0688990720103dB63559a3563f7E8d0f63EDb", - "interchainSecurityModule": "0x2011044b3949C6406Cf47BC8c3122e7D70331266", + "interchainSecurityModule": "0xa6E1B51Eaa1724F88f3a79CCC3974073a26DF56A", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", "pausableHook": "0x2F619Ac5122689180AeBB930ADccdae215d538a9", @@ -4294,7 +4294,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xb35e7Cc9d45F3A5AD7dab46EB71F0b564B985322", + "interchainSecurityModule": "0xBd4bEc6A01578383276ad4db90944fecc6471A0D", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4355,7 +4355,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x9219ED9F72c64961c7745C61A1a3492b16435d06", + "interchainSecurityModule": "0x24E469308bCfF1C73053268f3656c19204bb9DC3", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4434,7 +4434,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xe24AdcdFA8B77A69F4134c6A7c8AB571911fDD43", + "interchainSecurityModule": "0xE027581D8F92073Cd4542fa40e399a81eFBFDf00", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4501,7 +4501,7 @@ "interchainAccountIsm": "0x783EC5e105234a570eB90f314284E5dBe53bdd90", "interchainAccountRouter": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", "interchainGasPaymaster": "0xf3dFf6747E7FC74B431C943961054B7BF6309d8a", - "interchainSecurityModule": "0xD6f9589f8d1Aa8e4f196174Be8046cF94D4364B9", + "interchainSecurityModule": "0x5F511135824f811404eB808D8d65ce896d31D6d7", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8", "pausableHook": "0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F", @@ -4572,7 +4572,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x9DdF78676e47935f24DbcC6C0FDF9FF6687Fc461", + "interchainSecurityModule": "0x9C0Fb5dc90C4b37ef77436bFDCa3E715E670DB93", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4637,7 +4637,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x540605591E8C763FA4C1DeE91A674E39b33c768a", + "interchainSecurityModule": "0xBd4bEc6A01578383276ad4db90944fecc6471A0D", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4701,7 +4701,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x132655e619098058D595E871206e7ec1f4a8cb00", + "interchainSecurityModule": "0x9338E1B4965f83feE69B9914ACDE08AeE0D1ef8e", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4768,7 +4768,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0x1277E184770eFF57bc54a8317cff379C53Ed307C", + "interchainSecurityModule": "0x5e99C872568Cf6E255b74B444d9287942Ab55645", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -4832,7 +4832,7 @@ "interchainAccountIsm": "0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed", "interchainAccountRouter": "0xeE8C0E1EeBfFCC451a013336386eA53E42a44451", "interchainGasPaymaster": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", - "interchainSecurityModule": "0xb35e7Cc9d45F3A5AD7dab46EB71F0b564B985322", + "interchainSecurityModule": "0x2Bf7c5c4d2480b1d53723B7DA1625aeA0365C1Ba", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x6963480b05EB58f4d624B014ab92e9aD4d21df6D", "pausableHook": "0xD0dca420feFda68537695A8D887080eeF4030AF7", @@ -5018,7 +5018,7 @@ "interchainAccountIsm": "0x4d264424905535E97396Db83bd553D0d73A4EF9d", "interchainAccountRouter": "0x26A29486480BD74f9B830a9B8dB33cb43C40f496", "interchainGasPaymaster": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", - "interchainSecurityModule": "0x89Ea8BAEC48ec2EB8F5444aD600a15dABd4426D7", + "interchainSecurityModule": "0x1d71FbdcA9a8Fb6faC724A524e416a896de30b57", "mailbox": "0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435", "merkleTreeHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", "pausableHook": "0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8", @@ -5082,7 +5082,7 @@ "interchainAccountIsm": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "interchainAccountRouter": "0x4ef363Da5bb09CC6aeA16973786963d0C8820778", "interchainGasPaymaster": "0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40", - "interchainSecurityModule": "0x89E35A66511eF1446DaB436FDF9c1eF93EFaa03D", + "interchainSecurityModule": "0x526A02995968671aB85B926827463571A8bB906F", "mailbox": "0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF", "merkleTreeHook": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", "pausableHook": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", @@ -5149,7 +5149,7 @@ "interchainAccountIsm": "0x60bB6D060393D3C206719A7bD61844cC82891cfB", "interchainAccountRouter": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", "interchainGasPaymaster": "0x61374178e45F65fF9D6252d017Cd580FC60B7654", - "interchainSecurityModule": "0xF88aFBD5C7D6f804bb525Bc8f3A12906Ded7C715", + "interchainSecurityModule": "0xB0B52AEFB0E119Fb3dF22d1332C3375275a2561d", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xEe08043cf22c80b27BF24d19999231dF4a3fC256", "pausableHook": "0x145566181A18E23bB6a8A3eC6D87765542A7F754", @@ -5214,7 +5214,7 @@ "interchainAccountIsm": "0xcdc31BA959DE8C035A03167ebAE1961208CDf172", "interchainAccountRouter": "0x349831a180eE4265008C5FFB9465Ff97c1CF0028", "interchainGasPaymaster": "0x6AA10748a036a49Cb290C0e12B77319b76792D5E", - "interchainSecurityModule": "0xEeEF1a33C123D8a3Ee96C670fC740D4e7A603329", + "interchainSecurityModule": "0x468Ad5b73be4863D017B8D962339F867D39C42Ca", "mailbox": "0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D", "merkleTreeHook": "0x2783D98CC073dbcDa90241C804d16982D3d75821", "pausableHook": "0x3bb2D0a828f7dD91bA786091F421f6d7cF376445", @@ -5284,7 +5284,7 @@ "interchainAccountIsm": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "interchainAccountRouter": "0x4ef363Da5bb09CC6aeA16973786963d0C8820778", "interchainGasPaymaster": "0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9", - "interchainSecurityModule": "0x06B1B5afCFfB8F49Dcea935A5E9E6A8FF96Da029", + "interchainSecurityModule": "0x1BEf95d17627863bB3346fD5069F93B35779912C", "mailbox": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", "merkleTreeHook": "0xdAa1B65547fB969c9ff5678956AB2FF9771B883D", "pausableHook": "0xA0e0829DA397CcF55d5B779C31728f21Cb8219DF", @@ -5396,7 +5396,7 @@ "interchainAccountIsm": "0x8c794a781327b819416E7b67908f1D22397f1E67", "interchainAccountRouter": "0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6", "interchainGasPaymaster": "0x2b79328DA089E89A9E9c08732b56dd31F01011Db", - "interchainSecurityModule": "0x7E81F96355529Cf7Cb768B3CCf49552E727eC7EE", + "interchainSecurityModule": "0x68A7B7dA49C9514d6A1352F68Cb1439B320fC432", "mailbox": "0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9", "merkleTreeHook": "0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227", "pausableHook": "0x2684C6F89E901987E1FdB7649dC5Be0c57C61645", @@ -5460,7 +5460,7 @@ "interchainAccountIsm": "0xE67Dc24970B482579923551Ede52BD35a2858989", "interchainAccountRouter": "0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409", "interchainGasPaymaster": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", - "interchainSecurityModule": "0xdA07f00d13E908b7c52C02b38AB748d924DdE890", + "interchainSecurityModule": "0x3387f3fb04C5A579391B5383e203b04E65b70dbE", "mailbox": "0x2f0E57527Bb37E5E064EF243fad56CCE6241906c", "merkleTreeHook": "0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8", "pausableHook": "0xdAa1B65547fB969c9ff5678956AB2FF9771B883D", @@ -5524,7 +5524,7 @@ "interchainAccountIsm": "0x20a0A32a110362920597F72974E1E0d7e25cA20a", "interchainAccountRouter": "0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54", "interchainGasPaymaster": "0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6", - "interchainSecurityModule": "0x90B3696922e6a8128EEB23F08Cbf5b2545f849C6", + "interchainSecurityModule": "0x888C1DCDf1BD8c86a9389facA07b9e7bdC9658CE", "mailbox": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "merkleTreeHook": "0xf147bBD944C610F86DaE6C7668497D22932C1E4A", "pausableHook": "0x872Bd98057931c8809927c6dE2ef39738a80Eb0C", @@ -5591,7 +5591,7 @@ "interchainAccountIsm": "0xf40eE9FF75Fa34910b7C4C8d68d4850B3bD184D3", "interchainAccountRouter": "0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea", "interchainGasPaymaster": "0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409", - "interchainSecurityModule": "0x727DaD31073Dcc961B76Cbd625D6d074fA7988c9", + "interchainSecurityModule": "0x17DCe525bEa991c5DE56178aFc44dB7319842f98", "mailbox": "0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615", "merkleTreeHook": "0x8c794a781327b819416E7b67908f1D22397f1E67", "pausableHook": "0x4d264424905535E97396Db83bd553D0d73A4EF9d", @@ -5658,7 +5658,7 @@ "interchainAccountIsm": "0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D", "interchainAccountRouter": "0x7279B1e11142078b8dC9e69620200f4C84FB8aaa", "interchainGasPaymaster": "0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7", - "interchainSecurityModule": "0x8A4C3c1f234e9da8e325902f7105471B078a1e23", + "interchainSecurityModule": "0x093472cc2aCA5574f8B370907DEdA68d76272eeA", "mailbox": "0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8", "merkleTreeHook": "0x086c3947F71BE98A0bDf4AB7239955e7542b0CbA", "pausableHook": "0x9C6e8d989ea7F212e679191BEb44139d83ac927a", @@ -5728,7 +5728,7 @@ "interchainAccountIsm": "0x8a733038eF4BbC314eE0F7595257D8d3799B6aA9", "interchainAccountRouter": "0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9", "interchainGasPaymaster": "0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C", - "interchainSecurityModule": "0xff5306993F410008d1d7581695252e95c55bc458", + "interchainSecurityModule": "0xD52E36491483411A50ED27B0E1dEFdFCeBBcABBD", "mailbox": "0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6", "merkleTreeHook": "0x2f536FB7a37bd817Af644072a904Ddc02Dae429f", "pausableHook": "0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9", @@ -5789,7 +5789,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x16c7A4C2f4BCDBFC8205Baa9F1dCBcd44B4d8d90", + "interchainSecurityModule": "0xf5006372D20bfDC97216dD6B122e533E8A675833", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5859,7 +5859,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x78E12CF0Ee442f7B9E6df137e0c038A4b6e8d8Eb", + "interchainSecurityModule": "0x55B0c16da418E707AB9344A852969f6cebbb7Ff9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5920,7 +5920,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0xF2c7E4Ad99b08d1a2CF139cb7b79d645b50BEdEa", + "interchainSecurityModule": "0x6D4A16dF0d74402aD9297efc581797c4ce80bF3e", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5984,7 +5984,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x0D9b693d45690a9FfE8F1e8E0dC41A2C6207E090", + "interchainSecurityModule": "0x55B0c16da418E707AB9344A852969f6cebbb7Ff9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -6048,7 +6048,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x78E12CF0Ee442f7B9E6df137e0c038A4b6e8d8Eb", + "interchainSecurityModule": "0x55B0c16da418E707AB9344A852969f6cebbb7Ff9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -6121,7 +6121,7 @@ "interchainAccountIsm": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainAccountRouter": "0x4D50044335dc1d4D26c343AdeDf6E47808475Deb", "interchainGasPaymaster": "0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B", - "interchainSecurityModule": "0xE490AbA47A8b6B26dFF22A61aAFd51C52fD386c2", + "interchainSecurityModule": "0xb87F7db787f9A3a838FB0869788d417d68eEcc8E", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", "pausableHook": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", @@ -6185,7 +6185,7 @@ "interchainAccountIsm": "0x31Bb27f6007C33acD1be83ACEd3164C60f8F7b13", "interchainAccountRouter": "0xEeb5a99a75585fe137c83E7b62b74f87264A5481", "interchainGasPaymaster": "0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03", - "interchainSecurityModule": "0x56b99cFe785C7e9F61040cdd4081d63Ef48Cf928", + "interchainSecurityModule": "0xCC9268adFB3a41af82B77214f9B31e36CfE40733", "mailbox": "0x0dF25A2d59F03F039b56E90EdC5B89679Ace28Bc", "merkleTreeHook": "0xC88636fFdFAc7cb87b7A76310B7a62AF0A000595", "pausableHook": "0x2AF32cF8e3Cf42d221eDa0c843818fA5ee129E27", @@ -6249,7 +6249,7 @@ "interchainAccountIsm": "0x28291a7062afA569104bEd52F7AcCA3dD2FafD11", "interchainAccountRouter": "0xe9E3444DDD80c50276c0Fcf316026f6d7fEc2c47", "interchainGasPaymaster": "0x25EAC2007b0D40E3f0AF112FD346412321038719", - "interchainSecurityModule": "0xCb1514f34Dfd366cF74D0F58F3D8BDE49C059533", + "interchainSecurityModule": "0xdc920aA197992467E351FDf0AFbbEf49d2114985", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x5C02157068a52cEcfc98EDb6115DE6134EcB4764", "pausableHook": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", @@ -6317,7 +6317,7 @@ "interchainAccountIsm": "0x027eFD1695941969435AA640542B690044dF7E06", "interchainAccountRouter": "0x65F1343AC23D4fF48bf6c7E0c55872d245397567", "interchainGasPaymaster": "0x28291a7062afA569104bEd52F7AcCA3dD2FafD11", - "interchainSecurityModule": "0xF0f29D8b9d16aE092886A38571D5E7Ffdb508EB3", + "interchainSecurityModule": "0xa3eEC2fF42F84eFaa1d98daC5E60CB2F2c896570", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xcd90D49b046772F710250b9119117169CB2e4D8b", "pausableHook": "0x7CE76f5f0C469bBB4cd7Ea6EbabB54437A093127", @@ -6500,7 +6500,7 @@ "interchainAccountIsm": "0xf9609bB22847e0DB5F6fB8f95b84D25A19b46ac5", "interchainAccountRouter": "0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29", "interchainGasPaymaster": "0xFb7D175d6F53800D68D32C3Fe1416807A394cC24", - "interchainSecurityModule": "0x882eE9A3938501558823514b70d8bBa945953B80", + "interchainSecurityModule": "0x91E25120E1415D4f53E018eb0E48EAC964E19856", "mailbox": "0x473884010F0C1742DA8Ad01E7E295624B931076b", "merkleTreeHook": "0xdA629E1B79e3420ECd1e80571aDd6a4a3b13AE79", "pausableHook": "0xe93f2f409ad8B5000431D234472973fe848dcBEC", @@ -6567,7 +6567,7 @@ "interchainAccountIsm": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", "interchainAccountRouter": "0x021D2810a758c833080DEc2F1Fa8F571Aae97D45", "interchainGasPaymaster": "0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E", - "interchainSecurityModule": "0x597210e915409D2B9D4487Ef21ea115444e419Ed", + "interchainSecurityModule": "0x16eeA2e215f9449D45f5ba98E639a848EdF7638E", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", "pausableHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", @@ -6637,7 +6637,7 @@ "interchainAccountIsm": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainAccountRouter": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x7664aAE6C1bCFfe364F742c75f52D3dC70FF412E", + "interchainSecurityModule": "0x469220D6CB0465A3Cf948fcF8Cd22A3523CB678A", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6704,7 +6704,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x44f0875a9a412849B2167c7a4A3ECE4e13ba1ac4", + "interchainSecurityModule": "0xbf4250D5C21A8aEd8d75B246Af830e2e8DD094D8", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6774,7 +6774,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x44f0875a9a412849B2167c7a4A3ECE4e13ba1ac4", + "interchainSecurityModule": "0xbf4250D5C21A8aEd8d75B246Af830e2e8DD094D8", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6844,7 +6844,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x03Def25faaABF7aa393eC4108267f0b2c0B1F58f", + "interchainSecurityModule": "0x9943A92d1691855d369eaA52F213128Cc2818523", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6908,7 +6908,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x03Def25faaABF7aa393eC4108267f0b2c0B1F58f", + "interchainSecurityModule": "0xE4E34ceeB9D9BCB0d63B17c1aBc2541064AE5D06", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -6973,7 +6973,7 @@ "interchainAccountIsm": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", "interchainAccountRouter": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", "interchainGasPaymaster": "0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E", - "interchainSecurityModule": "0x017a26fE04aB95c77BA6DeE4d441A3F2402BBe17", + "interchainSecurityModule": "0xD615ea7cE5147D27EC2e1592021080113Eda7DD9", "mailbox": "0x7f50C5776722630a0024fAE05fDe8b47571D7B39", "merkleTreeHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", "pausableHook": "0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03", @@ -7041,7 +7041,7 @@ "interchainAccountIsm": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", "interchainAccountRouter": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", "interchainGasPaymaster": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", - "interchainSecurityModule": "0x0fB08d319a9Daaf6e8005873D2BA1980Bd59c614", + "interchainSecurityModule": "0x08809E9649489E51b5EF69C1C306aC44A774dE21", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", "pausableHook": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", @@ -7063,10 +7063,10 @@ "soneium": { "blockExplorers": [ { - "apiUrl": "https://explorer.soneium.org/api", + "apiUrl": "https://soneium.blockscout.com/api", "family": "blockscout", "name": "Soneium Explorer", - "url": "https://explorer.soneium.org" + "url": "https://soneium.blockscout.com" } ], "blocks": { @@ -7102,7 +7102,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x7664aAE6C1bCFfe364F742c75f52D3dC70FF412E", + "interchainSecurityModule": "0xf15C76Ac5C5BA5265Af2d07B05d4bc43CDf4B395", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -7166,7 +7166,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0x93D41E41cA545a35A81d11b08D2eE8b852C768df", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x794BF08dE42238809d811193A6189D6d03177DF8", + "interchainSecurityModule": "0xab5C0bEB5A72D0BcE7aA2AcCAeF18aDF2f1Ed6D9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -7233,7 +7233,7 @@ "interchainAccountIsm": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "interchainAccountRouter": "0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed", "interchainGasPaymaster": "0xDf178647caB5e0222F4B53C57274FD2A03BEaed6", - "interchainSecurityModule": "0x557862e7ADd75E72779316b119F75358b3445102", + "interchainSecurityModule": "0xab5C0bEB5A72D0BcE7aA2AcCAeF18aDF2f1Ed6D9", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6", "pausableHook": "0xA8A311B69f688c1D9928259D872C31ca0d473642", @@ -7346,7 +7346,7 @@ "interchainAccountIsm": "0xd64d126941EaC2Cf53e0E4E8146cC70449b60D73", "interchainAccountRouter": "0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5", "interchainGasPaymaster": "0x3cECBa60A580dE20CC57D87528953a00f4ED99EA", - "interchainSecurityModule": "0x8f1953EFbd2C720223faD02d6CB5CD25f97D7fC9", + "interchainSecurityModule": "0xBD787bdC84605F4a3485993f2F046b5fb78d57a2", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2", "pausableHook": "0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7", @@ -7413,7 +7413,7 @@ "interchainAccountIsm": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", "interchainAccountRouter": "0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB", "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", - "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "interchainSecurityModule": "0x25B466036E3C25aD6ECbe753D2F00b71921f35aA", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", @@ -7477,7 +7477,7 @@ "interchainAccountIsm": "0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532", "interchainAccountRouter": "0xb201817dFdd822B75Fa9b595457E6Ee466a7C187", "interchainGasPaymaster": "0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b", - "interchainSecurityModule": "0xDbCf838Fbf126D0d99B7D384dA416663A97Da867", + "interchainSecurityModule": "0xfeFef7af07A8A7F017DA8c8b44796a27beFe17b0", "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7", "merkleTreeHook": "0x11b76D93a9D39Eb51F54eBf5566308640cDe882b", "pausableHook": "0x60515f328B2c55Df63f456D9D839a0082892dEf8", @@ -7541,7 +7541,7 @@ "interchainAccountIsm": "0x7937CB2886f01F38210506491A69B0D107Ea0ad9", "interchainAccountRouter": "0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD", "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", - "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "interchainSecurityModule": "0xB268C727417e5d21c21BBEF9220A6A03B8c163Ff", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", @@ -7606,7 +7606,7 @@ "interchainAccountIsm": "0x9629c28990F11c31735765A6FD59E1E1bC197DbD", "interchainAccountRouter": "0x2351FBe24C1212F253b7a300ff0cBCFd97952a19", "interchainGasPaymaster": "0xc2466492C451E1AE49d8C874bB9f89293Aaad59b", - "interchainSecurityModule": "0x9eAc9956855640c6a58AF8f91537A3E9ccd757a9", + "interchainSecurityModule": "0x25B466036E3C25aD6ECbe753D2F00b71921f35aA", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x7B032cBB00AD7438E802A66D8b64761A06E5df22", "pausableHook": "0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94", diff --git a/rust/main/config/testnet_config.json b/rust/main/config/testnet_config.json index 6f8dca0b8d..9319a94ab7 100644 --- a/rust/main/config/testnet_config.json +++ b/rust/main/config/testnet_config.json @@ -31,7 +31,7 @@ "interchainAccountIsm": "0x6895d3916B94b386fAA6ec9276756e16dAe7480E", "interchainAccountRouter": "0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b", "interchainGasPaymaster": "0x44769b0f4a6f01339e131a691cc2eebbb519d297", - "interchainSecurityModule": "0xDf1d3c37FfA6134767911B8876305afc187dA207", + "interchainSecurityModule": "0xEF36f576B107c4D5ebCa6F7F725263eabe5307a7", "isTestnet": true, "mailbox": "0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59", "merkleTreeHook": "0x221FA9CBaFcd6c1C3d206571Cf4427703e023FFa", @@ -94,7 +94,7 @@ "from": 49690504 }, "interchainGasPaymaster": "0xc756cFc1b7d0d4646589EDf10eD54b201237F5e8", - "interchainSecurityModule": "0x69a84432Ba4FaD95FC5850aCD613C6daD286908C", + "interchainSecurityModule": "0x84919eC830aaadAc11856F8843F8079d652be0aA", "isTestnet": true, "mailbox": "0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8", "merkleTreeHook": "0xAD34A66Bf6dB18E858F6B686557075568c6E031C", @@ -162,7 +162,7 @@ "from": 13851043 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0x2945eCB46AE83B1A37b589A9c1219061522A73aD", + "interchainSecurityModule": "0xeDE933F179C81Da173f5d4bc4aff849112e4DC16", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -232,7 +232,7 @@ "interchainAccountIsm": "0xa9D8Ec959F34272B1a56D09AF00eeee58970d3AE", "interchainAccountRouter": "0x6d2B3e304E58c2a19f1492E7cf15CaF63Ce6e0d2", "interchainGasPaymaster": "0x0dD20e410bdB95404f71c5a4e7Fa67B892A5f949", - "interchainSecurityModule": "0x0c29F3Ce8995b41eB8c2b3E1eC33c3fa10C8cf91", + "interchainSecurityModule": "0xF3979a3e04158271765A2DB70be81Df4C315b19c", "isTestnet": true, "mailbox": "0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D", "merkleTreeHook": "0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f", @@ -301,7 +301,7 @@ "from": 4950 }, "interchainGasPaymaster": "0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450", - "interchainSecurityModule": "0xa25786D36B5a5eDeCAf75142dD056B1Ed1473f44", + "interchainSecurityModule": "0x1576dB24aC8a8B5D50BDE896f64b76877bE2B9da", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x4926a10788306D84202A2aDbd290b7743146Cc17", @@ -402,7 +402,7 @@ "from": 1606754 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0x1AFC8F84cAE294C3E6d3Ddb031946B93f08272b5", + "interchainSecurityModule": "0xF9C638EB093ad2E66E5f4d444fE1D42477470075", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -468,7 +468,7 @@ "interchainAccountIsm": "0xfaB4815BDC5c60c6bD625459C8577aFdD79D9311", "interchainAccountRouter": "0xeEF6933122894fF217a7dd07510b3D64b747e29b", "interchainGasPaymaster": "0x6895d3916B94b386fAA6ec9276756e16dAe7480E", - "interchainSecurityModule": "0x7b5AD17cdAbdED0C29B161c647DA32dCE51AB13B", + "interchainSecurityModule": "0xAEB1108dd551736001880BdD7b920F9Da051b00B", "isTestnet": true, "mailbox": "0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0", "merkleTreeHook": "0x9ff6ac3dAf63103620BBf76136eA1AFf43c2F612", @@ -534,7 +534,7 @@ "from": 1543015 }, "interchainGasPaymaster": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9", - "interchainSecurityModule": "0x16738b80D39Fa0652F2D853c3E6235Afb7cA6dDc", + "interchainSecurityModule": "0x3411DE0359d0Fb09E3154Aa231521cb7F2856e6f", "isTestnet": true, "mailbox": "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc", "merkleTreeHook": "0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE", @@ -599,7 +599,7 @@ "from": 15833917 }, "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", - "interchainSecurityModule": "0x81B81B3b296ecf99d5bAC0DE4e5fF7a3ceECf08b", + "interchainSecurityModule": "0x401b3EeD483f43594902a38Ee74fa80F966f31fe", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", @@ -727,7 +727,7 @@ "from": 10634605 }, "interchainGasPaymaster": "0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C", - "interchainSecurityModule": "0x428a2384F6013A9c561737E9A58288e071470192", + "interchainSecurityModule": "0x4944142B6ba61B31A2F5a0Af79D72DBAE9cf6BC0", "isTestnet": true, "mailbox": "0x54148470292C24345fb828B003461a9444414517", "merkleTreeHook": "0xddf4C3e791caCaFd26D7fb275549739B38ae6e75", @@ -802,7 +802,7 @@ "interchainAccountIsm": "0xE023239c8dfc172FF008D8087E7442d3eBEd9350", "interchainAccountRouter": "0xe17c37212d785760E8331D4A4395B17b34Ba8cDF", "interchainGasPaymaster": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", - "interchainSecurityModule": "0xb9A0fa05Fcce52605f0142c1A5Aca32f223eB961", + "interchainSecurityModule": "0x78b00837EE0c0265eB4f475d0D21236716AC0FdA", "isTestnet": true, "mailbox": "0x3C5154a193D6e2955650f9305c8d80c18C814A68", "merkleTreeHook": "0x863E8c26621c52ACa1849C53500606e73BA272F0", @@ -880,7 +880,7 @@ "interchainAccountIsm": "0x83a3068B719F764d413625dA77468ED74789ae02", "interchainAccountRouter": "0x8e131c8aE5BF1Ed38D05a00892b6001a7d37739d", "interchainGasPaymaster": "0x6f2756380FD49228ae25Aa7F2817993cB74Ecc56", - "interchainSecurityModule": "0x5bC248C8010848067919fA73F4555AeE95Df38a4", + "interchainSecurityModule": "0x549a1C8DBE21aA89d729637521459bc2890467b0", "isTestnet": true, "mailbox": "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766", "merkleTreeHook": "0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d", @@ -940,7 +940,7 @@ "url": "https://www.hyperlane.xyz" }, "displayName": "Solana Testnet", - "displayNameShort": "Sol Testnet", + "displayNameShort": "Solana Testnet", "domainId": 1399811150, "index": { "from": 1, @@ -963,7 +963,8 @@ } ], "validatorAnnounce": "8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3", - "gasCurrencyCoinGeckoId": "solana" + "gasCurrencyCoinGeckoId": "solana", + "interchainSecurityModule": "4GHxwWyKB9exhKG4fdyU2hfLgfFzhHp2WcsSKc2uNR1k" }, "superpositiontestnet": { "aggregationHook": "0x331eb40963dc11F5BB271308c42d97ac6e41F124", @@ -990,7 +991,7 @@ "from": 3111622 }, "interchainGasPaymaster": "0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450", - "interchainSecurityModule": "0x8a833B1230A75712a767e81556F1Ad612A0F76F3", + "interchainSecurityModule": "0x7d5C116FF61393A1a1C75C45684DF93Ba00a194E", "isTestnet": true, "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", "merkleTreeHook": "0x4926a10788306D84202A2aDbd290b7743146Cc17", @@ -1078,7 +1079,7 @@ "interchainAccountIsm": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", "interchainAccountRouter": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", "interchainGasPaymaster": "0x04438ef7622f5412f82915F59caD4f704C61eA48", - "interchainSecurityModule": "0x5e39968B0435332dE915C2FF62fD373fBbbb7C75", + "interchainSecurityModule": "0x3B431aEc0E9dBd0B903E1C784C01219503e6A0bd", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C", "pausableHook": "0x783c4a0bB6663359281aD4a637D5af68F83ae213", @@ -1138,7 +1139,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0x97b1e5FBF33d82fAD9C3Aa0fF901e9B9d63090E3", + "interchainSecurityModule": "0xEBbf2a8E1008ceeD1F480B02d11d72d4426CFbAf", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1206,7 +1207,7 @@ "interchainAccountIsm": "0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72", "interchainAccountRouter": "0xB5fB1F5410a2c2b7deD462d018541383968cB01c", "interchainGasPaymaster": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", - "interchainSecurityModule": "0xAfDF88EB9447e412c89304F34813c5564307709b", + "interchainSecurityModule": "0xEd2112547065be8c15CfE3222b642Ae35EFA189b", "mailbox": "0xB08d78F439e55D02C398519eef61606A5926245F", "merkleTreeHook": "0x783c4a0bB6663359281aD4a637D5af68F83ae213", "pausableHook": "0x66b71A4e18FbE09a6977A6520B47fEDdffA82a1c", @@ -1267,7 +1268,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0xe5B27D2198EEacf4FeC7d558CdE3b4fDCe4d37f9", + "interchainSecurityModule": "0x4cA607E538A534df884B3B98A7B0Da9D2170E0ae", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1459,7 +1460,7 @@ "interchainAccountIsm": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainAccountRouter": "0x867f2089D09903f208AeCac84E599B90E5a4A821", "interchainGasPaymaster": "0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8", - "interchainSecurityModule": "0x0511f73F8D734e0fc9df1E6C0937592a3A371B18", + "interchainSecurityModule": "0xa8C25c32777DbbD1272771fEB8Df759e3B4B4F31", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A", "pausableHook": "0x51A0a100e7BC63Ea7821A3a023B6F17fb94FF011", @@ -1710,7 +1711,7 @@ "interchainAccountIsm": "0x39c85C84876479694A2470c0E8075e9d68049aFc", "interchainAccountRouter": "0x80fE4Cb8c70fc60B745d4ffD4403c27a8cBC9e02", "interchainGasPaymaster": "0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb", - "interchainSecurityModule": "0x3865c419335B36d9CE240b515124Ab1c33927004", + "interchainSecurityModule": "0x63E1D5320051d44C86aC760881aa337482f35FB5", "mailbox": "0x33dB966328Ea213b0f76eF96CA368AB37779F065", "merkleTreeHook": "0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD", "pausableHook": "0x4fE19d49F45854Da50b6009258929613EC92C147", @@ -1773,7 +1774,7 @@ "interchainAccountIsm": "0xc08675806BA844467E559E45E4bB59e66778bDcd", "interchainAccountRouter": "0x39c85C84876479694A2470c0E8075e9d68049aFc", "interchainGasPaymaster": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", - "interchainSecurityModule": "0x4B310268158B842cbE65A216714C6A7D1d087155", + "interchainSecurityModule": "0xD552E8B478A4B7A2d1D4c6e76A0FB2A8730d5E79", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE", "pausableHook": "0xe0B988062A0C6492177d64823Ab95a9c256c2a5F", @@ -1836,7 +1837,7 @@ "interchainAccountIsm": "0x3ca332A585FDB9d4FF51f2FA8999eA32184D3606", "interchainAccountRouter": "0x4eC139a771eBdD3b0a0b67bb7E08960210882d44", "interchainGasPaymaster": "0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA", - "interchainSecurityModule": "0xAd6172DA241CE5DC38a32E0E375FD0A1889b9E48", + "interchainSecurityModule": "0x7b7187f72D2f078c4e25B0401FC266242Ca8A5E8", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE", "pausableHook": "0xe0B988062A0C6492177d64823Ab95a9c256c2a5F", @@ -1899,7 +1900,7 @@ "interchainAccountIsm": "0xBF2C366530C1269d531707154948494D3fF4AcA7", "interchainAccountRouter": "0xBdf49bE2201A1c4B13023F0a407196C6Adb32680", "interchainGasPaymaster": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", - "interchainSecurityModule": "0xa6570241124A6534801d1eba13F46078Dc7d1974", + "interchainSecurityModule": "0xd85b1fb952a30517BFE3F53cb6049385f1ACe35b", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72", "pausableHook": "0xc76E477437065093D353b7d56c81ff54D167B0Ab", @@ -1970,7 +1971,7 @@ "interchainAccountIsm": "0x342B5630Ba1C1e4d3048E51Dad208201aF52692c", "interchainAccountRouter": "0xe036768e48Cb0D42811d2bF0748806FCcBfCd670", "interchainGasPaymaster": "0x867f2089D09903f208AeCac84E599B90E5a4A821", - "interchainSecurityModule": "0xbe84F098eE49c32395edA629737AD3f4c0542ADA", + "interchainSecurityModule": "0x4F0B0317FF574aAc61D1D2Db4A78501D0342602a", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0xB5fB1F5410a2c2b7deD462d018541383968cB01c", "pausableHook": "0x7483faD0Bc297667664A43A064bA7c9911659f57", @@ -2029,7 +2030,7 @@ "domainRoutingIsmFactory": "0x44b764045BfDC68517e10e783E69B376cef196B2", "fallbackRoutingHook": "0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f", "interchainGasPaymaster": "0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38", - "interchainSecurityModule": "0x3490059390DDc4de38822488A1D63B4e131D0Aaf", + "interchainSecurityModule": "0x500a6350D7B121eD28a7EFE91Ac0885f494A28b2", "mailbox": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD", "merkleTreeHook": "0x4fE19d49F45854Da50b6009258929613EC92C147", "pausableHook": "0x01812D60958798695391dacF092BAc4a715B1718", @@ -2164,6 +2165,47 @@ "index": { "from": 86008 } + }, + "sonicsvmtestnet": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.sonic.game/?cluster=testnet.v1", + "family": "other", + "name": "Sonic Explorer", + "url": "https://explorer.sonic.game/?cluster=testnet.v1" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.4, + "reorgPeriod": 0 + }, + "chainId": 15153042, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic SVM Testnet", + "displayNameShort": "Sonic SVM Testnet", + "domainId": 15153042, + "isTestnet": true, + "name": "sonicsvmtestnet", + "nativeToken": { + "decimals": 9, + "name": "Solana", + "symbol": "SOL" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://api.testnet.sonic.game" + } + ], + "mailbox": "6BaTtWPMpWdA6tHqdT2VbogC4XZ9QV5cNCYpBrx6WP7B", + "merkleTreeHook": "6BaTtWPMpWdA6tHqdT2VbogC4XZ9QV5cNCYpBrx6WP7B", + "validatorAnnounce": "84NjUotjZcNBVGBhvwERPNS6zaAfhkJkG33aSiNxPma2", + "interchainGasPaymaster": "FSy4hQ92ZTPJVG2UmiWiymoogpwEDBcucKnLzLnbrBDt", + "interchainSecurityModule": "DgLicFznJQbnapc9cLSTB2DxN1FnrFnZo5SwD55iTycA" } }, "defaultRpcConsensusType": "fallback" diff --git a/rust/sealevel/environments/testnet4/chain-config.json b/rust/sealevel/environments/testnet4/chain-config.json index 83478557f0..8a43c054e4 100644 --- a/rust/sealevel/environments/testnet4/chain-config.json +++ b/rust/sealevel/environments/testnet4/chain-config.json @@ -1,111 +1,754 @@ { + "abstracttestnet": { + "blockExplorers": [ + { + "apiUrl": "https://api-explorer-verify.testnet.abs.xyz/contract_verification", + "family": "etherscan", + "name": "Abstract Block Explorer", + "url": "https://explorer.testnet.abs.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 0 + }, + "chainId": 11124, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Abstract Testnet", + "domainId": 11124, + "isTestnet": true, + "name": "abstracttestnet", + "nativeToken": { + "decimals": 18, + "name": "Ethereum", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://api.testnet.abs.xyz" + } + ], + "technicalStack": "zksync" + }, + "alephzeroevmtestnet": { + "blockExplorers": [ + { + "apiUrl": "https://evm-explorer-testnet.alephzero.org/api", + "family": "blockscout", + "name": "Aleph Zero EVM Testnet Explorer", + "url": "https://evm-explorer-testnet.alephzero.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 5 + }, + "chainId": 2039, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Aleph Zero EVM Testnet", + "domainId": 2039, + "index": { + "from": 1380870 + }, + "isTestnet": true, + "name": "alephzeroevmtestnet", + "nativeToken": { + "decimals": 18, + "name": "Testnet AZERO", + "symbol": "TZERO" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.alephzero-testnet.gelato.digital" + } + ], + "technicalStack": "arbitrumnitro" + }, "alfajores": { "blockExplorers": [ { - "apiUrl": "https://api-alfajores.celoscan.io/api", - "family": "etherscan", - "name": "CeloScan", - "url": "https://alfajores.celoscan.io" - }, + "apiUrl": "https://explorer.celo.org/alfajores/api", + "family": "blockscout", + "name": "Blockscout", + "url": "https://explorer.celo.org/alfajores" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 5, + "reorgPeriod": 0 + }, + "chainId": 44787, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Alfajores", + "domainId": 44787, + "gasCurrencyCoinGeckoId": "celo", + "isTestnet": true, + "name": "alfajores", + "nativeToken": { + "decimals": 18, + "name": "CELO", + "symbol": "CELO" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://alfajores-forno.celo-testnet.org" + } + ] + }, + "arbitrumsepolia": { + "blockExplorers": [ + { + "apiUrl": "https://api-sepolia.arbiscan.io/api", + "family": "etherscan", + "name": "Arbiscan", + "url": "https://sepolia.arbiscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 0 + }, + "chainId": 421614, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Arbitrum Sepolia", + "domainId": 421614, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 49690504 + }, + "isTestnet": true, + "name": "arbitrumsepolia", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://arbitrum-sepolia.blockpi.network/v1/rpc/public" + }, + { + "http": "https://sepolia-rollup.arbitrum.io/rpc" + } + ], + "technicalStack": "arbitrumnitro" + }, + "arcadiatestnet2": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.khalani.network/api", + "family": "blockscout", + "name": "Arcadia Testnet Explorer", + "url": "https://explorer.khalani.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 1098411886, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Arcadia Testnet v2", + "domainId": 1098411886, + "isTestnet": true, + "name": "arcadiatestnet2", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.khalani.network" + } + ] + }, + "basesepolia": { + "blockExplorers": [ + { + "apiUrl": "https://api-sepolia.basescan.org/api", + "family": "etherscan", + "name": "BaseScan", + "url": "https://sepolia.basescan.org" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 84532, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Base Sepolia", + "domainId": 84532, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "basesepolia", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://sepolia.base.org" + }, + { + "http": "https://base-sepolia-rpc.publicnode.com" + } + ] + }, + "berabartio": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/testnet/evm/80084/etherscan/api/", + "family": "routescan", + "name": "Bartio Testnet Explorer", + "url": "https://bartio.beratrail.io/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 1 + }, + "chainId": 80084, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Berachain bArtio", + "domainId": 80084, + "gasCurrencyCoinGeckoId": "berachain", + "isTestnet": true, + "name": "berabartio", + "nativeToken": { + "decimals": 18, + "name": "BERA", + "symbol": "BERA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://bartio.rpc.berachain.com/" + }, + { + "http": "https://bartio.drpc.org" + }, + { + "http": "https://bera-testnet.nodeinfra.com" + } + ] + }, + "bsctestnet": { + "blockExplorers": [ + { + "apiUrl": "https://api-testnet.bscscan.com/api", + "family": "etherscan", + "name": "BscScan", + "url": "https://testnet.bscscan.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 9 + }, + "chainId": 97, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "BSC Testnet", + "domainId": 97, + "gasCurrencyCoinGeckoId": "binancecoin", + "isTestnet": true, + "name": "bsctestnet", + "nativeToken": { + "decimals": 18, + "name": "BNB", + "symbol": "BNB" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://bsc-testnet.publicnode.com" + }, + { + "http": "https://bsc-testnet.blockpi.network/v1/rpc/public" + } + ], + "transactionOverrides": { + "gasPrice": 8000000000 + } + }, + "camptestnet": { + "blockExplorers": [ + { + "apiUrl": "https://camp-network-testnet.blockscout.com/api", + "family": "blockscout", + "name": "Camp Network Testnet Explorer", + "url": "https://camp-network-testnet.blockscout.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 325000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Camp Network Testnet V2", + "domainId": 325000, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "camptestnet", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc-campnetwork.xyz" + } + ] + }, + "citreatestnet": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.testnet.citrea.xyz/api", + "family": "blockscout", + "name": "Citrea Testnet Explorer", + "url": "https://explorer.testnet.citrea.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 5115, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Citrea Testnet", + "domainId": 5115, + "gasCurrencyCoinGeckoId": "bitcoin", + "isTestnet": true, + "name": "citreatestnet", + "nativeToken": { + "decimals": 18, + "name": "Citrea BTC", + "symbol": "cBTC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.testnet.citrea.xyz" + } + ] + }, + "connextsepolia": { + "blockExplorers": [ + { + "apiUrl": "https://scan.testnet.everclear.org/api", + "family": "blockscout", + "name": "Everclear Testnet Explorer", + "url": "https://scan.testnet.everclear.org/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 10, + "reorgPeriod": 0 + }, + "chainId": 6398, + "deployer": { + "name": "Everclear", + "url": "https://everclear.org" + }, + "displayName": "Everclear Sepolia", + "domainId": 6398, + "gasCurrencyCoinGeckoId": "ethereum", + "index": { + "from": 4950 + }, + "isTestnet": true, + "name": "connextsepolia", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.connext-sepolia.gelato.digital" + } + ], + "technicalStack": "arbitrumnitro" + }, + "ecotestnet": { + "blockExplorers": [ + { + "apiUrl": "https://eco-testnet.explorer.caldera.xyz/api", + "family": "blockscout", + "name": "ECO Testnet explorer", + "url": "https://eco-testnet.explorer.caldera.xyz/" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 0 + }, + "chainId": 471923, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Eco Testnet", + "domainId": 471923, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "ecotestnet", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://eco-testnet.rpc.caldera.xyz/http" + } + ] + }, + "eclipsetestnet": { + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.4, + "reorgPeriod": 0 + }, + "chainId": 239092742, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Eclipse Testnet", + "domainId": 239092742, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "eclipsetestnet", + "nativeToken": { + "decimals": 9, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://testnet.dev2.eclipsenetwork.xyz" + } + ] + }, + "formtestnet": { + "blockExplorers": [ + { + "apiUrl": "https://sepolia-explorer.form.network/api", + "family": "blockscout", + "name": "Form Testnet Explorer", + "url": "https://sepolia-explorer.form.network" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 2, + "reorgPeriod": 1 + }, + "chainId": 132902, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Form Testnet", + "domainId": 132902, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "formtestnet", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://testnet-rpc.form.network/http" + } + ] + }, + "fuji": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/testnet/evm/43113/etherscan/api", + "family": "etherscan", + "name": "SnowTrace", + "url": "https://testnet.snowtrace.io" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 2, + "reorgPeriod": 3 + }, + "chainId": 43113, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Fuji", + "domainId": 43113, + "gasCurrencyCoinGeckoId": "avalanche-2", + "isTestnet": true, + "name": "fuji", + "nativeToken": { + "decimals": 18, + "name": "Avalanche", + "symbol": "AVAX" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://api.avax-test.network/ext/bc/C/rpc", + "pagination": { + "maxBlockRange": 2048 + } + } + ] + }, + "holesky": { + "blockExplorers": [ + { + "apiUrl": "https://api-holesky.etherscan.io/api", + "family": "etherscan", + "name": "Etherscan", + "url": "https://holesky.etherscan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 13, + "reorgPeriod": 2 + }, + "chainId": 17000, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Holesky", + "domainId": 17000, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "holesky", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://ethereum-holesky-rpc.publicnode.com" + } + ] + }, + "inksepolia": { + "blockExplorers": [ + { + "apiUrl": "https://explorer-sepolia.inkonchain.com/api", + "family": "blockscout", + "name": "https://explorer-sepolia.inkonchain.com", + "url": "https://explorer-sepolia.inkonchain.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 763373, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Ink Sepolia", + "domainId": 763373, + "isTestnet": true, + "name": "inksepolia", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ { - "apiUrl": "https://explorer.celo.org/alfajores/api", + "http": "https://rpc-qnd-sepolia.inkonchain.com" + } + ], + "technicalStack": "opstack" + }, + "odysseytestnet": { + "blockExplorers": [ + { + "apiUrl": "https://odyssey-explorer.ithaca.xyz/api", "family": "blockscout", - "name": "Blockscout", - "url": "https://explorer.celo.org/alfajores" + "name": "Odyssey Explorer", + "url": "https://odyssey-explorer.ithaca.xyz" } ], "blocks": { "confirmations": 1, - "estimateBlockTime": 5, - "reorgPeriod": 0 + "estimateBlockTime": 1, + "reorgPeriod": 1 }, - "chainId": 44787, - "displayName": "Alfajores", - "domainId": 44787, + "chainId": 911867, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Odyssey Testnet", + "domainId": 911867, "isTestnet": true, - "name": "alfajores", + "name": "odysseytestnet", "nativeToken": { "decimals": 18, - "name": "CELO", - "symbol": "CELO" + "name": "Ether", + "symbol": "ETH" }, "protocol": "ethereum", "rpcUrls": [ { - "http": "https://alfajores-forno.celo-testnet.org" + "http": "https://odyssey.ithaca.xyz" } ] }, - "fuji": { + "optimismsepolia": { "blockExplorers": [ { - "apiUrl": "https://api-testnet.snowtrace.io/api", + "apiUrl": "https://api-sepolia-optimistic.etherscan.io/api", "family": "etherscan", - "name": "SnowTrace", - "url": "https://testnet.snowtrace.io" + "name": "OP Sepolia Explorer", + "url": "https://sepolia-optimistic.etherscan.io" } ], "blocks": { - "confirmations": 3, + "confirmations": 1, "estimateBlockTime": 2, - "reorgPeriod": 3 + "reorgPeriod": 0 }, - "chainId": 43113, - "displayName": "Fuji", - "domainId": 43113, + "chainId": 11155420, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Optimism Sepolia", + "domainId": 11155420, + "gasCurrencyCoinGeckoId": "ethereum", "isTestnet": true, - "name": "fuji", + "name": "optimismsepolia", "nativeToken": { "decimals": 18, - "name": "Avalanche", - "symbol": "AVAX" + "name": "Ether", + "symbol": "ETH" }, "protocol": "ethereum", "rpcUrls": [ { - "http": "https://api.avax-test.network/ext/bc/C/rpc", - "pagination": { - "maxBlockRange": 2048 - } + "http": "https://sepolia.optimism.io" } ] }, - "bsctestnet": { + "polygonamoy": { "blockExplorers": [ { - "apiUrl": "https://api-testnet.bscscan.com/api", + "apiUrl": "https://api-amoy.polygonscan.com/api", "family": "etherscan", - "name": "BscScan", - "url": "https://testnet.bscscan.com" + "name": "Polygon Amoy Explorer", + "url": "https://amoy.polygonscan.com" } ], "blocks": { - "confirmations": 1, - "estimateBlockTime": 3, - "reorgPeriod": 9 + "confirmations": 5, + "estimateBlockTime": 2, + "reorgPeriod": 10 }, - "chainId": 97, - "displayName": "BSC Testnet", - "domainId": 97, + "chainId": 80002, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Polygon Amoy", + "domainId": 80002, + "gasCurrencyCoinGeckoId": "polygon-ecosystem-token", "isTestnet": true, - "name": "bsctestnet", + "name": "polygonamoy", "nativeToken": { "decimals": 18, - "name": "BNB", - "symbol": "BNB" + "name": "Polygon Ecosystem Token", + "symbol": "POL" }, "protocol": "ethereum", "rpcUrls": [ { - "http": "https://bsc-testnet.publicnode.com" + "http": "https://rpc-amoy.polygon.technology" }, { - "http": "https://bsc-testnet.blockpi.network/v1/rpc/public" + "http": "https://polygon-amoy-bor-rpc.publicnode.com" + }, + { + "http": "https://polygon-amoy.blockpi.network/v1/rpc/public" + }, + { + "http": "https://rpc.ankr.com/polygon_amoy" } - ], - "transactionOverrides": { - "gasPrice": 80000000000 - } + ] }, "scrollsepolia": { "blockExplorers": [ @@ -122,8 +765,13 @@ "reorgPeriod": 1 }, "chainId": 534351, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, "displayName": "Scroll Sepolia", "domainId": 534351, + "gasCurrencyCoinGeckoId": "ethereum", "isTestnet": true, "name": "scrollsepolia", "nativeToken": { @@ -135,6 +783,18 @@ "rpcUrls": [ { "http": "https://sepolia-rpc.scroll.io" + }, + { + "http": "https://rpc.ankr.com/scroll_sepolia_testnet" + }, + { + "http": "https://scroll-sepolia.blockpi.network/v1/rpc/public" + }, + { + "http": "https://scroll-sepolia.chainstacklabs.com" + }, + { + "http": "https://scroll-public.scroll-testnet.quiknode.pro" } ] }, @@ -153,8 +813,14 @@ "reorgPeriod": 2 }, "chainId": 11155111, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, "displayName": "Sepolia", "domainId": 11155111, + "gasCurrencyCoinGeckoId": "ethereum", + "gnosisSafeTransactionServiceUrl": "https://safe-transaction-sepolia.safe.global", "isTestnet": true, "name": "sepolia", "nativeToken": { @@ -164,6 +830,9 @@ }, "protocol": "ethereum", "rpcUrls": [ + { + "http": "https://ethereum-sepolia.publicnode.com" + }, { "http": "https://ethereum-sepolia.blockpi.network/v1/rpc/public" }, @@ -172,45 +841,86 @@ } ] }, - "moonbasealpha": { + "solanatestnet": { "blockExplorers": [ { - "apiUrl": "https://api-moonbase.moonscan.io/api", - "family": "etherscan", - "name": "MoonScan", - "url": "https://moonbase.moonscan.io" + "apiUrl": "https://explorer.solana.com?cluster=testnet", + "family": "other", + "name": "Solana Explorer", + "url": "https://explorer.solana.com?cluster=testnet" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 0.4, + "reorgPeriod": 0 + }, + "chainId": 1399811150, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Solana Testnet", + "displayNameShort": "Sol Testnet", + "domainId": 1399811150, + "gasCurrencyCoinGeckoId": "solana", + "isTestnet": true, + "name": "solanatestnet", + "nativeToken": { + "decimals": 9, + "name": "Solana", + "symbol": "SOL" + }, + "protocol": "sealevel", + "rpcUrls": [ + { + "http": "https://api.testnet.solana.com" + } + ] + }, + "soneiumtestnet": { + "blockExplorers": [ + { + "apiUrl": "https://explorer-testnet.soneium.org/api", + "family": "blockscout", + "name": "Soneium Minato Testnet Explorer", + "url": "https://explorer-testnet.soneium.org" } ], "blocks": { "confirmations": 1, - "estimateBlockTime": 12, + "estimateBlockTime": 2, "reorgPeriod": 1 }, - "chainId": 1287, - "displayName": "Moonbase Alpha", - "displayNameShort": "Moonbase", - "domainId": 1287, + "chainId": 1946, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Soneium Minato Testnet", + "domainId": 1946, + "gasCurrencyCoinGeckoId": "ethereum", "isTestnet": true, - "name": "moonbasealpha", + "name": "soneiumtestnet", "nativeToken": { "decimals": 18, - "name": "DEV", - "symbol": "DEV" + "name": "Ether", + "symbol": "ETH" }, "protocol": "ethereum", "rpcUrls": [ { - "http": "https://rpc.api.moonbase.moonbeam.network" + "http": "https://rpc.minato.soneium.org" } ] }, - "solanatestnet": { + "sonicsvmtestnet": { "blockExplorers": [ { - "apiUrl": "https://explorer.solana.com", + "apiUrl": "https://explorer.sonic.game/?cluster=testnet.v1", "family": "other", - "name": "Solana Explorer", - "url": "https://explorer.solana.com" + "name": "Sonic Explorer", + "url": "https://explorer.sonic.game/?cluster=testnet.v1" } ], "blocks": { @@ -218,52 +928,208 @@ "estimateBlockTime": 0.4, "reorgPeriod": 0 }, - "chainId": 1399811150, - "displayName": "Solana Testnet", - "displayNameShort": "Sol Testnet", - "domainId": 1399811150, + "chainId": 15153042, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic SVM Testnet", + "displayNameShort": "Sonic SVM Testnet", + "domainId": 15153042, "isTestnet": true, - "name": "solanatestnet", + "name": "sonicsvmtestnet", "nativeToken": { "decimals": 9, - "name": "Sol", + "name": "Solana", "symbol": "SOL" }, "protocol": "sealevel", "rpcUrls": [ { - "http": "https://api.testnet.solana.com" + "http": "https://api.testnet.sonic.game" } ] }, - "eclipsetestnet": { + "sonictestnet": { "blockExplorers": [ { - "apiUrl": "https://testnet.dev2.eclipsenetwork.xyz", - "family": "other", - "name": "Eclipse Testnet Explorer", - "url": "https://explorer.dev.eclipsenetwork.xyz/?cluster=testnet" + "apiUrl": "https://testnet.soniclabs.com/api", + "family": "routescan", + "name": "Sonic Testnet Explorer", + "url": "https://testnet.soniclabs.com" } ], "blocks": { "confirmations": 1, - "estimateBlockTime": 0.4, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 64165, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Sonic Testnet", + "domainId": 64165, + "isTestnet": true, + "name": "sonictestnet", + "nativeToken": { + "decimals": 18, + "name": "Sonic", + "symbol": "S" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.testnet.soniclabs.com" + } + ] + }, + "suavetoliman": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.toliman.suave.flashbots.net/api", + "family": "blockscout", + "name": "SUAVE Toliman Testnet Explorer", + "url": "https://explorer.toliman.suave.flashbots.net" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 4, + "reorgPeriod": 1 + }, + "chainId": 33626250, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "SUAVE Toliman Testnet", + "domainId": 33626250, + "gasCurrencyCoinGeckoId": "ethereum", + "isTestnet": true, + "name": "suavetoliman", + "nativeToken": { + "decimals": 18, + "name": "TEEth", + "symbol": "TEEth" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.toliman.suave.flashbots.net" + } + ] + }, + "superpositiontestnet": { + "blockExplorers": [ + { + "apiUrl": "https://testnet-explorer.superposition.so/api", + "family": "blockscout", + "name": "Superposition Testnet Explorer", + "url": "https://testnet-explorer.superposition.so" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 98985, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Superposition Testnet", + "domainId": 98985, + "gasCurrencyCoinGeckoId": "superposition", + "index": { + "from": 3111622 + }, + "isTestnet": true, + "name": "superpositiontestnet", + "nativeToken": { + "decimals": 18, + "name": "Superposition", + "symbol": "SPN" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://testnet-rpc.superposition.so" + } + ], + "technicalStack": "arbitrumnitro" + }, + "treasuretopaz": { + "blockExplorers": [ + { + "apiUrl": "https://rpc-explorer-verify.topaz.treasure.lol/contract_verification", + "family": "etherscan", + "name": "Treasure Topaz Block Explorer", + "url": "https://topaz.treasurescan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, "reorgPeriod": 0 }, - "chainId": 239092742, - "displayName": "Eclipse Testnet", - "domainId": 239092742, + "chainId": 978658, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Treasure Topaz Testnet", + "displayNameShort": "Treasure Testnet", + "domainId": 978658, "isTestnet": true, - "name": "eclipsetestnet", + "name": "treasuretopaz", "nativeToken": { - "decimals": 9, + "decimals": 18, + "name": "MAGIC", + "symbol": "MAGIC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.topaz.treasure.lol" + } + ], + "technicalStack": "zksync" + }, + "unichaintestnet": { + "blockExplorers": [ + { + "apiUrl": "https://unichain-sepolia.blockscout.com/api", + "family": "blockscout", + "name": "Unichain Sepolia Testnet Explorer", + "url": "https://unichain-sepolia.blockscout.com" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 1 + }, + "chainId": 1301, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Unichain Testnet", + "domainId": 1301, + "isTestnet": true, + "name": "unichaintestnet", + "nativeToken": { + "decimals": 18, "name": "Ether", "symbol": "ETH" }, - "protocol": "sealevel", + "protocol": "ethereum", "rpcUrls": [ { - "http": "https://testnet.dev2.eclipsenetwork.xyz" + "http": "https://sepolia.unichain.org" } ] } diff --git a/rust/sealevel/environments/testnet4/gas-oracle-configs.json b/rust/sealevel/environments/testnet4/gas-oracle-configs.json index 9e1cb73138..cadbe1ad78 100644 --- a/rust/sealevel/environments/testnet4/gas-oracle-configs.json +++ b/rust/sealevel/environments/testnet4/gas-oracle-configs.json @@ -25,5 +25,14 @@ "gasPrice": "28", "tokenDecimals": 9 } + }, + { + "domain": 15153042, + "gasOracle": { + "type": "remoteGasData", + "tokenExchangeRate": "10000000000000000000", + "gasPrice": "28", + "tokenDecimals": 9 + } } ] \ No newline at end of file diff --git a/rust/sealevel/environments/testnet4/multisig-ism-message-id/solanatestnet/hyperlane/multisig-config.json b/rust/sealevel/environments/testnet4/multisig-ism-message-id/solanatestnet/hyperlane/multisig-config.json index 4584eebed6..f5898786cc 100644 --- a/rust/sealevel/environments/testnet4/multisig-ism-message-id/solanatestnet/hyperlane/multisig-config.json +++ b/rust/sealevel/environments/testnet4/multisig-ism-message-id/solanatestnet/hyperlane/multisig-config.json @@ -1,61 +1,215 @@ { + "abstracttestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e" + ] + }, + "alephzeroevmtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x556cd94bcb6e5773e8df75e7eb3f91909d266a26" + ] + }, "alfajores": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x2233a5ce12f814bd64c9cdd73410bb8693124d40", "0xba279f965489d90f90490e3c49e860e0b43c2ae6", "0x86485dcec5f7bb8478dd251676372d054dea6653" - ], - "type": 3 + ] + }, + "arbitrumsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x09fabfbca0b8bf042e2a1161ee5010d147b0f603" + ] + }, + "arcadiatestnet2": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd39cd388ce3f616bc81be6dd3ec9348d7cdf4dff" + ] + }, + "basesepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x82e3b437a2944e3ff00258c93e72cd1ba5e0e921" + ] + }, + "berabartio": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x541dd3cb282cf869d72883557badae245b63e1fd" + ] }, "bsctestnet": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0x242d8a855a8c932dec51f7999ae7d1e48b10c95e", "0xf620f5e3d25a3ae848fec74bccae5de3edcd8796", "0x1f030345963c54ff8229720dd3a711c15c554aeb" - ], - "type": 3 + ] + }, + "camptestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e" + ] + }, + "citreatestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x60d7380a41eb95c49be18f141efd2fde5e3dba20" + ] + }, + "connextsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xffbbec8c499585d80ef69eb613db624d27e089ab" + ] + }, + "eclipsetestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf344f34abca9a444545b5295066348a0ae22dda3" + ] + }, + "ecotestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xb3191420d463c2af8bd9b4a395e100ec5c05915a" + ] + }, + "formtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x72ad7fddf16d17ff902d788441151982fa31a7bc" + ] }, "fuji": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e", "0x895ae30bc83ff1493b9cf7781b0b813d23659857", "0x43e915573d9f1383cbf482049e4a012290759e7f" - ], - "type": 3 + ] }, - "moonbasealpha": { - "threshold": 2, + "holesky": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x7ab28ad88bb45867137ea823af88e2cb02359c03" + ] + }, + "inksepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xe61c846aee275070207fcbf43674eb254f06097a" + ] + }, + "odysseytestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, "validators": [ - "0x521877064bd7ac7500d300f162c8c47c256a2f9c", - "0xbc1c70f58ae0459d4b8a013245420a893837d568", - "0x01e42c2c44af81dda1ac16fec76fea2a7a54a44c" - ], - "type": 3 + "0xcc0a6e2d6aa8560b45b384ced7aa049870b66ea3" + ] + }, + "optimismsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x03efe4d0632ee15685d7e8f46dea0a874304aa29" + ] + }, + "polygonamoy": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf0290b06e446b320bd4e9c4a519420354d7ddccd" + ] }, "scrollsepolia": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xbe18dbd758afb367180260b524e6d4bcd1cb6d05", "0x9a11ed23ae962974018ab45bc133caabff7b3271", "0x7867bea3c9761fe64e6d124b171f91fd5dd79644" - ], - "type": 3 + ] }, "sepolia": { + "type": "messageIdMultisigIsm", "threshold": 2, "validators": [ "0xb22b65f202558adf86a8bb2847b76ae1036686a5", "0x469f0940684d147defc44f3647146cb90dd0bc8e", "0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" - ], - "type": 3 + ] }, - "eclipsetestnet": { + "soneiumtestnet": { + "type": "messageIdMultisigIsm", "threshold": 1, - "validators": ["0xf344f34abca9a444545b5295066348a0ae22dda3"], - "type": 3 + "validators": [ + "0x2e2101020ccdbe76aeda1c27823b0150f43d0c63" + ] + }, + "sonicsvmtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x83d4ef35f170ec822a0eaadb22a0c40003d8de23" + ] + }, + "sonictestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x62e6591d00daec3fb658c3d19403828b4e9ddbb3" + ] + }, + "suavetoliman": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf58f6e30aabba34e8dd7f79b3168507192e2cc9b" + ] + }, + "superpositiontestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a" + ] + }, + "treasuretopaz": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x9750849beda0a7870462d4685f953fe39033a5ae" + ] + }, + "unichaintestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x5e99961cf71918308c3b17ef21b5f515a4f86fe5" + ] } } diff --git a/rust/sealevel/environments/testnet4/multisig-ism-message-id/sonicsvmtestnet/hyperlane/multisig-config.json b/rust/sealevel/environments/testnet4/multisig-ism-message-id/sonicsvmtestnet/hyperlane/multisig-config.json new file mode 100644 index 0000000000..48ae9db5c1 --- /dev/null +++ b/rust/sealevel/environments/testnet4/multisig-ism-message-id/sonicsvmtestnet/hyperlane/multisig-config.json @@ -0,0 +1,215 @@ +{ + "abstracttestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e" + ] + }, + "alephzeroevmtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x556cd94bcb6e5773e8df75e7eb3f91909d266a26" + ] + }, + "alfajores": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x2233a5ce12f814bd64c9cdd73410bb8693124d40", + "0xba279f965489d90f90490e3c49e860e0b43c2ae6", + "0x86485dcec5f7bb8478dd251676372d054dea6653" + ] + }, + "arbitrumsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x09fabfbca0b8bf042e2a1161ee5010d147b0f603" + ] + }, + "arcadiatestnet2": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd39cd388ce3f616bc81be6dd3ec9348d7cdf4dff" + ] + }, + "basesepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x82e3b437a2944e3ff00258c93e72cd1ba5e0e921" + ] + }, + "berabartio": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x541dd3cb282cf869d72883557badae245b63e1fd" + ] + }, + "bsctestnet": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0x242d8a855a8c932dec51f7999ae7d1e48b10c95e", + "0xf620f5e3d25a3ae848fec74bccae5de3edcd8796", + "0x1f030345963c54ff8229720dd3a711c15c554aeb" + ] + }, + "camptestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e" + ] + }, + "citreatestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x60d7380a41eb95c49be18f141efd2fde5e3dba20" + ] + }, + "connextsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xffbbec8c499585d80ef69eb613db624d27e089ab" + ] + }, + "eclipsetestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf344f34abca9a444545b5295066348a0ae22dda3" + ] + }, + "ecotestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xb3191420d463c2af8bd9b4a395e100ec5c05915a" + ] + }, + "formtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x72ad7fddf16d17ff902d788441151982fa31a7bc" + ] + }, + "fuji": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e", + "0x895ae30bc83ff1493b9cf7781b0b813d23659857", + "0x43e915573d9f1383cbf482049e4a012290759e7f" + ] + }, + "holesky": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x7ab28ad88bb45867137ea823af88e2cb02359c03" + ] + }, + "inksepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xe61c846aee275070207fcbf43674eb254f06097a" + ] + }, + "odysseytestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xcc0a6e2d6aa8560b45b384ced7aa049870b66ea3" + ] + }, + "optimismsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x03efe4d0632ee15685d7e8f46dea0a874304aa29" + ] + }, + "polygonamoy": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf0290b06e446b320bd4e9c4a519420354d7ddccd" + ] + }, + "scrollsepolia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xbe18dbd758afb367180260b524e6d4bcd1cb6d05", + "0x9a11ed23ae962974018ab45bc133caabff7b3271", + "0x7867bea3c9761fe64e6d124b171f91fd5dd79644" + ] + }, + "sepolia": { + "type": "messageIdMultisigIsm", + "threshold": 2, + "validators": [ + "0xb22b65f202558adf86a8bb2847b76ae1036686a5", + "0x469f0940684d147defc44f3647146cb90dd0bc8e", + "0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" + ] + }, + "solanatestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5" + ] + }, + "soneiumtestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x2e2101020ccdbe76aeda1c27823b0150f43d0c63" + ] + }, + "sonictestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x62e6591d00daec3fb658c3d19403828b4e9ddbb3" + ] + }, + "suavetoliman": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0xf58f6e30aabba34e8dd7f79b3168507192e2cc9b" + ] + }, + "superpositiontestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a" + ] + }, + "treasuretopaz": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x9750849beda0a7870462d4685f953fe39033a5ae" + ] + }, + "unichaintestnet": { + "type": "messageIdMultisigIsm", + "threshold": 1, + "validators": [ + "0x5e99961cf71918308c3b17ef21b5f515a4f86fe5" + ] + } +} diff --git a/rust/sealevel/environments/testnet4/sonicsvmtestnet/core/program-ids.json b/rust/sealevel/environments/testnet4/sonicsvmtestnet/core/program-ids.json new file mode 100644 index 0000000000..4cd8925d41 --- /dev/null +++ b/rust/sealevel/environments/testnet4/sonicsvmtestnet/core/program-ids.json @@ -0,0 +1,8 @@ +{ + "mailbox": "6BaTtWPMpWdA6tHqdT2VbogC4XZ9QV5cNCYpBrx6WP7B", + "validator_announce": "84NjUotjZcNBVGBhvwERPNS6zaAfhkJkG33aSiNxPma2", + "multisig_ism_message_id": "DgLicFznJQbnapc9cLSTB2DxN1FnrFnZo5SwD55iTycA", + "igp_program_id": "2rRRMJhFU9QrfjHzBzwqwa33sZG2CrxSwA44PyNpVTDw", + "overhead_igp_account": "9Nq8bJdER4criKNYtkKt3WJDA2LjzHYCH11xKy53fX9", + "igp_account": "FSy4hQ92ZTPJVG2UmiWiymoogpwEDBcucKnLzLnbrBDt" +} diff --git a/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/program-ids.json b/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/program-ids.json new file mode 100644 index 0000000000..73f46e30ff --- /dev/null +++ b/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/program-ids.json @@ -0,0 +1,10 @@ +{ + "sonicsvmtestnet": { + "hex": "0xc71ae64693cca2472d95769cd8541c320f915259c0c36e3f410f6ebc1f7f709e", + "base58": "EQDvULvwhZwK349y6Qt2ouAyDhBbHZoaUG8guWcqYdxZ" + }, + "solanatestnet": { + "hex": "0xfd0509b8d03119deb0bc82989384fadcd3a6cb1b4d29c0ccbf8548777614732c", + "base58": "J2gbyytzDqQozPh1xgm38NchdDPNnvGKrSff47rnVsFh" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/token-config.json b/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/token-config.json new file mode 100644 index 0000000000..eb345bbc5e --- /dev/null +++ b/rust/sealevel/environments/testnet4/warp-routes/SOL-solanatestnet-sonicsvmtestnet/token-config.json @@ -0,0 +1,12 @@ +{ + "solanatestnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "hBHAApi5ZoeCYHqDdCKkCzVKmBdwywdT3hMqe327eZB" + }, + "sonicsvmtestnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "9Nq8bJdER4criKNYtkKt3WJDA2LjzHYCH11xKy53fX9" + } +} diff --git a/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml b/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml index 256b21d76b..f02e1865f8 100644 --- a/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml +++ b/rust/sealevel/programs/hyperlane-sealevel-igp/Cargo.toml @@ -6,6 +6,7 @@ version = "0.1.0" edition = "2021" [features] +default = ["no-spl-noop"] no-entrypoint = [] no-spl-noop = [] serde = ["dep:serde"] diff --git a/rust/sealevel/programs/mailbox/Cargo.toml b/rust/sealevel/programs/mailbox/Cargo.toml index 6ca7bc9e2b..1d09b5e935 100644 --- a/rust/sealevel/programs/mailbox/Cargo.toml +++ b/rust/sealevel/programs/mailbox/Cargo.toml @@ -6,6 +6,7 @@ version = "0.1.0" edition = "2021" [features] +default = ["no-spl-noop"] no-entrypoint = [] no-spl-noop = [] serde = ["dep:serde"] diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index d34e53657d..76857dab51 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -66,8 +66,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< polygonamoy: true, scrollsepolia: true, sepolia: true, - solanatestnet: false, + solanatestnet: true, soneiumtestnet: true, + sonicsvmtestnet: true, sonictestnet: true, suavetoliman: true, superpositiontestnet: true, @@ -100,8 +101,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< polygonamoy: true, scrollsepolia: true, sepolia: true, - solanatestnet: false, + solanatestnet: true, soneiumtestnet: true, + sonicsvmtestnet: true, sonictestnet: true, suavetoliman: true, superpositiontestnet: true, @@ -136,6 +138,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< sepolia: true, solanatestnet: false, soneiumtestnet: true, + sonicsvmtestnet: false, sonictestnet: true, suavetoliman: true, superpositiontestnet: false, @@ -219,7 +222,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '7c0c967-20241218-173053', + tag: 'bd00efa-20241231-191107', }, blacklist: [...releaseCandidateHelloworldMatchingList, ...relayBlacklist], gasPaymentEnforcement, @@ -241,7 +244,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'bb4e82b-20241107-190434', + tag: 'bd00efa-20241231-191107', }, chains: validatorChainConfig(Contexts.Hyperlane), resources: validatorResources, diff --git a/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json b/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json index f18b6a10b8..dab4161a8b 100644 --- a/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json @@ -82,9 +82,15 @@ "0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" ] }, + "solanatestnet": { + "validators": ["0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5"] + }, "soneiumtestnet": { "validators": ["0x2e2101020ccdbe76aeda1c27823b0150f43d0c63"] }, + "sonicsvmtestnet": { + "validators": ["0x83d4ef35f170ec822a0eaadb22a0c40003d8de23"] + }, "sonictestnet": { "validators": ["0x62e6591d00daec3fb658c3d19403828b4e9ddbb3"] }, diff --git a/typescript/infra/config/environments/testnet4/funding.ts b/typescript/infra/config/environments/testnet4/funding.ts index 154619d301..87b5e1ff9f 100644 --- a/typescript/infra/config/environments/testnet4/funding.ts +++ b/typescript/infra/config/environments/testnet4/funding.ts @@ -52,9 +52,11 @@ export const keyFunderConfig: KeyFunderConfig< polygonamoy: '0.2', scrollsepolia: '1', sepolia: '5', - // no funding for solana + // no funding for SVM chains solanatestnet: '0', soneiumtestnet: '0.1', + // no funding for SVM chains + sonicsvmtestnet: '0', sonictestnet: '1', suavetoliman: '0.1', superpositiontestnet: '1', diff --git a/typescript/infra/config/environments/testnet4/gasPrices.json b/typescript/infra/config/environments/testnet4/gasPrices.json index cba1c9fa25..ebb9736d5b 100644 --- a/typescript/infra/config/environments/testnet4/gasPrices.json +++ b/typescript/infra/config/environments/testnet4/gasPrices.json @@ -1,6 +1,6 @@ { "abstracttestnet": { - "amount": "0.060764843", + "amount": "0.025", "decimals": 9 }, "alephzeroevmtestnet": { @@ -20,15 +20,15 @@ "decimals": 9 }, "basesepolia": { - "amount": "0.00236715", + "amount": "0.001000846", "decimals": 9 }, "berabartio": { - "amount": "10.832064411", + "amount": "10", "decimals": 9 }, "bsctestnet": { - "amount": "100.0", + "amount": "2.351230079", "decimals": 9 }, "camptestnet": { @@ -36,7 +36,7 @@ "decimals": 9 }, "citreatestnet": { - "amount": "5.032361163", + "amount": "0.0100001", "decimals": 9 }, "connextsepolia": { @@ -56,11 +56,11 @@ "decimals": 9 }, "fuji": { - "amount": "25.000000001", + "amount": "1.000000001", "decimals": 9 }, "holesky": { - "amount": "0.760231049", + "amount": "0.001000035", "decimals": 9 }, "inksepolia": { @@ -68,39 +68,43 @@ "decimals": 9 }, "odysseytestnet": { - "amount": "2.000000252", + "amount": "1.000000252", "decimals": 9 }, "optimismsepolia": { - "amount": "0.001000256", + "amount": "0.001000298", "decimals": 9 }, "polygonamoy": { - "amount": "56.722205902", + "amount": "55", "decimals": 9 }, "scrollsepolia": { - "amount": "2.398017347", + "amount": "0.042291812", "decimals": 9 }, "sepolia": { - "amount": "4.349910601", + "amount": "5", "decimals": 9 }, "solanatestnet": { - "amount": "0.001", - "decimals": 9 + "amount": "0.0001", + "decimals": 1 }, "soneiumtestnet": { - "amount": "0.001000259", + "amount": "0.001000267", "decimals": 9 }, + "sonicsvmtestnet": { + "amount": "0.0001", + "decimals": 1 + }, "sonictestnet": { "amount": "1.025001", "decimals": 9 }, "suavetoliman": { - "amount": "2.0736", + "amount": "10.0", "decimals": 9 }, "superpositiontestnet": { @@ -108,11 +112,11 @@ "decimals": 9 }, "treasuretopaz": { - "amount": "0.060735501", + "amount": "10", "decimals": 9 }, "unichaintestnet": { - "amount": "0.001000264", + "amount": "0.001000256", "decimals": 9 } } diff --git a/typescript/infra/config/environments/testnet4/owners.ts b/typescript/infra/config/environments/testnet4/owners.ts index 3fb009a93c..2d86e6fab6 100644 --- a/typescript/infra/config/environments/testnet4/owners.ts +++ b/typescript/infra/config/environments/testnet4/owners.ts @@ -14,9 +14,12 @@ export const owners: ChainMap = { ), // [chainMetadata.solanadevnet.name]: SEALEVEL_DEPLOYER_ADDRESS, eclipsetestnet: { - owner: 'n/a - nothing owned here', + owner: 'n/a - SVM not supported here', }, solanatestnet: { - owner: 'n/a - nothing owned here', + owner: 'n/a - SVM not supported here', + }, + sonicsvmtestnet: { + owner: 'n/a - SVM not supported here', }, }; diff --git a/typescript/infra/config/environments/testnet4/supportedChainNames.ts b/typescript/infra/config/environments/testnet4/supportedChainNames.ts index a4a7cb9e50..c3f9e0e2db 100644 --- a/typescript/infra/config/environments/testnet4/supportedChainNames.ts +++ b/typescript/infra/config/environments/testnet4/supportedChainNames.ts @@ -27,6 +27,7 @@ export const testnet4SupportedChainNames = [ 'sepolia', 'solanatestnet', 'soneiumtestnet', + 'sonicsvmtestnet', 'sonictestnet', 'suavetoliman', 'superpositiontestnet', diff --git a/typescript/infra/config/environments/testnet4/validators.ts b/typescript/infra/config/environments/testnet4/validators.ts index 4a97ebaa44..515ac4d293 100644 --- a/typescript/infra/config/environments/testnet4/validators.ts +++ b/typescript/infra/config/environments/testnet4/validators.ts @@ -306,6 +306,18 @@ export const validatorChainConfig = ( 'unichaintestnet', ), }, + solanatestnet: { + interval: 5, + reorgPeriod: getReorgPeriod('solanatestnet'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5'], + [Contexts.ReleaseCandidate]: [], + [Contexts.Neutron]: [], + }, + 'solanatestnet', + ), + }, sonictestnet: { interval: 5, reorgPeriod: getReorgPeriod('sonictestnet'), @@ -318,6 +330,18 @@ export const validatorChainConfig = ( 'sonictestnet', ), }, + sonicsvmtestnet: { + interval: 5, + reorgPeriod: getReorgPeriod('sonicsvmtestnet'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x83d4ef35f170ec822a0eaadb22a0c40003d8de23'], + [Contexts.ReleaseCandidate]: [], + [Contexts.Neutron]: [], + }, + 'sonicsvmtestnet', + ), + }, arcadiatestnet2: { interval: 5, reorgPeriod: getReorgPeriod('arcadiatestnet2'), diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index fcf940aa7a..86ea0b4d06 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -1720,6 +1720,16 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + sonicsvmtestnet: { + threshold: 1, + validators: [ + { + address: '0x83d4ef35f170ec822a0eaadb22a0c40003d8de23', + alias: AW_VALIDATOR_ALIAS, + }, + ], + }, + sonictestnet: { threshold: 1, validators: [ From 7bf0abf9da381bf08da0c4f21430304b91eaea77 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Tue, 14 Jan 2025 16:03:44 +0000 Subject: [PATCH 65/81] fix: allow CI to clone any registry commit (#5168) ### Description try cloning registry from commit that's already merged ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .github/actions/checkout-registry/action.yml | 1 + Dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/actions/checkout-registry/action.yml b/.github/actions/checkout-registry/action.yml index 929ea75399..bd8aab1c91 100644 --- a/.github/actions/checkout-registry/action.yml +++ b/.github/actions/checkout-registry/action.yml @@ -21,6 +21,7 @@ runs: with: repository: hyperlane-xyz/hyperlane-registry ref: ${{ env.REGISTRY_VERSION }} + fetch-depth: 0 path: ./hyperlane-registry - name: Move hyperlane-registry to parent directory diff --git a/Dockerfile b/Dockerfile index 555228e90d..6f8e3939d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,4 +34,5 @@ ENV REGISTRY_URI="/hyperlane-registry" ARG REGISTRY_COMMIT="main" RUN git clone https://github.com/hyperlane-xyz/hyperlane-registry.git "$REGISTRY_URI" \ && cd "$REGISTRY_URI" \ + && git fetch origin "$REGISTRY_COMMIT" \ && git checkout "$REGISTRY_COMMIT" From 68d4dce87a351137eca618436b64682c2dc987d0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:00:54 +0000 Subject: [PATCH 66/81] Version Packages (#5141) This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @hyperlane-xyz/cli@8.1.0 ### Minor Changes - 2d018fa7a: Fix hyperlane warp send where --origin and --destination are out of order ### Patch Changes - Updated dependencies [79c61c891] - Updated dependencies [9518dbc84] - Updated dependencies [9ab961a79] - @hyperlane-xyz/sdk@8.1.0 - @hyperlane-xyz/utils@8.1.0 ## @hyperlane-xyz/sdk@8.1.0 ### Minor Changes - 9ab961a79: Deploy to new chains: artela, guru, hemi, nero, xpla. ### Patch Changes - 79c61c891: Fix the return type of multisig and aggregation ISMs for zksync-stack chains. - 9518dbc84: Enroll new validators for artela, guru, hemi, nero, soneium, torus, xpla. - @hyperlane-xyz/utils@8.1.0 - @hyperlane-xyz/core@5.9.1 ## @hyperlane-xyz/core@5.9.1 ### Patch Changes - @hyperlane-xyz/utils@8.1.0 ## @hyperlane-xyz/helloworld@8.1.0 ### Patch Changes - Updated dependencies [79c61c891] - Updated dependencies [9518dbc84] - Updated dependencies [9ab961a79] - @hyperlane-xyz/sdk@8.1.0 - @hyperlane-xyz/core@5.9.1 ## @hyperlane-xyz/widgets@8.1.0 ### Patch Changes - Updated dependencies [79c61c891] - Updated dependencies [9518dbc84] - Updated dependencies [9ab961a79] - @hyperlane-xyz/sdk@8.1.0 - @hyperlane-xyz/utils@8.1.0 ## @hyperlane-xyz/utils@8.1.0 ## @hyperlane-xyz/infra@8.1.0 ### Minor Changes - 2d4963c62: Add USDC between Ink and Ethereum - fc80df5b4: Add rstETH/ethereum-zircuit warp config ### Patch Changes - Updated dependencies [79c61c891] - Updated dependencies [9518dbc84] - Updated dependencies [9ab961a79] - @hyperlane-xyz/sdk@8.1.0 - @hyperlane-xyz/helloworld@8.1.0 - @hyperlane-xyz/utils@8.1.0 ## @hyperlane-xyz/ccip-server@8.1.0 ## @hyperlane-xyz/github-proxy@8.1.0 --------- Co-authored-by: github-actions[bot] --- .changeset/cold-cows-grow.md | 5 ---- .changeset/eleven-carrots-shave.md | 5 ---- .changeset/lucky-shirts-wait.md | 5 ---- .changeset/rare-windows-deny.md | 5 ---- .changeset/serious-kangaroos-chew.md | 5 ---- .changeset/tall-starfishes-hunt.md | 5 ---- solidity/CHANGELOG.md | 6 +++++ solidity/contracts/PackageVersioned.sol | 2 +- solidity/package.json | 4 ++-- typescript/ccip-server/CHANGELOG.md | 2 ++ typescript/ccip-server/package.json | 2 +- typescript/cli/CHANGELOG.md | 14 +++++++++++ typescript/cli/package.json | 6 ++--- typescript/cli/src/version.ts | 2 +- typescript/github-proxy/CHANGELOG.md | 2 ++ typescript/github-proxy/package.json | 2 +- typescript/helloworld/CHANGELOG.md | 10 ++++++++ typescript/helloworld/package.json | 6 ++--- typescript/infra/CHANGELOG.md | 16 +++++++++++++ typescript/infra/package.json | 8 +++---- typescript/sdk/CHANGELOG.md | 13 ++++++++++ typescript/sdk/package.json | 6 ++--- typescript/utils/CHANGELOG.md | 2 ++ typescript/utils/package.json | 2 +- typescript/widgets/CHANGELOG.md | 10 ++++++++ typescript/widgets/package.json | 6 ++--- yarn.lock | 32 ++++++++++++------------- 27 files changed, 114 insertions(+), 69 deletions(-) delete mode 100644 .changeset/cold-cows-grow.md delete mode 100644 .changeset/eleven-carrots-shave.md delete mode 100644 .changeset/lucky-shirts-wait.md delete mode 100644 .changeset/rare-windows-deny.md delete mode 100644 .changeset/serious-kangaroos-chew.md delete mode 100644 .changeset/tall-starfishes-hunt.md diff --git a/.changeset/cold-cows-grow.md b/.changeset/cold-cows-grow.md deleted file mode 100644 index f0f601414a..0000000000 --- a/.changeset/cold-cows-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/infra': minor ---- - -Add USDC between Ink and Ethereum diff --git a/.changeset/eleven-carrots-shave.md b/.changeset/eleven-carrots-shave.md deleted file mode 100644 index ef5f577bdb..0000000000 --- a/.changeset/eleven-carrots-shave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': patch ---- - -Fix the return type of multisig and aggregation ISMs for zksync-stack chains. diff --git a/.changeset/lucky-shirts-wait.md b/.changeset/lucky-shirts-wait.md deleted file mode 100644 index 2fcf84f406..0000000000 --- a/.changeset/lucky-shirts-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': patch ---- - -Enroll new validators for artela, guru, hemi, nero, soneium, torus, xpla. diff --git a/.changeset/rare-windows-deny.md b/.changeset/rare-windows-deny.md deleted file mode 100644 index c744963c9c..0000000000 --- a/.changeset/rare-windows-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/infra': minor ---- - -Add rstETH/ethereum-zircuit warp config diff --git a/.changeset/serious-kangaroos-chew.md b/.changeset/serious-kangaroos-chew.md deleted file mode 100644 index 87d5b072f9..0000000000 --- a/.changeset/serious-kangaroos-chew.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Deploy to new chains: artela, guru, hemi, nero, xpla. diff --git a/.changeset/tall-starfishes-hunt.md b/.changeset/tall-starfishes-hunt.md deleted file mode 100644 index 4419db9d2e..0000000000 --- a/.changeset/tall-starfishes-hunt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Fix hyperlane warp send where --origin and --destination are out of order diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index 8dc9db0231..7e701d003e 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,11 @@ # @hyperlane-xyz/core +## 5.9.1 + +### Patch Changes + +- @hyperlane-xyz/utils@8.1.0 + ## 5.9.0 ### Minor Changes diff --git a/solidity/contracts/PackageVersioned.sol b/solidity/contracts/PackageVersioned.sol index 325ac0b25a..4f94e4415d 100644 --- a/solidity/contracts/PackageVersioned.sol +++ b/solidity/contracts/PackageVersioned.sol @@ -7,5 +7,5 @@ pragma solidity >=0.6.11; **/ abstract contract PackageVersioned { // GENERATED CODE - DO NOT EDIT - string public constant PACKAGE_VERSION = "5.9.0"; + string public constant PACKAGE_VERSION = "5.9.1"; } diff --git a/solidity/package.json b/solidity/package.json index 91a63ccb46..775fa20aac 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/core", "description": "Core solidity contracts for Hyperlane", - "version": "5.9.0", + "version": "5.9.1", "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "8.0.0", + "@hyperlane-xyz/utils": "8.1.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3", diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index 9187b81069..3688d5e885 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/ccip-server +## 8.1.0 + ## 8.0.0 ## 7.3.0 diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index 540b1d6a3e..c217320a71 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "8.0.0", + "version": "8.1.0", "description": "CCIP server", "typings": "dist/index.d.ts", "typedocMain": "src/index.ts", diff --git a/typescript/cli/CHANGELOG.md b/typescript/cli/CHANGELOG.md index 460d211bf2..13195ee0f4 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,19 @@ # @hyperlane-xyz/cli +## 8.1.0 + +### Minor Changes + +- 2d018fa7a: Fix hyperlane warp send where --origin and --destination are out of order + +### Patch Changes + +- Updated dependencies [79c61c891] +- Updated dependencies [9518dbc84] +- Updated dependencies [9ab961a79] + - @hyperlane-xyz/sdk@8.1.0 + - @hyperlane-xyz/utils@8.1.0 + ## 8.0.0 ### Minor Changes diff --git a/typescript/cli/package.json b/typescript/cli/package.json index b1796610f4..184f92b94f 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,13 +1,13 @@ { "name": "@hyperlane-xyz/cli", - "version": "8.0.0", + "version": "8.1.0", "description": "A command-line utility for common Hyperlane operations", "dependencies": { "@aws-sdk/client-kms": "^3.577.0", "@aws-sdk/client-s3": "^3.577.0", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "8.0.0", - "@hyperlane-xyz/utils": "8.0.0", + "@hyperlane-xyz/sdk": "8.1.0", + "@hyperlane-xyz/utils": "8.1.0", "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", "@inquirer/prompts": "3.3.2", diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index a7df740c2d..daf763c533 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '8.0.0'; +export const VERSION = '8.1.0'; diff --git a/typescript/github-proxy/CHANGELOG.md b/typescript/github-proxy/CHANGELOG.md index 5545013903..8e4066e1d4 100644 --- a/typescript/github-proxy/CHANGELOG.md +++ b/typescript/github-proxy/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/github-proxy +## 8.1.0 + ## 8.0.0 ## 7.3.0 diff --git a/typescript/github-proxy/package.json b/typescript/github-proxy/package.json index 698c9f4f0b..f3b15e75e0 100644 --- a/typescript/github-proxy/package.json +++ b/typescript/github-proxy/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/github-proxy", "description": "Github proxy that adds the API key to requests", - "version": "8.0.0", + "version": "8.1.0", "private": true, "scripts": { "deploy": "wrangler deploy", diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index 08416584c7..4cd55fc086 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,15 @@ # @hyperlane-xyz/helloworld +## 8.1.0 + +### Patch Changes + +- Updated dependencies [79c61c891] +- Updated dependencies [9518dbc84] +- Updated dependencies [9ab961a79] + - @hyperlane-xyz/sdk@8.1.0 + - @hyperlane-xyz/core@5.9.1 + ## 8.0.0 ### Minor Changes diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 54236e1f25..ad64eab492 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/helloworld", "description": "A basic skeleton of an Hyperlane app", - "version": "8.0.0", + "version": "8.1.0", "dependencies": { - "@hyperlane-xyz/core": "5.9.0", + "@hyperlane-xyz/core": "5.9.1", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "8.0.0", + "@hyperlane-xyz/sdk": "8.1.0", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" }, diff --git a/typescript/infra/CHANGELOG.md b/typescript/infra/CHANGELOG.md index 67b7a15642..6f18e737c5 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,21 @@ # @hyperlane-xyz/infra +## 8.1.0 + +### Minor Changes + +- 2d4963c62: Add USDC between Ink and Ethereum +- fc80df5b4: Add rstETH/ethereum-zircuit warp config + +### Patch Changes + +- Updated dependencies [79c61c891] +- Updated dependencies [9518dbc84] +- Updated dependencies [9ab961a79] + - @hyperlane-xyz/sdk@8.1.0 + - @hyperlane-xyz/helloworld@8.1.0 + - @hyperlane-xyz/utils@8.1.0 + ## 8.0.0 ### Minor Changes diff --git a/typescript/infra/package.json b/typescript/infra/package.json index 07d42bd124..b938d3a429 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/infra", "description": "Infrastructure utilities for the Hyperlane Network", - "version": "8.0.0", + "version": "8.1.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-iam": "^3.74.0", @@ -13,10 +13,10 @@ "@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/providers": "*", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "8.0.0", + "@hyperlane-xyz/helloworld": "8.1.0", "@hyperlane-xyz/registry": "6.6.0", - "@hyperlane-xyz/sdk": "8.0.0", - "@hyperlane-xyz/utils": "8.0.0", + "@hyperlane-xyz/sdk": "8.1.0", + "@hyperlane-xyz/utils": "8.1.0", "@inquirer/prompts": "3.3.2", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@safe-global/api-kit": "1.3.0", diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index e5339996dc..52c9bf5a95 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,18 @@ # @hyperlane-xyz/sdk +## 8.1.0 + +### Minor Changes + +- 9ab961a79: Deploy to new chains: artela, guru, hemi, nero, xpla. + +### Patch Changes + +- 79c61c891: Fix the return type of multisig and aggregation ISMs for zksync-stack chains. +- 9518dbc84: Enroll new validators for artela, guru, hemi, nero, soneium, torus, xpla. + - @hyperlane-xyz/utils@8.1.0 + - @hyperlane-xyz/core@5.9.1 + ## 8.0.0 ### Major Changes diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index f6cfedb947..966369a475 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,15 +1,15 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "8.0.0", + "version": "8.1.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-s3": "^3.577.0", "@chain-registry/types": "^0.50.14", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@hyperlane-xyz/core": "5.9.0", - "@hyperlane-xyz/utils": "8.0.0", + "@hyperlane-xyz/core": "5.9.1", + "@hyperlane-xyz/utils": "8.1.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-deployments": "1.37.8", diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index 1b8b3ef758..232c213369 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/utils +## 8.1.0 + ## 8.0.0 ### Minor Changes diff --git a/typescript/utils/package.json b/typescript/utils/package.json index 784886b1f7..a1c461a1de 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/utils", "description": "General utilities and types for the Hyperlane network", - "version": "8.0.0", + "version": "8.1.0", "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", diff --git a/typescript/widgets/CHANGELOG.md b/typescript/widgets/CHANGELOG.md index 328d76a977..60c3b63817 100644 --- a/typescript/widgets/CHANGELOG.md +++ b/typescript/widgets/CHANGELOG.md @@ -1,5 +1,15 @@ # @hyperlane-xyz/widgets +## 8.1.0 + +### Patch Changes + +- Updated dependencies [79c61c891] +- Updated dependencies [9518dbc84] +- Updated dependencies [9ab961a79] + - @hyperlane-xyz/sdk@8.1.0 + - @hyperlane-xyz/utils@8.1.0 + ## 8.0.0 ### Minor Changes diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index 9c008450f7..11d0aad02c 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/widgets", "description": "Common react components for Hyperlane projects", - "version": "8.0.0", + "version": "8.1.0", "peerDependencies": { "react": "^18", "react-dom": "^18" @@ -9,8 +9,8 @@ "dependencies": { "@cosmos-kit/react": "^2.18.0", "@headlessui/react": "^2.1.8", - "@hyperlane-xyz/sdk": "8.0.0", - "@hyperlane-xyz/utils": "8.0.0", + "@hyperlane-xyz/sdk": "8.1.0", + "@hyperlane-xyz/utils": "8.1.0", "@interchain-ui/react": "^1.23.28", "@rainbow-me/rainbowkit": "^2.2.0", "@solana/wallet-adapter-react": "^0.15.32", diff --git a/yarn.lock b/yarn.lock index 7235f71d59..471c94f7ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7321,8 +7321,8 @@ __metadata: "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:8.0.0" - "@hyperlane-xyz/utils": "npm:8.0.0" + "@hyperlane-xyz/sdk": "npm:8.1.0" + "@hyperlane-xyz/utils": "npm:8.1.0" "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" "@inquirer/prompts": "npm:3.3.2" @@ -7361,13 +7361,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:5.9.0, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:5.9.1, @hyperlane-xyz/core@workspace:solidity": version: 0.0.0-use.local resolution: "@hyperlane-xyz/core@workspace:solidity" dependencies: "@arbitrum/nitro-contracts": "npm:^1.2.1" "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:8.0.0" + "@hyperlane-xyz/utils": "npm:8.1.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -7418,14 +7418,14 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/helloworld@npm:8.0.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:8.1.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:5.9.0" + "@hyperlane-xyz/core": "npm:5.9.1" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:8.0.0" + "@hyperlane-xyz/sdk": "npm:8.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -7474,10 +7474,10 @@ __metadata: "@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/providers": "npm:*" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:8.0.0" + "@hyperlane-xyz/helloworld": "npm:8.1.0" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:8.0.0" - "@hyperlane-xyz/utils": "npm:8.0.0" + "@hyperlane-xyz/sdk": "npm:8.1.0" + "@hyperlane-xyz/utils": "npm:8.1.0" "@inquirer/prompts": "npm:3.3.2" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" @@ -7547,7 +7547,7 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:8.0.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:8.1.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: @@ -7557,8 +7557,8 @@ __metadata: "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:5.9.0" - "@hyperlane-xyz/utils": "npm:8.0.0" + "@hyperlane-xyz/core": "npm:5.9.1" + "@hyperlane-xyz/utils": "npm:8.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -7601,7 +7601,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/utils@npm:8.0.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:8.1.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: @@ -7643,8 +7643,8 @@ __metadata: "@eslint/js": "npm:^9.15.0" "@headlessui/react": "npm:^2.1.8" "@hyperlane-xyz/registry": "npm:6.6.0" - "@hyperlane-xyz/sdk": "npm:8.0.0" - "@hyperlane-xyz/utils": "npm:8.0.0" + "@hyperlane-xyz/sdk": "npm:8.1.0" + "@hyperlane-xyz/utils": "npm:8.1.0" "@interchain-ui/react": "npm:^1.23.28" "@rainbow-me/rainbowkit": "npm:^2.2.0" "@solana/wallet-adapter-react": "npm:^0.15.32" From 9574b1b4983833b3f7912a4c76363d0c3e5317f1 Mon Sep 17 00:00:00 2001 From: xeno097 Date: Tue, 14 Jan 2025 14:54:44 -0400 Subject: [PATCH 67/81] feat(infra): added the getEthereumFormUSDTWarpConfig func (#5056) ### Description Adds the warp route config getter for the USDT route on Form network associated registry PR https://github.com/hyperlane-xyz/hyperlane-registry/pull/449 ### Drive-by changes - NO ### Backward compatibility -YES ### Testing - Manual --------- Co-authored-by: nambrot --- .registryrc | 2 +- .../getEthereumFormUSDCWarpConfig.ts | 43 +++++++++++++++++++ .../getEthereumFormUSDTWarpConfig.ts | 40 +++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 2 + typescript/infra/config/warp.ts | 4 ++ typescript/infra/src/warp/helm.ts | 2 +- 6 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.ts create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.ts diff --git a/.registryrc b/.registryrc index 41ee7283ce..001391d9ac 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -9d7868fa55b97d610c9c1916d22d71d3e67b5aa8 +195c073c3c34b234c8d0aed2a16962a2d3945354 diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.ts new file mode 100644 index 0000000000..2118a3860f --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.ts @@ -0,0 +1,43 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +// Safes from the FORM team +const safeOwners: ChainMap
= { + ethereum: '0xec5ad23e29203301B2C1a765718Cc1de7A8d3FbF', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getEthereumFormUSDCWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(safeOwners.ethereum), + type: TokenType.collateral, + token: tokens.ethereum.USDC, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + // FiatTokenProxy 0xFBf489bb4783D4B1B2e7D07ba39873Fb8068507D + // MasterMinter 0x9Dec8Dfafcce2d45E8FF8C7792DB1D704AB1dc9D + const form: HypTokenRouterConfig = { + ...routerConfig.form, + ...getOwnerConfigForAddress(safeOwners.form), + type: TokenType.collateralFiat, + token: '0xFBf489bb4783D4B1B2e7D07ba39873Fb8068507D', + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + form, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.ts new file mode 100644 index 0000000000..aa8bd4013a --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.ts @@ -0,0 +1,40 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +// Safes from the FORM team +const safeOwners: ChainMap
= { + ethereum: '0xec5ad23e29203301B2C1a765718Cc1de7A8d3FbF', + form: '0x41B624412B529409A437f08Ef80bCabE81053650', +}; + +export const getEthereumFormUSDTWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const ethereum: HypTokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(safeOwners.ethereum), + type: TokenType.collateral, + token: tokens.ethereum.USDT, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const form: HypTokenRouterConfig = { + ...routerConfig.form, + ...getOwnerConfigForAddress(safeOwners.form), + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + form, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 97655e7c6b..3c86014b4c 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -43,6 +43,8 @@ export enum WarpRouteIds { ArbitrumBaseBlastBscEthereumGnosisLiskMantleModeOptimismPolygonScrollZeroNetworkZoraMainnet = 'ETH/arbitrum-base-blast-bsc-ethereum-gnosis-lisk-mantle-mode-optimism-polygon-scroll-zeronetwork-zoramainnet', AppchainBaseUSDC = 'USDC/appchain-base', BobaBsquaredSwellUBTC = 'UBTC/boba-bsquared-swell', + EthereumFormUSDT = 'USDT/ethereum-form', + EthereumFormUSDC = 'USDC/ethereum-form', EthereumSuperseedUSDT = 'USDT/ethereum-superseed', OptimismSuperseedOP = 'OP/optimism-superseed', EthereumZircuitRstETH = 'rstETH/ethereum-zircuit', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index e15ec37e71..f01ea7edc5 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -33,6 +33,8 @@ import { getEclipseStrideTiaWarpConfig } from './environments/mainnet3/warp/conf import { getEclipseStrideStTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.js'; import { getEthereumBscLUMIAWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.js'; import { getEthereumFlowCbBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.js'; +import { getEthereumFormUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormUSDCWarpConfig.js'; +import { getEthereumFormUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormUSDTWarpConfig.js'; import { getEthereumFormWBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormWBTCWarpConfig.js'; import { getEthereumFormWSTETHWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFormWSTETHWarpConfig.js'; import { getEthereumInevmUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.js'; @@ -100,6 +102,8 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.AppchainBaseUSDC]: getAppChainBaseUSDCWarpConfig, [WarpRouteIds.BobaBsquaredSwellUBTC]: getBobaBsquaredSwellUBTCWarpConfig, [WarpRouteIds.EthereumZircuitRe7LRT]: getEthereumZircuitRe7LRTWarpConfig, + [WarpRouteIds.EthereumFormUSDT]: getEthereumFormUSDTWarpConfig, + [WarpRouteIds.EthereumFormUSDC]: getEthereumFormUSDCWarpConfig, [WarpRouteIds.EthereumSuperseedUSDT]: getEthereumSuperseedUSDTConfig, [WarpRouteIds.OptimismSuperseedOP]: getOptimismSuperseedOPConfig, [WarpRouteIds.EthereumZircuitRstETH]: getEthereumZircuitRstETHWarpConfig, diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 830e8f3e81..42d3b957c2 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '98f8c26-20250110-182641', + tag: '702c800-20250113-210127', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From aad2c2d1ed79364703a7e93daa2171c73a02a312 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion <131957285+ljankovic-txfusion@users.noreply.github.com> Date: Wed, 15 Jan 2025 01:51:02 +0100 Subject: [PATCH 68/81] fix(cli): missing single chain resolver (#5156) ### Description - Removed `SingleChainResolver` in favor of a single MultiChainResolver class - Fixed chain resolution logic to properly handle: - Single chain selection via `argv.chain` - Multiple chain selection via `argv.chains` - Added proper handling for empty chain arrays to prevent unexpected behavior ### Drive-by changes ### Related issues None ### Backward compatibility Yes ### Testing Manual --------- Co-authored-by: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Co-authored-by: mshojaei-txfusion <138107084+mshojaei-txfusion@users.noreply.github.com> --- .changeset/violet-knives-drop.md | 5 ++++ .../strategies/chain/MultiChainResolver.ts | 14 +++++++---- .../strategies/chain/SingleChainResolver.ts | 25 ------------------- 3 files changed, 14 insertions(+), 30 deletions(-) create mode 100644 .changeset/violet-knives-drop.md delete mode 100644 typescript/cli/src/context/strategies/chain/SingleChainResolver.ts diff --git a/.changeset/violet-knives-drop.md b/.changeset/violet-knives-drop.md new file mode 100644 index 0000000000..24320605a0 --- /dev/null +++ b/.changeset/violet-knives-drop.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Fixing the chain resolver checks and handling for argv.chain diff --git a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts index 8563e9e5d9..2bdd6f3d1a 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts @@ -138,16 +138,20 @@ export class MultiChainResolver implements ChainResolver { chains.push(argv.destination); } - if (!argv.chains) { - return Array.from( - new Set([...chains, ...this.getEvmChains(multiProvider)]), - ); + if (argv.chain) { + chains.push(argv.chain); + } + + if (!argv.chains && chains.length === 0) { + return Array.from(this.getEvmChains(multiProvider)); } return Array.from( new Set([ ...chains, - ...argv.chains.split(',').map((item: string) => item.trim()), + ...(argv.chains + ? argv.chains.split(',').map((item: string) => item.trim()) + : []), ]), ); } diff --git a/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts b/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts deleted file mode 100644 index 8dddaf3c4a..0000000000 --- a/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ChainMap, ChainName } from '@hyperlane-xyz/sdk'; - -import { runSingleChainSelectionStep } from '../../../utils/chains.js'; - -import { ChainResolver } from './types.js'; - -/** - * @title SingleChainResolver - * @notice Strategy implementation for managing single-chain operations - * @dev Primarily used for operations like 'core:apply' and 'warp:read' - */ -export class SingleChainResolver implements ChainResolver { - /** - * @notice Determines the chain to be used for signing operations - * @dev Either uses the chain specified in argv or prompts for interactive selection - */ - async resolveChains(argv: ChainMap): Promise { - argv.chain ||= await runSingleChainSelectionStep( - argv.context.chainMetadata, - 'Select chain to connect:', - ); - - return [argv.chain]; // Explicitly return as single-item array - } -} From 28becff74f8b98ca87244050a2e5875d4c38bc34 Mon Sep 17 00:00:00 2001 From: Jason Guo <33064781+Xaroz@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:05:09 -0600 Subject: [PATCH 69/81] feat: artela-base warp route configs (#5169) ### Description - Add `USDC/artela-base` warp route config - Add `WETH/artela-base` warp route config [Related registry PR](https://github.com/hyperlane-xyz/hyperlane-registry/pull/488) ### Drive-by changes No ### Related issues ### Backward compatibility Yes ### Testing CLI --- .changeset/flat-lamps-deliver.md | 5 +++ .registryrc | 2 +- rust/main/config/mainnet_config.json | 2 +- .../getArtelaBaseUSDCWarpConfig.ts | 38 +++++++++++++++++++ .../getArtelaBaseWETHWarpConfig.ts | 38 +++++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 2 + typescript/infra/config/warp.ts | 4 ++ typescript/infra/src/config/warp.ts | 1 + typescript/infra/src/warp/helm.ts | 2 +- 9 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 .changeset/flat-lamps-deliver.md create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseUSDCWarpConfig.ts create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.ts diff --git a/.changeset/flat-lamps-deliver.md b/.changeset/flat-lamps-deliver.md new file mode 100644 index 0000000000..bca1b390b8 --- /dev/null +++ b/.changeset/flat-lamps-deliver.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/infra': minor +--- + +Add Artela/Base USDC and WETH warp route config diff --git a/.registryrc b/.registryrc index 001391d9ac..1cc1eb1ad9 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -195c073c3c34b234c8d0aed2a16962a2d3945354 +47aba98bdd78ecb5a3f756dca6dc2e28325bab43 diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 4aa9b27a4b..bc430715e1 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -7372,7 +7372,7 @@ "blockExplorers": [ { "apiUrl": "https://artscan.artela.network/api", - "family": "other", + "family": "blockscout", "name": "Artela Explorer", "url": "https://artscan.artela.network" } diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseUSDCWarpConfig.ts new file mode 100644 index 0000000000..43f1238608 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseUSDCWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const artelaOwner = '0x801e8135867D65e742eb070A9fC0aD9c2f69B4cd'; +const baseOwner = '0x801e8135867D65e742eb070A9fC0aD9c2f69B4cd'; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getArtelaBaseUSDCWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const artela: HypTokenRouterConfig = { + ...routerConfig.artela, + owner: artelaOwner, + type: TokenType.synthetic, + symbol: 'USDC.a', + interchainSecurityModule: ISM_CONFIG, + }; + + const base: HypTokenRouterConfig = { + ...routerConfig.base, + owner: baseOwner, + type: TokenType.collateral, + token: tokens.base.USDC, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + artela, + base, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.ts new file mode 100644 index 0000000000..06756c06e4 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers'; + +import { ChainMap, HypTokenRouterConfig, TokenType } from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +const artelaOwner = '0x801e8135867D65e742eb070A9fC0aD9c2f69B4cd'; +const baseOwner = '0x801e8135867D65e742eb070A9fC0aD9c2f69B4cd'; + +const ISM_CONFIG = ethers.constants.AddressZero; // Default ISM + +export const getArtelaBaseWETHWarpConfig = async ( + routerConfig: ChainMap, +): Promise> => { + const artela: HypTokenRouterConfig = { + ...routerConfig.artela, + owner: artelaOwner, + type: TokenType.synthetic, + symbol: 'WETH.a', + interchainSecurityModule: ISM_CONFIG, + }; + + const base: HypTokenRouterConfig = { + ...routerConfig.base, + owner: baseOwner, + type: TokenType.collateral, + token: tokens.base.WETH, + interchainSecurityModule: ISM_CONFIG, + }; + + return { + artela, + base, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 3c86014b4c..00e8dbd882 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -52,6 +52,8 @@ export enum WarpRouteIds { EthereumFormWSTETH = 'WSTETH/ethereum-form', BaseFormAIXBT = 'AIXBT/base-form', BaseFormGAME = 'GAME/base-form', + ArtelaBaseUSDC = 'USDC/artela-base', + ArtelaBaseWETH = 'WETH/artela-base', SolanaSoonBonk = 'Bonk/solanamainnet-soon', SolanaSoonSOL = 'SOL/solanamainnet-soon', } diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index f01ea7edc5..05cc0bf9ad 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -20,6 +20,8 @@ import { getArbitrumEthereumMantleModePolygonScrollZeroNetworkUSDTWarpConfig } f import { getArbitrumEthereumZircuitAmphrETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.js'; import { getArbitrumNeutronEclipWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.js'; import { getArbitrumNeutronTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.js'; +import { getArtelaBaseUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getArtelaBaseUSDCWarpConfig.js'; +import { getArtelaBaseWETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.js'; import { getBaseFormAIXBTWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.js'; import { getBaseFormGAMEWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.js'; import { getBaseZeroNetworkCBBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseZeroNetworkCBBTCWarpConfig.js'; @@ -111,6 +113,8 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.EthereumFormWSTETH]: getEthereumFormWSTETHWarpConfig, [WarpRouteIds.BaseFormAIXBT]: getBaseFormAIXBTWarpConfig, [WarpRouteIds.BaseFormGAME]: getBaseFormGAMEWarpConfig, + [WarpRouteIds.ArtelaBaseUSDC]: getArtelaBaseUSDCWarpConfig, + [WarpRouteIds.ArtelaBaseWETH]: getArtelaBaseWETHWarpConfig, }; export async function getWarpConfig( diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 1660b54dd9..8ff0b53554 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -26,6 +26,7 @@ export const tokens: ChainMap> = { USDC: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', AIXBT: '0x4F9Fd6Be4a90f2620860d680c0d4d5Fb53d1A825', GAME: '0x1C4CcA7C5DB003824208aDDA61Bd749e55F463a3', + WETH: '0x4200000000000000000000000000000000000006', }, bsquared: { uBTC: '0x796e4D53067FF374B89b2Ac101ce0c1f72ccaAc2', diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 42d3b957c2..5ef21a3f3b 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '702c800-20250113-210127', + tag: 'b18ab47-20250114-203624', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From d7813104d15e2653163919aac348042a090396d9 Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Wed, 15 Jan 2025 11:19:50 +0000 Subject: [PATCH 70/81] feat: Add logging to agents (#5167) ### Description Add logging to agents * When an agent start * When cursor indexing task is exiting * When cursor sync method is exiting ### Related issues - Contributes into https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/5098 ### Backward compatibility Yes ### Testing E2E tests --------- Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> --- rust/main/Cargo.lock | 12 ++++---- rust/main/agents/relayer/src/main.rs | 3 ++ rust/main/agents/relayer/src/relayer.rs | 28 +++++++++---------- rust/main/agents/scraper/src/main.rs | 3 ++ rust/main/agents/validator/src/main.rs | 3 ++ rust/main/agents/validator/src/validator.rs | 8 +++--- rust/main/hyperlane-base/src/agent.rs | 3 ++ .../hyperlane-base/src/contract_sync/mod.rs | 10 +++++++ 8 files changed, 46 insertions(+), 24 deletions(-) diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index aea92da917..6a6f44e6c9 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -5264,9 +5264,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" @@ -9838,9 +9838,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -9867,9 +9867,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", diff --git a/rust/main/agents/relayer/src/main.rs b/rust/main/agents/relayer/src/main.rs index f9ac628aca..b00ca8dade 100644 --- a/rust/main/agents/relayer/src/main.rs +++ b/rust/main/agents/relayer/src/main.rs @@ -18,6 +18,9 @@ mod memory_profiler; #[tokio::main(flavor = "multi_thread", worker_threads = 20)] async fn main() -> Result<()> { + // Logging is not initialised at this point, so, using `println!` + println!("Relayer starting up..."); + let agent_main_fut = agent_main::(); #[cfg(feature = "memory-profiling")] diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index b1f013b6ae..d91117c1d7 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -465,11 +465,11 @@ impl Relayer { return tokio::spawn(async {}).instrument(info_span!("MessageSync")); } }; + let origin_name = origin.name().to_string(); tokio::spawn(TaskMonitor::instrument(&task_monitor, async move { - contract_sync - .clone() - .sync("dispatched_messages", cursor.into()) - .await + let label = "dispatched_messages"; + contract_sync.clone().sync(label, cursor.into()).await; + info!(chain = origin_name, label, "contract sync task exit"); })) .instrument(info_span!("MessageSync")) } @@ -496,14 +496,14 @@ impl Relayer { return tokio::spawn(async {}).instrument(info_span!("IgpSync")); } }; + let origin_name = origin.name().to_string(); tokio::spawn(TaskMonitor::instrument(&task_monitor, async move { + let label = "gas_payments"; contract_sync .clone() - .sync( - "gas_payments", - SyncOptions::new(Some(cursor), tx_id_receiver), - ) - .await + .sync(label, SyncOptions::new(Some(cursor), tx_id_receiver)) + .await; + info!(chain = origin_name, label, "contract sync task exit"); })) .instrument(info_span!("IgpSync")) } @@ -526,14 +526,14 @@ impl Relayer { return tokio::spawn(async {}).instrument(info_span!("MerkleTreeHookSync")); } }; + let origin_name = origin.name().to_string(); tokio::spawn(TaskMonitor::instrument(&task_monitor, async move { + let label = "merkle_tree_hook"; contract_sync .clone() - .sync( - "merkle_tree_hook", - SyncOptions::new(Some(cursor), tx_id_receiver), - ) - .await + .sync(label, SyncOptions::new(Some(cursor), tx_id_receiver)) + .await; + info!(chain = origin_name, label, "contract sync task exit"); })) .instrument(info_span!("MerkleTreeHookSync")) } diff --git a/rust/main/agents/scraper/src/main.rs b/rust/main/agents/scraper/src/main.rs index f9b0d5971f..f09297cde6 100644 --- a/rust/main/agents/scraper/src/main.rs +++ b/rust/main/agents/scraper/src/main.rs @@ -26,5 +26,8 @@ mod store; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<()> { + // Logging is not initialised at this point, so, using `println!` + println!("Scraper agent starting up..."); + agent_main::().await } diff --git a/rust/main/agents/validator/src/main.rs b/rust/main/agents/validator/src/main.rs index ebc24974c2..14056046e0 100644 --- a/rust/main/agents/validator/src/main.rs +++ b/rust/main/agents/validator/src/main.rs @@ -16,5 +16,8 @@ mod validator; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<()> { + // Logging is not initialised at this point, so, using `println!` + println!("Validator starting up..."); + agent_main::().await } diff --git a/rust/main/agents/validator/src/validator.rs b/rust/main/agents/validator/src/validator.rs index f7a8b43f59..f599fa8e39 100644 --- a/rust/main/agents/validator/src/validator.rs +++ b/rust/main/agents/validator/src/validator.rs @@ -228,11 +228,11 @@ impl Validator { self.origin_chain ) }); + let origin = self.origin_chain.name().to_string(); tokio::spawn(async move { - contract_sync - .clone() - .sync("merkle_tree_hook", cursor.into()) - .await; + let label = "merkle_tree_hook"; + contract_sync.clone().sync(label, cursor.into()).await; + info!(chain = origin, label, "contract sync task exit"); }) .instrument(info_span!("MerkleTreeHookSyncer")) } diff --git a/rust/main/hyperlane-base/src/agent.rs b/rust/main/hyperlane-base/src/agent.rs index 5ee00c1eb9..87ad60f46c 100644 --- a/rust/main/hyperlane-base/src/agent.rs +++ b/rust/main/hyperlane-base/src/agent.rs @@ -80,6 +80,9 @@ pub async fn agent_main() -> Result<()> { // the variable defaults to "VERGEN_IDEMPOTENT_OUTPUT". let git_sha = env!("VERGEN_GIT_SHA").to_owned(); + // Logging is not initialised at this point, so, using `println!` + println!("Agent {} starting up with version {git_sha}", A::AGENT_NAME); + let agent_metadata = AgentMetadata::new(git_sha); let settings = A::Settings::load()?; diff --git a/rust/main/hyperlane-base/src/contract_sync/mod.rs b/rust/main/hyperlane-base/src/contract_sync/mod.rs index c9048b4808..26f6c9d673 100644 --- a/rust/main/hyperlane-base/src/contract_sync/mod.rs +++ b/rust/main/hyperlane-base/src/contract_sync/mod.rs @@ -107,7 +107,17 @@ where self.fetch_logs_with_cursor(cursor, &stored_logs_metric, &indexed_height_metric) .await; } + + // Added so that we confuse compiler that it is an infinite loop + if false { + break; + } } + + // Although the above loop should never end (unless by panicking), + // we put log here to make sure that we see when this method returns normally. + // Hopefully, compiler will not optimise this code out. + info!(chain = chain_name, label, "contract sync loop exit"); } #[instrument(fields(domain=self.domain().name()), skip(self, recv, stored_logs_metric))] From af0dd49a677c86e043e6d720431be07a9936932d Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Wed, 15 Jan 2025 11:56:33 +0000 Subject: [PATCH 71/81] chore: re-enable Neutron scraping (#5179) ### Description - The chain is back, scraping it again now after its removal in #5165 ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- typescript/infra/config/environments/mainnet3/agent.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index d143d5849c..d2bf764c7c 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -374,8 +374,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< moonbeam: true, morph: true, nero: true, - // Jan 14th - temporarily disabled while Neutron chain is down and RPCs give issues, causing scraper startup problems - neutron: false, + neutron: true, oortmainnet: true, optimism: true, orderly: true, From c47511b0d86a9d06e90aaa0c8432e802bf7f223f Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 15 Jan 2025 22:18:00 +0800 Subject: [PATCH 72/81] feat: don't crash relayer due to flaky RPCs (#5115) ### Description - instead of crashing relayer if any RPC calls fail during `build_mailboxes` and `build_validator_announces`, we just log the error and metric - relayer will continue running without those chains ### Drive-by changes ### Related issues Fixes https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/4887 ### Backward compatibility Are these changes backward compatible? Are there any infrastructure implications, e.g. changes that would prohibit deploying older commits using this infra tooling? Yes ### Testing Added unittests to test ensure functions run correctly and log errors in metrics --------- Co-authored-by: Danil Nemirovsky Co-authored-by: Trevor Porter --- rust/main/Cargo.lock | 2 + rust/main/agents/relayer/Cargo.toml | 2 + rust/main/agents/relayer/src/relayer.rs | 297 +++++++++++++++++- rust/main/agents/relayer/src/settings/mod.rs | 2 +- .../src/metrics/agent_metrics.rs | 2 +- rust/main/hyperlane-base/src/settings/base.rs | 12 +- 6 files changed, 295 insertions(+), 22 deletions(-) diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index 6a6f44e6c9..da153bf564 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -7101,6 +7101,7 @@ dependencies = [ "dhat", "ethers", "ethers-contract", + "ethers-prometheus", "eyre", "futures", "futures-util", @@ -7126,6 +7127,7 @@ dependencies = [ "tokio-test", "tracing", "tracing-futures", + "tracing-test", "typetag", ] diff --git a/rust/main/agents/relayer/Cargo.toml b/rust/main/agents/relayer/Cargo.toml index 5a891d912c..ac0e198945 100644 --- a/rust/main/agents/relayer/Cargo.toml +++ b/rust/main/agents/relayer/Cargo.toml @@ -56,9 +56,11 @@ hyperlane-ethereum = { path = "../../chains/hyperlane-ethereum" } once_cell.workspace = true mockall.workspace = true tokio-test.workspace = true +tracing-test.workspace = true hyperlane-test = { path = "../../hyperlane-test" } hyperlane-base = { path = "../../hyperlane-base", features = ["test-utils"] } hyperlane-core = { path = "../../hyperlane-core", features = ["agent", "async", "test-utils"] } +ethers-prometheus = { path = "../../ethers-prometheus", features = ["serde"] } [features] default = ["color-eyre", "oneline-errors"] diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index d91117c1d7..e05549fb61 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -18,8 +18,8 @@ use hyperlane_base::{ }; use hyperlane_core::{ rpc_clients::call_and_retry_n_times, ChainCommunicationError, ContractSyncCursor, - HyperlaneDomain, HyperlaneMessage, InterchainGasPayment, MerkleTreeInsertion, QueueOperation, - H512, U256, + HyperlaneDomain, HyperlaneMessage, InterchainGasPayment, Mailbox, MerkleTreeInsertion, + QueueOperation, ValidatorAnnounce, H512, U256, }; use tokio::{ sync::{ @@ -135,12 +135,10 @@ impl BaseAgent for Relayer { .map(|origin| (origin.clone(), HyperlaneRocksDB::new(origin, db.clone()))) .collect::>(); - let mailboxes = settings - .build_mailboxes(settings.destination_chains.iter(), &core_metrics) - .await?; - let validator_announces = settings - .build_validator_announces(settings.origin_chains.iter(), &core_metrics) - .await?; + let mailboxes = Self::build_mailboxes(&settings, &core_metrics, &chain_metrics).await; + + let validator_announces = + Self::build_validator_announces(&settings, &core_metrics, &chain_metrics).await; let contract_sync_metrics = Arc::new(ContractSyncMetrics::new(&core_metrics)); @@ -236,7 +234,9 @@ impl BaseAgent for Relayer { let mut msg_ctxs = HashMap::new(); let mut destination_chains = HashMap::new(); - for destination in &settings.destination_chains { + + // only iterate through destination chains that were successfully instantiated + for (destination, dest_mailbox) in mailboxes.iter() { let destination_chain_setup = core.settings.chain_setup(destination).unwrap().clone(); destination_chains.insert(destination.clone(), destination_chain_setup.clone()); let transaction_gas_limit: Option = @@ -246,18 +246,19 @@ impl BaseAgent for Relayer { transaction_gas_limit }; - for origin in &settings.origin_chains { + // only iterate through origin chains that were successfully instantiated + for (origin, validator_announce) in validator_announces.iter() { let db = dbs.get(origin).unwrap().clone(); let metadata_builder = BaseMetadataBuilder::new( origin.clone(), destination_chain_setup.clone(), prover_syncs[origin].clone(), - validator_announces[origin].clone(), + validator_announce.clone(), settings.allow_local_checkpoint_syncers, core.metrics.clone(), db, IsmAwareAppContextClassifier::new( - mailboxes[destination].clone(), + dest_mailbox.clone(), settings.metric_app_contexts.clone(), ), ); @@ -268,7 +269,7 @@ impl BaseAgent for Relayer { destination: destination.id(), }, Arc::new(MessageContext { - destination_mailbox: mailboxes[destination].clone(), + destination_mailbox: dest_mailbox.clone(), origin_db: dbs.get(origin).unwrap().clone(), metadata_builder: Arc::new(metadata_builder), origin_gas_payment_enforcer: gas_payment_enforcers[origin].clone(), @@ -620,7 +621,275 @@ impl Relayer { })) .instrument(span) } + + /// Helper function to build and return a hashmap of mailboxes. + /// Any chains that fail to build mailbox will not be included + /// in the hashmap. Errors will be logged and chain metrics + /// will be updated for chains that fail to build mailbox. + pub async fn build_mailboxes( + settings: &RelayerSettings, + core_metrics: &CoreMetrics, + chain_metrics: &ChainMetrics, + ) -> HashMap> { + settings + .build_mailboxes(settings.destination_chains.iter(), core_metrics) + .await + .into_iter() + .filter_map(|(origin, mailbox_res)| match mailbox_res { + Ok(mailbox) => Some((origin, mailbox)), + Err(err) => { + error!(?err, origin=?origin, "Critical error when building mailbox"); + chain_metrics.set_critical_error(origin.name(), true); + None + } + }) + .collect() + } + + /// Helper function to build and return a hashmap of validator announces. + /// Any chains that fail to build validator announce will not be included + /// in the hashmap. Errors will be logged and chain metrics + /// will be updated for chains that fail to build validator announce. + pub async fn build_validator_announces( + settings: &RelayerSettings, + core_metrics: &CoreMetrics, + chain_metrics: &ChainMetrics, + ) -> HashMap> { + settings + .build_validator_announces(settings.origin_chains.iter(), core_metrics) + .await + .into_iter() + .filter_map(|(origin, mailbox_res)| match mailbox_res { + Ok(mailbox) => Some((origin, mailbox)), + Err(err) => { + error!(?err, origin=?origin, "Critical error when building validator announce"); + chain_metrics.set_critical_error(origin.name(), true); + None + } + }) + .collect() + } } #[cfg(test)] -mod test {} +mod test { + use std::{ + collections::{HashMap, HashSet}, + path::PathBuf, + }; + + use crate::settings::{matching_list::MatchingList, RelayerSettings}; + use ethers::utils::hex; + use ethers_prometheus::middleware::PrometheusMiddlewareConf; + use hyperlane_base::{ + settings::{ + ChainConf, ChainConnectionConf, CoreContractAddresses, IndexSettings, Settings, + TracingConfig, + }, + ChainMetrics, CoreMetrics, BLOCK_HEIGHT_HELP, BLOCK_HEIGHT_LABELS, CRITICAL_ERROR_HELP, + CRITICAL_ERROR_LABELS, + }; + use hyperlane_core::{ + config::OperationBatchConfig, HyperlaneDomain, IndexMode, KnownHyperlaneDomain, + ReorgPeriod, H256, + }; + use hyperlane_ethereum as h_eth; + use prometheus::{opts, IntGaugeVec, Registry}; + use reqwest::Url; + + use super::Relayer; + + /// Builds a test RelayerSetting + fn generate_test_relayer_settings() -> RelayerSettings { + let chains = [( + "arbitrum".to_string(), + ChainConf { + domain: HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum), + signer: None, + reorg_period: ReorgPeriod::None, + addresses: CoreContractAddresses { + mailbox: H256::from_slice( + hex::decode( + "000000000000000000000000598facE78a4302f11E3de0bee1894Da0b2Cb71F8", + ) + .unwrap() + .as_slice(), + ), + interchain_gas_paymaster: H256::from_slice( + hex::decode( + "000000000000000000000000c756cFc1b7d0d4646589EDf10eD54b201237F5e8", + ) + .unwrap() + .as_slice(), + ), + validator_announce: H256::from_slice( + hex::decode( + "0000000000000000000000001b33611fCc073aB0737011d5512EF673Bff74962", + ) + .unwrap() + .as_slice(), + ), + merkle_tree_hook: H256::from_slice( + hex::decode( + "000000000000000000000000AD34A66Bf6dB18E858F6B686557075568c6E031C", + ) + .unwrap() + .as_slice(), + ), + }, + connection: ChainConnectionConf::Ethereum(h_eth::ConnectionConf { + rpc_connection: h_eth::RpcConnectionConf::Http { + url: Url::parse("https://sepolia-rollup.arbitrum.io/rpc").unwrap(), + }, + transaction_overrides: h_eth::TransactionOverrides { + gas_price: None, + gas_limit: None, + max_fee_per_gas: None, + max_priority_fee_per_gas: None, + }, + operation_batch: OperationBatchConfig { + batch_contract_address: None, + max_batch_size: 1, + }, + }), + metrics_conf: PrometheusMiddlewareConf { + contracts: HashMap::new(), + chain: None, + }, + index: IndexSettings { + from: 0, + chunk_size: 1, + mode: IndexMode::Block, + }, + }, + )]; + + RelayerSettings { + base: Settings { + chains: chains.into_iter().collect(), + metrics_port: 5000, + tracing: TracingConfig::default(), + }, + db: PathBuf::new(), + origin_chains: [ + HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum), + HyperlaneDomain::Known(KnownHyperlaneDomain::Ethereum), + HyperlaneDomain::Known(KnownHyperlaneDomain::Optimism), + ] + .into_iter() + .collect(), + destination_chains: [ + HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum), + HyperlaneDomain::Known(KnownHyperlaneDomain::Ethereum), + HyperlaneDomain::Known(KnownHyperlaneDomain::Optimism), + ] + .into_iter() + .collect(), + gas_payment_enforcement: Vec::new(), + whitelist: MatchingList::default(), + blacklist: MatchingList::default(), + address_blacklist: Vec::new(), + transaction_gas_limit: None, + skip_transaction_gas_limit_for: HashSet::new(), + allow_local_checkpoint_syncers: true, + metric_app_contexts: Vec::new(), + } + } + + #[tokio::test] + #[tracing_test::traced_test] + async fn test_failed_build_mailboxes() { + let settings = generate_test_relayer_settings(); + + let registry = Registry::new(); + let core_metrics = CoreMetrics::new("relayer", 4000, registry).unwrap(); + let chain_metrics = ChainMetrics { + block_height: IntGaugeVec::new( + opts!("block_height", BLOCK_HEIGHT_HELP), + BLOCK_HEIGHT_LABELS, + ) + .unwrap(), + gas_price: None, + critical_error: IntGaugeVec::new( + opts!("critical_error", CRITICAL_ERROR_HELP), + CRITICAL_ERROR_LABELS, + ) + .unwrap(), + }; + + let mailboxes = Relayer::build_mailboxes(&settings, &core_metrics, &chain_metrics).await; + + assert_eq!(mailboxes.len(), 1); + assert!(mailboxes.contains_key(&HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum))); + + // Arbitrum chain should not have any errors because it's ChainConf exists + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["arbitrum"]) + .unwrap(); + assert_eq!(metric.get(), 0); + + // Ethereum chain should error because it is missing ChainConf + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["ethereum"]) + .unwrap(); + assert_eq!(metric.get(), 1); + + // Optimism chain should error because it is missing ChainConf + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["optimism"]) + .unwrap(); + assert_eq!(metric.get(), 1); + } + + #[tokio::test] + #[tracing_test::traced_test] + async fn test_failed_build_validator_announces() { + let settings = generate_test_relayer_settings(); + + let registry = Registry::new(); + let core_metrics = CoreMetrics::new("relayer", 4000, registry).unwrap(); + let chain_metrics = ChainMetrics { + block_height: IntGaugeVec::new( + opts!("block_height", BLOCK_HEIGHT_HELP), + BLOCK_HEIGHT_LABELS, + ) + .unwrap(), + gas_price: None, + critical_error: IntGaugeVec::new( + opts!("critical_error", CRITICAL_ERROR_HELP), + CRITICAL_ERROR_LABELS, + ) + .unwrap(), + }; + + let mailboxes = + Relayer::build_validator_announces(&settings, &core_metrics, &chain_metrics).await; + + assert_eq!(mailboxes.len(), 1); + assert!(mailboxes.contains_key(&HyperlaneDomain::Known(KnownHyperlaneDomain::Arbitrum))); + + // Arbitrum chain should not have any errors because it's ChainConf exists + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["arbitrum"]) + .unwrap(); + assert_eq!(metric.get(), 0); + + // Ethereum chain should error because it is missing ChainConf + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["ethereum"]) + .unwrap(); + assert_eq!(metric.get(), 1); + + // Optimism chain should error because it is missing ChainConf + let metric = chain_metrics + .critical_error + .get_metric_with_label_values(&["optimism"]) + .unwrap(); + assert_eq!(metric.get(), 1); + } +} diff --git a/rust/main/agents/relayer/src/settings/mod.rs b/rust/main/agents/relayer/src/settings/mod.rs index 2d3d9375de..a8a5c1ca4c 100644 --- a/rust/main/agents/relayer/src/settings/mod.rs +++ b/rust/main/agents/relayer/src/settings/mod.rs @@ -33,7 +33,7 @@ pub struct RelayerSettings { #[as_mut] #[deref] #[deref_mut] - base: Settings, + pub base: Settings, /// Database path pub db: PathBuf, diff --git a/rust/main/hyperlane-base/src/metrics/agent_metrics.rs b/rust/main/hyperlane-base/src/metrics/agent_metrics.rs index ad1320488f..2f4862d4aa 100644 --- a/rust/main/hyperlane-base/src/metrics/agent_metrics.rs +++ b/rust/main/hyperlane-base/src/metrics/agent_metrics.rs @@ -94,7 +94,7 @@ pub struct ChainMetrics { pub gas_price: Option, /// Boolean marker for critical errors on a chain, signalling loss of liveness. - critical_error: IntGaugeVec, + pub critical_error: IntGaugeVec, } impl ChainMetrics { diff --git a/rust/main/hyperlane-base/src/settings/base.rs b/rust/main/hyperlane-base/src/settings/base.rs index 7024d67cc6..d298a3c94f 100644 --- a/rust/main/hyperlane-base/src/settings/base.rs +++ b/rust/main/hyperlane-base/src/settings/base.rs @@ -1,9 +1,9 @@ use std::{collections::HashMap, fmt::Debug, hash::Hash, sync::Arc}; use eyre::{eyre, Context, Result}; -use futures_util::future::try_join_all; +use futures_util::future::join_all; use hyperlane_core::{ - HyperlaneChain, HyperlaneDomain, HyperlaneLogStore, HyperlaneProvider, + HyperlaneDomain, HyperlaneLogStore, HyperlaneProvider, HyperlaneSequenceAwareIndexerStoreReader, HyperlaneWatermarkedLogStore, InterchainGasPaymaster, Mailbox, MerkleTreeHook, MultisigIsm, SequenceAwareIndexer, ValidatorAnnounce, H256, }; @@ -132,11 +132,11 @@ macro_rules! build_contract_fns { &self, domains: impl Iterator, metrics: &CoreMetrics, - ) -> Result>> { - try_join_all(domains.map(|d| self.$singular(d, metrics))) - .await? + ) -> HashMap>> { + join_all(domains.map(|d| async { (d.clone(), self.$singular(d, metrics).await) })) + .await .into_iter() - .map(|i| Ok((i.domain().clone(), Arc::from(i)))) + .map(|(d, future)| (d, future.map(|f| Arc::from(f)))) .collect() } }; From 9eb19cac7a382a5bc1c9b88ebd52f1ec90330839 Mon Sep 17 00:00:00 2001 From: Jason Guo <33064781+Xaroz@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:13:26 -0600 Subject: [PATCH 73/81] feat: explorer link in cli logs (#5170) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Add link to explorer message for hyperlane CLI `warp send` and `send message` commands ### Drive-by changes No ### Related issues ### Backward compatibility Yes ### Testing CLI send message command: ![Screenshot 2025-01-14 at 3 30 51 PM](https://github.com/user-attachments/assets/dac9a9ae-0b19-43a2-8d12-6c15551a1b50) warp send command: ![Screenshot 2025-01-14 at 3 32 32 PM](https://github.com/user-attachments/assets/afb114fd-9397-40bd-a29a-3d6e07f5938d) --- .changeset/three-walls-count.md | 5 +++++ typescript/cli/src/consts.ts | 1 + typescript/cli/src/send/message.ts | 3 ++- typescript/cli/src/send/transfer.ts | 3 ++- 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 .changeset/three-walls-count.md diff --git a/.changeset/three-walls-count.md b/.changeset/three-walls-count.md new file mode 100644 index 0000000000..37145b9838 --- /dev/null +++ b/.changeset/three-walls-count.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Add explorer link to warp send and send message commands diff --git a/typescript/cli/src/consts.ts b/typescript/cli/src/consts.ts index 9fb27df9f2..9c931cab26 100644 --- a/typescript/cli/src/consts.ts +++ b/typescript/cli/src/consts.ts @@ -3,3 +3,4 @@ export const MINIMUM_WARP_DEPLOY_GAS = (3e7).toString(); export const MINIMUM_TEST_SEND_GAS = (3e5).toString(); export const MINIMUM_AVS_GAS = (3e6).toString(); export const PROXY_DEPLOYED_URL = 'https://proxy.hyperlane.xyz'; +export const EXPLORER_URL = 'https://explorer.hyperlane.xyz'; diff --git a/typescript/cli/src/send/message.ts b/typescript/cli/src/send/message.ts index e43d08fe2c..b6d75b4e51 100644 --- a/typescript/cli/src/send/message.ts +++ b/typescript/cli/src/send/message.ts @@ -3,7 +3,7 @@ import { stringify as yamlStringify } from 'yaml'; import { ChainName, HyperlaneCore, HyperlaneRelayer } from '@hyperlane-xyz/sdk'; import { addressToBytes32, timeout } from '@hyperlane-xyz/utils'; -import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; +import { EXPLORER_URL, MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { CommandContext, WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; @@ -102,6 +102,7 @@ async function executeDelivery({ ); logBlue(`Sent message from ${origin} to ${recipient} on ${destination}.`); logBlue(`Message ID: ${message.id}`); + logBlue(`Explorer Link: ${EXPLORER_URL}/message/${message.id}`); log(`Message:\n${indentYamlOrJson(yamlStringify(message, null, 2), 4)}`); if (selfRelay) { diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index 8aa4cca59b..1fabc3c853 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -14,7 +14,7 @@ import { } from '@hyperlane-xyz/sdk'; import { parseWarpRouteMessage, timeout } from '@hyperlane-xyz/utils'; -import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; +import { EXPLORER_URL, MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { log, logBlue, logGreen, logRed } from '../logger.js'; @@ -167,6 +167,7 @@ async function executeDelivery({ `Sent transfer from sender (${signerAddress}) on ${origin} to recipient (${recipient}) on ${destination}.`, ); logBlue(`Message ID: ${message.id}`); + logBlue(`Explorer Link: ${EXPLORER_URL}/message/${message.id}`); log(`Message:\n${indentYamlOrJson(yamlStringify(message, null, 2), 4)}`); log(`Body:\n${indentYamlOrJson(yamlStringify(parsed, null, 2), 4)}`); From b9bc57fbaaa06a1fbf9d5193be3b90d49cb8c9c2 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:34:15 +0000 Subject: [PATCH 74/81] chore: retryable errors should still be logged as warnings (#5184) ### Description Retryable errors often indicate that something abnormal is happening (such as we falling back to other providers, which may be causing issues). It's much easier to notice this if the logs are emitted are `warn` level. Non-retryable errors should be logged at `error` level to highlight the relative severity to retryable ones --- rust/main/chains/hyperlane-ethereum/src/rpc_clients/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/mod.rs b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/mod.rs index d7cdb80cd4..375f5cedda 100644 --- a/rust/main/chains/hyperlane-ethereum/src/rpc_clients/mod.rs +++ b/rust/main/chains/hyperlane-ethereum/src/rpc_clients/mod.rs @@ -1,5 +1,5 @@ use ethers::providers::HttpClientError; -use tracing::{info, trace, warn}; +use tracing::{error, info, trace, warn}; pub use self::{fallback::*, provider::*, retrying::*, trait_builder::*}; @@ -86,12 +86,12 @@ fn categorize_client_response( // We don't want to retry errors that are probably not going to work if we keep // retrying them or that indicate an error in higher-order logic and not // transient provider (connection or other) errors. - warn!(error=%e, "Non-retryable JsonRpcError in http provider"); + error!(error=%e, "Non-retryable JsonRpcError in http provider"); NonRetryableErr(JsonRpcError(e)) } else { // the assumption is this is not a "provider error" but rather an invalid // request, e.g. nonce too low, not enough gas, ... - info!(error=%e, "Retryable JsonRpcError in http provider"); + warn!(error=%e, "Retryable JsonRpcError in http provider"); RetryableErr(JsonRpcError(e)) } } From 1536ea57022b3dcee1ae56dc485311c030ec1766 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:36:01 +0000 Subject: [PATCH 75/81] fix: print displayName instead of chain name in cli log (#5185) ### Description fix: print displayName instead of chain name in cli log ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .changeset/green-schools-attack.md | 5 +++++ typescript/cli/src/deploy/utils.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/green-schools-attack.md diff --git a/.changeset/green-schools-attack.md b/.changeset/green-schools-attack.md new file mode 100644 index 0000000000..e795b807f0 --- /dev/null +++ b/.changeset/green-schools-attack.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': patch +--- + +Print displayName instead of chain name in signer validity logs. diff --git a/typescript/cli/src/deploy/utils.ts b/typescript/cli/src/deploy/utils.ts index 0378ab7243..1f11f52596 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -51,7 +51,7 @@ export async function runPreflightChecksForChains({ throw new Error('Only Ethereum chains are supported for now'); const signer = multiProvider.getSigner(chain); assertSigner(signer); - logGreen(`✅ ${chain} signer is valid`); + logGreen(`✅ ${metadata.displayName ?? chain} signer is valid`); } logGreen('✅ Chains are valid'); From 769cec1f93227816b765a3d13d7cc608cc87523f Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Wed, 15 Jan 2025 17:50:22 -0300 Subject: [PATCH 76/81] chore: Add/clarify log in ISM and Hook deployer (#5188) ### Description Since there's currently no other good way to track deployment progress, the Deploy App watches SDK log messages for its progress indicator. This adds a few logs to help it. ### Backward compatibility Yes --- typescript/sdk/src/hook/EvmHookModule.ts | 2 ++ typescript/sdk/src/ism/HyperlaneIsmFactory.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/typescript/sdk/src/hook/EvmHookModule.ts b/typescript/sdk/src/hook/EvmHookModule.ts index eddbb1c788..45235304a6 100644 --- a/typescript/sdk/src/hook/EvmHookModule.ts +++ b/typescript/sdk/src/hook/EvmHookModule.ts @@ -631,6 +631,8 @@ export class EvmHookModule extends HyperlaneModule< ); } + this.logger.debug(`Deploying hook of type ${config.type}`); + switch (config.type) { case HookType.MERKLE_TREE: return this.deployer.deployContract(this.chain, HookType.MERKLE_TREE, [ diff --git a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts index c8c987a5d9..515a2da0a9 100644 --- a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts +++ b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts @@ -131,7 +131,7 @@ export class HyperlaneIsmFactory extends HyperlaneApp { const logger = this.logger.child({ destination, ismType }); logger.debug( - `Deploying ${ismType} to ${destination} ${ + `Deploying ISM of type ${ismType} to ${destination} ${ origin ? `(for verifying ${origin})` : '' }`, ); From 69a684869c44e90d4d2ffaf88b6fad51d97e899f Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 16 Jan 2025 11:10:32 +0000 Subject: [PATCH 77/81] feat: TONY warp deploy, fix CLI warp deploys with non-EVM chains (#5186) ### Description - Deploys TONY - There was an issue with a non-EVM chain being in the warp deploy config. I made the fix but ultimately we should have a unit test to prevent this. Would prefer someone closer to the feature to do this, I just did a band aid fix ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .changeset/real-actors-grow.md | 5 ++ .registryrc | 2 +- .../TONY-base-solanamainnet/program-ids.json | 10 ++++ .../TONY-base-solanamainnet/token-config.json | 17 +++++++ .../signer/MultiProtocolSignerManager.ts | 14 +++++- .../getBaseSolanamainnetTONYWarpConfig.ts | 46 +++++++++++++++++++ .../environments/mainnet3/warp/warpIds.ts | 1 + typescript/infra/config/warp.ts | 2 + typescript/infra/src/config/warp.ts | 1 + typescript/infra/src/warp/helm.ts | 2 +- 10 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 .changeset/real-actors-grow.md create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/token-config.json create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseSolanamainnetTONYWarpConfig.ts diff --git a/.changeset/real-actors-grow.md b/.changeset/real-actors-grow.md new file mode 100644 index 0000000000..b7764b2bc2 --- /dev/null +++ b/.changeset/real-actors-grow.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Don't try to build signers for non-EVM chains in MultiProtocolSignerManager diff --git a/.registryrc b/.registryrc index 1cc1eb1ad9..07fa36dc52 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -47aba98bdd78ecb5a3f756dca6dc2e28325bab43 +5e7227c712cca3d2b576fe7e67a434294fcc0a7f diff --git a/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/program-ids.json new file mode 100644 index 0000000000..a3862b5b63 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/program-ids.json @@ -0,0 +1,10 @@ +{ + "base": { + "hex": "0x00000000000000000000000054624ca8abea68645b3b39211f90b804d53db680", + "base58": "1111111111112BBkkpUZNJgdH8DEmyDxFt74d4bH" + }, + "solanamainnet": { + "hex": "0x2efbd8ff6417a50dbcedc18bab4235d4a2aac61af89214ac59545d30e0f86991", + "base58": "4AQVPTCAeLswnjksQdutxUDuxEJxUBwoWmVimGuPtGSt" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/token-config.json new file mode 100644 index 0000000000..1cc9275f26 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/TONY-base-solanamainnet/token-config.json @@ -0,0 +1,17 @@ +{ + "base": { + "type": "collateral", + "decimals": 18, + "token": "0xb22a793a81ff5b6ad37f40d5fe1e0ac4184d52f3", + "foreignDeployment": "0x54624CA8ABEa68645b3B39211F90B804D53dB680" + }, + "solanamainnet": { + "type": "synthetic", + "decimals": 9, + "remoteDecimals": 18, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "name": "Big Tony", + "symbol": "TONY", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/e95e1d64a0d36c3c69bb09ed4e29acc8350848b6/deployments/warp_routes/TONY/metadata.json" + } +} diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts index f8e411bad1..394e0b1391 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts @@ -6,7 +6,7 @@ import { ChainSubmissionStrategy, MultiProvider, } from '@hyperlane-xyz/sdk'; -import { assert, rootLogger } from '@hyperlane-xyz/utils'; +import { ProtocolType, assert, rootLogger } from '@hyperlane-xyz/utils'; import { ENV } from '../../../utils/env.js'; @@ -48,6 +48,12 @@ export class MultiProtocolSignerManager { */ protected initializeStrategies(): void { for (const chain of this.chains) { + if (this.multiProvider.getProtocol(chain) !== ProtocolType.Ethereum) { + this.logger.debug( + `Skipping signer strategy initialization for non-EVM chain ${chain}`, + ); + continue; + } const strategy = MultiProtocolSignerFactory.getSignerStrategy( chain, this.submissionStrategy, @@ -62,6 +68,12 @@ export class MultiProtocolSignerManager { */ async getMultiProvider(): Promise { for (const chain of this.chains) { + if (this.multiProvider.getProtocol(chain) !== ProtocolType.Ethereum) { + this.logger.debug( + `Skipping signer initialization for non-EVM chain ${chain}`, + ); + continue; + } const signer = await this.initSigner(chain); this.multiProvider.setSigner(chain, signer); } diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseSolanamainnetTONYWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseSolanamainnetTONYWarpConfig.ts new file mode 100644 index 0000000000..dc16268fa7 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getBaseSolanamainnetTONYWarpConfig.ts @@ -0,0 +1,46 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + HypTokenRouterConfig, + OwnableConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + +// Cod3x SAFE +const baseOwner = '0xfEfcb2fb19b9A70B30646Fdc1A0860Eb12F7ff8b'; +// Cod3x Squads vault +const solanamainnetOwner = '7dRAVvdmV3dy4JieuRAirBQ9oSpYaHgmYwupoK5YZcFR'; + +export async function getBaseSolanamainnetTONYWarpConfig( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> { + let base: HypTokenRouterConfig = { + mailbox: routerConfig.base.mailbox, + owner: baseOwner, + type: TokenType.collateral, + token: tokens.base.TONY, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const solanamainnet: HypTokenRouterConfig = { + mailbox: routerConfig.solanamainnet.mailbox, + owner: solanamainnetOwner, + type: TokenType.synthetic, + foreignDeployment: '4AQVPTCAeLswnjksQdutxUDuxEJxUBwoWmVimGuPtGSt', + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + base, + solanamainnet, + }; +} diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 00e8dbd882..98cc569ce4 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -7,6 +7,7 @@ export enum WarpRouteIds { ArbitrumNeutronTIA = 'TIA/arbitrum-neutron', ArbitrumTreasureMAGIC = 'MAGIC/arbitrum-treasure', BscEthereumLumiaPrismPNDR = 'PNDR/bsc-ethereum-lumiaprism', + BaseSolanamainnetTONY = 'TONY/base-solanamainnet', EclipseEthereumApxEth = 'APXETH/eclipsemainnet-ethereum', EclipseEthereumSolanaUSDC = 'USDC/eclipsemainnet-ethereum-solanamainnet', EclipseEthereumSolanaUSDT = 'USDT/eclipsemainnet-ethereum-solanamainnet', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index 05cc0bf9ad..e9a6fc3401 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -24,6 +24,7 @@ import { getArtelaBaseUSDCWarpConfig } from './environments/mainnet3/warp/config import { getArtelaBaseWETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArtelaBaseWETHWarpConfig.js'; import { getBaseFormAIXBTWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormAIXBTWarpConfig.js'; import { getBaseFormGAMEWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseFormGAMEWarpConfig.js'; +import { getBaseSolanamainnetTONYWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseSolanamainnetTONYWarpConfig.js'; import { getBaseZeroNetworkCBBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBaseZeroNetworkCBBTCWarpConfig.js'; import { getBobaBsquaredSwellUBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getBobaBsquaredSwellUBTCWarpConfig.js'; import { getBscEthereumLumiaPrismPNDRWarpConfig } from './environments/mainnet3/warp/configGetters/getBscEthereumLumiaPNDRWarpConfig.js'; @@ -75,6 +76,7 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiSwellTaikoZircuitEZETH]: getRenzoEZETHWarpConfig, [WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig, + [WarpRouteIds.BaseSolanamainnetTONY]: getBaseSolanamainnetTONYWarpConfig, [WarpRouteIds.BscEthereumLumiaPrismPNDR]: getBscEthereumLumiaPrismPNDRWarpConfig, [WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig, diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 8ff0b53554..0954bb71af 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -27,6 +27,7 @@ export const tokens: ChainMap> = { AIXBT: '0x4F9Fd6Be4a90f2620860d680c0d4d5Fb53d1A825', GAME: '0x1C4CcA7C5DB003824208aDDA61Bd749e55F463a3', WETH: '0x4200000000000000000000000000000000000006', + TONY: '0xb22a793a81ff5b6ad37f40d5fe1e0ac4184d52f3', }, bsquared: { uBTC: '0x796e4D53067FF374B89b2Ac101ce0c1f72ccaAc2', diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 5ef21a3f3b..a773d4462a 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -28,7 +28,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'b18ab47-20250114-203624', + tag: '700e53a-20250115-183228', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From b071b3d3d4e1d7298b8860cca9eeb74c4b9b1e50 Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Thu, 16 Jan 2025 11:11:08 +0000 Subject: [PATCH 78/81] fix: Ignore unprocessable message on Magic warp route (#5145) ### Description Ignore unprocessable message on Magic warp route ### Backward compatibility Yes ### Testing Configuration change Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> From a17cbaa22826afccdfaa2a21c168ac699e3c4055 Mon Sep 17 00:00:00 2001 From: Mohammed Hussan Date: Thu, 16 Jan 2025 11:27:10 +0000 Subject: [PATCH 79/81] feat(CI): Use private RPCs for Ethereum and Sepolia env-tests (#5068) ### Description - Add private RPCs for Ethereum and Sepolia env-tests - Support automatic retries for failed env-tests ### Testing Manual --- .github/workflows/test.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f491f8f11..12f8c90f4a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -300,6 +300,8 @@ jobs: env: MAINNET3_ARBITRUM_RPC_URLS: ${{ secrets.MAINNET3_ARBITRUM_RPC_URLS }} MAINNET3_OPTIMISM_RPC_URLS: ${{ secrets.MAINNET3_OPTIMISM_RPC_URLS }} + MAINNET3_ETHEREUM_RPC_URLS: ${{ secrets.MAINNET3_ETHEREUM_RPC_URLS }} + TESTNET4_SEPOLIA_RPC_URLS: ${{ secrets.TESTNET4_SEPOLIA_RPC_URLS }} timeout-minutes: 10 needs: [yarn-install] @@ -330,8 +332,15 @@ jobs: - name: Checkout registry uses: ./.github/actions/checkout-registry - - name: Fork test ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} deployment - run: cd typescript/infra && ./fork.sh ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} + - name: Fork test ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} deployment with retries + uses: nick-fields/retry@v3 + with: + timeout_minutes: 8 + max_attempts: 3 + retry_wait_seconds: 30 + command: cd typescript/infra && ./fork.sh ${{ matrix.environment }} ${{ matrix.module }} ${{ matrix.chain }} + on_retry_command: | + echo "Test failed, waiting before retry..." coverage: runs-on: ubuntu-latest From ee5124edfd57d6f143d6c145627cc808c7310af3 Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Thu, 16 Jan 2025 11:39:30 +0000 Subject: [PATCH 80/81] feat: Add contract sync liveness metrics (#5181) ### Description Add contract sync liveness metrics ### Related issues - Contributes into https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/5098 ### Backward compatibility Yes ### Testing E2E testing in CI --------- Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> --- .../hyperlane-base/src/contract_sync/metrics.rs | 12 ++++++++++++ rust/main/hyperlane-base/src/contract_sync/mod.rs | 15 +++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/rust/main/hyperlane-base/src/contract_sync/metrics.rs b/rust/main/hyperlane-base/src/contract_sync/metrics.rs index 54e3c7a2cb..7c906b28f1 100644 --- a/rust/main/hyperlane-base/src/contract_sync/metrics.rs +++ b/rust/main/hyperlane-base/src/contract_sync/metrics.rs @@ -26,6 +26,9 @@ pub struct ContractSyncMetrics { /// See `last_known_message_nonce` in CoreMetrics. pub message_nonce: IntGaugeVec, + /// Contract sync liveness metric + pub liveness_metrics: IntGaugeVec, + /// Metrics for SequenceAware and RateLimited cursors. pub cursor_metrics: Arc, } @@ -49,6 +52,14 @@ impl ContractSyncMetrics { ) .expect("failed to register stored_events metric"); + let liveness_metrics = metrics + .new_int_gauge( + "contract_sync_liveness", + "Last timestamp observed by contract sync", + &["data_type", "chain"], + ) + .expect("failed to register liveness metric"); + let message_nonce = metrics.last_known_message_nonce(); let cursor_metrics = Arc::new(CursorMetrics::new(metrics)); @@ -56,6 +67,7 @@ impl ContractSyncMetrics { indexed_height, stored_events, message_nonce, + liveness_metrics, cursor_metrics, } } diff --git a/rust/main/hyperlane-base/src/contract_sync/mod.rs b/rust/main/hyperlane-base/src/contract_sync/mod.rs index 26f6c9d673..d79b9a2616 100644 --- a/rust/main/hyperlane-base/src/contract_sync/mod.rs +++ b/rust/main/hyperlane-base/src/contract_sync/mod.rs @@ -1,5 +1,6 @@ use std::{ collections::HashSet, fmt::Debug, hash::Hash, marker::PhantomData, sync::Arc, time::Duration, + time::UNIX_EPOCH, }; use axum::async_trait; @@ -98,8 +99,13 @@ where .metrics .stored_events .with_label_values(&[label, chain_name]); + let liveness_metric = self + .metrics + .liveness_metrics + .with_label_values(&[label, chain_name]); loop { + Self::update_liveness_metric(&liveness_metric); if let Some(rx) = opts.tx_id_receiver.as_mut() { self.fetch_logs_from_receiver(rx, &stored_logs_metric).await; } @@ -120,6 +126,15 @@ where info!(chain = chain_name, label, "contract sync loop exit"); } + fn update_liveness_metric(liveness_metric: &GenericGauge) { + liveness_metric.set( + UNIX_EPOCH + .elapsed() + .map(|d| d.as_secs() as i64) + .unwrap_or(0), + ); + } + #[instrument(fields(domain=self.domain().name()), skip(self, recv, stored_logs_metric))] async fn fetch_logs_from_receiver( &self, From 11a4e95cafc9148b8bb7ffebf8b9320c2273d27a Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Thu, 16 Jan 2025 14:43:25 +0000 Subject: [PATCH 81/81] fix: Upgrade Cosmos dependencies (#5189) ### Description Upgrade Cosmos dependencies ### Related issues - Contributes into https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/5098 ### Backward compatibility Yes ### Testing Manual testing against Injective, Neutron and Stride Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> --- rust/main/Cargo.lock | 120 ++++++++++++++---- rust/main/Cargo.toml | 18 +-- rust/main/chains/hyperlane-cosmos/Cargo.toml | 1 + .../main/chains/hyperlane-cosmos/src/error.rs | 7 +- .../src/providers/cosmos/provider/parse.rs | 5 +- 5 files changed, 108 insertions(+), 43 deletions(-) diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index da153bf564..f13ac028c5 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -1607,21 +1607,20 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cosmos-sdk-proto" -version = "0.23.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2f63ab112b8c8e7b8a29c891adc48f43145beb21c0bfbf562957072c1e0beb" +checksum = "462e1f6a8e005acc8835d32d60cbd7973ed65ea2a8d8473830e675f050956427" dependencies = [ "prost 0.13.4", - "prost-types 0.13.4", "tendermint-proto", "tonic 0.12.3", ] [[package]] name = "cosmrs" -version = "0.18.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f21bb63ec6a903510a3d01f44735dd4914724e5eccbe409e6da6833d17c7829" +checksum = "210fbe6f98594963b46cc980f126a9ede5db9a3848ca65b71303bebdb01afcd9" dependencies = [ "cosmos-sdk-proto", "ecdsa 0.16.9", @@ -1706,7 +1705,20 @@ version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b4cd28147a66eba73720b47636a58097a979ad8c8bfdb4ed437ebcbfe362576" dependencies = [ - "cosmwasm-schema-derive", + "cosmwasm-schema-derive 1.5.7", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e9a7b56d154870ec4b57b224509854f706c9744449548d8a3bf91ac75c59192" +dependencies = [ + "cosmwasm-schema-derive 2.2.0", "schemars", "serde", "serde_json", @@ -1724,6 +1736,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "cosmwasm-schema-derive" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd3d80310cd7b86b09dbe886f4f2ca235a5ddb8d478493c6e50e720a3b38a42" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "cosmwasm-std" version = "1.5.7" @@ -2015,7 +2038,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" dependencies = [ - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cw2", "schemars", @@ -2030,7 +2053,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" dependencies = [ - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cw-storage-plus", "schemars", @@ -2045,7 +2068,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "526e39bb20534e25a1cd0386727f0038f4da294e5e535729ba3ef54055246abd" dependencies = [ - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cw-utils", "schemars", @@ -2058,7 +2081,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ad79e86ea3707229bf78df94e08732e8f713207b4a77b2699755596725e7d9" dependencies = [ - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cw-storage-plus", "cw2", @@ -4623,7 +4646,7 @@ version = "0.1.0" dependencies = [ "async-trait", "base64 0.21.7", - "bech32 0.9.1", + "bech32 0.11.0", "cosmrs", "cosmwasm-std 2.1.3", "crypto", @@ -4635,6 +4658,7 @@ dependencies = [ "hyper-tls", "hyperlane-core", "hyperlane-cosmwasm-interface", + "ibc-proto", "injective-protobuf", "injective-std", "itertools 0.12.1", @@ -4663,7 +4687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5e622014ab94f1e7f0acbe71df7c1384224261e2c76115807aaf24215970942" dependencies = [ "bech32 0.9.1", - "cosmwasm-schema", + "cosmwasm-schema 1.5.7", "cosmwasm-std 1.5.7", "cosmwasm-storage", "cw-storage-plus", @@ -4884,6 +4908,38 @@ dependencies = [ "cc", ] +[[package]] +name = "ibc-proto" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b70f517162e74e2d35875b8b94bf4d1e45f2c69ef3de452dc855944455d33ca" +dependencies = [ + "base64 0.22.1", + "bytes", + "cosmos-sdk-proto", + "flex-error", + "ics23", + "informalsystems-pbjson", + "prost 0.13.4", + "subtle-encoding", + "tendermint-proto", + "tonic 0.12.3", +] + +[[package]] +name = "ics23" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b17f1a5bd7d12ad30a21445cfa5f52fd7651cb3243ba866f9916b1ec112f12" +dependencies = [ + "anyhow", + "bytes", + "hex 0.4.3", + "informalsystems-pbjson", + "prost 0.13.4", + "serde", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -5070,6 +5126,16 @@ dependencies = [ "regex", ] +[[package]] +name = "informalsystems-pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa4a0980c8379295100d70854354e78df2ee1c6ca0f96ffe89afeb3140e3a3d" +dependencies = [ + "base64 0.21.7", + "serde", +] + [[package]] name = "injective-protobuf" version = "0.2.2" @@ -5088,8 +5154,9 @@ dependencies = [ [[package]] name = "injective-std" -version = "1.13.2-hyperlane-2025-01-09-11-28" -source = "git+https://github.com/hyperlane-xyz/cw-injective.git?tag=1.13.2-hyperlane-2025-01-09-11-28#d3e5bf33f8374026e696749dd54b041a69887cbd" +version = "1.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8769c5d05b3124245276fbd693282c0bfaab81536d12881d06ba74a992a55c2" dependencies = [ "chrono", "cosmwasm-std 2.1.3", @@ -5103,8 +5170,9 @@ dependencies = [ [[package]] name = "injective-std-derive" -version = "1.13.0" -source = "git+https://github.com/hyperlane-xyz/cw-injective.git?tag=1.13.2-hyperlane-2025-01-09-11-28#d3e5bf33f8374026e696749dd54b041a69887cbd" +version = "1.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cfe3fc8519277af8e09e51b8987435e401d345d4466402e6a5b991143fdfa53" dependencies = [ "cosmwasm-std 2.1.3", "itertools 0.10.5", @@ -7345,7 +7413,7 @@ name = "run-locally" version = "0.1.0" dependencies = [ "anyhow", - "cosmwasm-schema", + "cosmwasm-schema 2.2.0", "ctrlc", "ethers", "ethers-contract", @@ -9595,9 +9663,9 @@ dependencies = [ [[package]] name = "tendermint" -version = "0.38.1" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d9d6ffeb83b1de47c307c6e0d2dff56c6256989299010ad03cd80a8491e97" +checksum = "d9703e34d940c2a293804752555107f8dbe2b84ec4c6dd5203831235868105d2" dependencies = [ "bytes", "digest 0.10.7", @@ -9609,7 +9677,6 @@ dependencies = [ "num-traits", "once_cell", "prost 0.13.4", - "prost-types 0.13.4", "ripemd", "serde", "serde_bytes", @@ -9626,9 +9693,9 @@ dependencies = [ [[package]] name = "tendermint-config" -version = "0.38.1" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de111ea653b2adaef627ac2452b463c77aa615c256eaaddf279ec5a1cf9775f" +checksum = "89cc3ea9a39b7ee34eefcff771cc067ecaa0c988c1c5ac08defd878471a06f76" dependencies = [ "flex-error", "serde", @@ -9640,14 +9707,13 @@ dependencies = [ [[package]] name = "tendermint-proto" -version = "0.38.1" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed14abe3b0502a3afe21ca74ca5cdd6c7e8d326d982c26f98a394445eb31d6e" +checksum = "9ae9e1705aa0fa5ecb2c6aa7fb78c2313c4a31158ea5f02048bf318f849352eb" dependencies = [ "bytes", "flex-error", "prost 0.13.4", - "prost-types 0.13.4", "serde", "serde_bytes", "subtle-encoding", @@ -9656,9 +9722,9 @@ dependencies = [ [[package]] name = "tendermint-rpc" -version = "0.38.1" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f96a2b8a0d3d0b59e4024b1a6bdc1589efc6af4709d08a480a20cc4ba90f63" +checksum = "835a52aa504c63ec05519e31348d3f4ba2fe79493c588e2cad5323d5e81b161a" dependencies = [ "async-trait", "bytes", diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index 832bee0c42..d6e9cc7b11 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -46,7 +46,7 @@ color-eyre = "0.6" config = "0.13.3" console-subscriber = "0.2.0" convert_case = "0.6" -cosmrs = { version = "0.18.0", default-features = false, features = [ +cosmrs = { version = "0.21.0", default-features = false, features = [ "cosmwasm", "rpc", "tokio", @@ -69,7 +69,7 @@ futures = "0.3" futures-util = "0.3" generic-array = { version = "0.14", features = ["serde", "more_lengths"] } # Required for WASM support https://docs.rs/getrandom/latest/getrandom/#webassembly-support -bech32 = "0.9.1" +bech32 = "0.11.0" elliptic-curve = "0.13.8" getrandom = { version = "0.2", features = ["js"] } hex = "0.4.3" @@ -77,8 +77,9 @@ http = "1.2.0" hyper = "0.14" hyper-tls = "0.5.0" hyperlane-cosmwasm-interface = "=0.0.6-rc6" +ibc-proto = "0.51.1" injective-protobuf = "0.2.2" -injective-std = "1.13.2-hyperlane-2025-01-09-11-28" +injective-std = "1.13.6" itertools = "*" jobserver = "=0.1.26" jsonrpc-core = "18.0" @@ -134,8 +135,8 @@ static_assertions = "1.1" strum = "0.26.2" strum_macros = "0.26.2" tempfile = "3.3" -tendermint = "0.38.1" -tendermint-rpc = { version = "0.38.1", features = ["http-client", "tokio"] } +tendermint = "0.40.1" +tendermint-rpc = { version = "0.40.1", features = ["http-client", "tokio"] } thiserror = "1.0" time = "0.3" tiny-keccak = "2.0.2" @@ -159,7 +160,7 @@ which = "4.3" ya-gcp = { version = "0.11.3", features = ["storage"] } ## TODO: remove this -cosmwasm-schema = "1.2.7" +cosmwasm-schema = "2.2.0" [profile.release.package.access-control] overflow-checks = true @@ -299,8 +300,3 @@ version = "=0.5.0" version = "=0.1.0" git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" - -[patch.crates-io.injective-std] -version = "1.13.2-hyperlane-2025-01-09-11-28" -git = "https://github.com/hyperlane-xyz/cw-injective.git" -tag = "1.13.2-hyperlane-2025-01-09-11-28" diff --git a/rust/main/chains/hyperlane-cosmos/Cargo.toml b/rust/main/chains/hyperlane-cosmos/Cargo.toml index ecfccbcb7d..06cb6c2e97 100644 --- a/rust/main/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/main/chains/hyperlane-cosmos/Cargo.toml @@ -23,6 +23,7 @@ hyperlane-core = { path = "../../hyperlane-core", features = ["async"] } hyperlane-cosmwasm-interface.workspace = true hyper = { workspace = true } hyper-tls = { workspace = true } +ibc-proto = { workspace = true } injective-protobuf = { workspace = true } injective-std = { workspace = true } itertools = { workspace = true } diff --git a/rust/main/chains/hyperlane-cosmos/src/error.rs b/rust/main/chains/hyperlane-cosmos/src/error.rs index de5e2f019f..cf41fda891 100644 --- a/rust/main/chains/hyperlane-cosmos/src/error.rs +++ b/rust/main/chains/hyperlane-cosmos/src/error.rs @@ -14,9 +14,12 @@ pub enum HyperlaneCosmosError { /// base64 error #[error("{0}")] Base64(#[from] base64::DecodeError), - /// bech32 error + /// bech32 decode error #[error("{0}")] - Bech32(#[from] bech32::Error), + Bech32Decode(#[from] bech32::DecodeError), + /// bech32 encode error + #[error("{0}")] + Bech32Encode(#[from] bech32::EncodeError), /// gRPC error #[error("{0}")] GrpcError(#[from] tonic::Status), diff --git a/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider/parse.rs b/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider/parse.rs index a2212f6128..d648e716f9 100644 --- a/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider/parse.rs +++ b/rust/main/chains/hyperlane-cosmos/src/providers/cosmos/provider/parse.rs @@ -1,6 +1,6 @@ -use cosmrs::proto::ibc::core::channel::v1::MsgRecvPacket; use cosmrs::proto::prost::Message; use cosmrs::Any; +use ibc_proto::ibc::core::channel::v1::MsgRecvPacket; use serde::{Deserialize, Serialize}; use crate::HyperlaneCosmosError; @@ -40,10 +40,9 @@ impl TryFrom for PacketData { #[cfg(test)] mod tests { - use cosmrs::proto::ibc::core::channel::v1::MsgRecvPacket; - use cosmrs::proto::ibc::core::channel::v1::Packet; use cosmrs::proto::prost::Message; use cosmrs::Any; + use ibc_proto::ibc::core::channel::v1::{MsgRecvPacket, Packet}; use crate::providers::cosmos::provider::parse::PacketData; use crate::HyperlaneCosmosError;