From e737d998ff23b5aa6cf2be9634789ca5dc5a4275 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:53:13 +0000 Subject: [PATCH 01/19] Cosmos block-by-block indexing (#3245) ### Description Implements cosmos block-by-block indexing, parallelizing where possible: the `block` and `block_results` calls, and the individual block queries within a range. Also reuses the existing `handle_txs` logic, to improve readability. ### Drive-by changes Adds `tokio::task::JoinError` to the `hyperlane-core` error enum ### Related issues - Fixes https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/3234 - Added some hacky retrying logic to `get_logs_in_block`, since we were seeing lots of `503` http errors. In https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/3264 we should make sure to remove this and propagate the error instead, to retry via the cursor / indexer logic. I edited the description of 3264 to reflect this ### Backward compatibility Yes ### Testing e2e --------- Co-authored-by: Trevor Porter --- rust/.gitignore | 1 + rust/Cargo.lock | 2 + rust/Cargo.toml | 1 + rust/agents/relayer/Cargo.toml | 2 +- rust/agents/validator/Cargo.toml | 2 +- rust/chains/hyperlane-cosmos/Cargo.toml | 4 +- rust/chains/hyperlane-cosmos/src/error.rs | 6 + .../hyperlane-cosmos/src/interchain_gas.rs | 40 +++- rust/chains/hyperlane-cosmos/src/mailbox.rs | 39 +++- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 42 +++- .../hyperlane-cosmos/src/payloads/general.rs | 5 + .../hyperlane-cosmos/src/providers/rpc.rs | 216 +++++++++++------- rust/chains/hyperlane-ethereum/Cargo.toml | 2 +- rust/chains/hyperlane-fuel/Cargo.toml | 2 +- rust/chains/hyperlane-sealevel/Cargo.toml | 2 +- rust/config/mainnet3_config.json | 6 +- rust/hyperlane-base/src/settings/trace/mod.rs | 1 + rust/hyperlane-core/Cargo.toml | 2 +- rust/hyperlane-core/src/error.rs | 4 + rust/hyperlane-core/src/rpc_clients/mod.rs | 4 +- rust/utils/run-locally/src/cosmos/mod.rs | 2 +- .../config/environments/mainnet3/agent.ts | 4 +- .../config/environments/mainnet3/chains.ts | 2 +- .../environments/mainnet3/tokenPrices.json | 1 + 24 files changed, 267 insertions(+), 125 deletions(-) diff --git a/rust/.gitignore b/rust/.gitignore index 1d73887c2d..ffe12328db 100644 --- a/rust/.gitignore +++ b/rust/.gitignore @@ -2,4 +2,5 @@ target validatordb relayerdb kathydb +hyperlane_db config/test_config.json diff --git a/rust/Cargo.lock b/rust/Cargo.lock index a963320d9c..c40386c2b0 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4207,7 +4207,9 @@ dependencies = [ "base64 0.21.7", "bech32 0.9.1", "cosmrs", + "cosmwasm-std", "derive-new", + "futures", "hex 0.4.3", "http", "hyper", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index ffdd2f624f..51c0f0f964 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -72,6 +72,7 @@ cosmrs = { version = "0.14", default-features = false, features = [ "tokio", "grpc", ] } +cosmwasm-std = "*" crunchy = "0.2" ctrlc = "3.2" curve25519-dalek = { version = "~3.2", features = ["serde"] } diff --git a/rust/agents/relayer/Cargo.toml b/rust/agents/relayer/Cargo.toml index 1cb2a1d329..8f95fc8431 100644 --- a/rust/agents/relayer/Cargo.toml +++ b/rust/agents/relayer/Cargo.toml @@ -35,7 +35,7 @@ tokio = { workspace = true, features = ["rt", "macros", "parking_lot"] } tracing-futures.workspace = true tracing.workspace = true -hyperlane-core = { path = "../../hyperlane-core", features = ["agent", "fallback-provider"] } +hyperlane-core = { path = "../../hyperlane-core", features = ["agent", "async"] } hyperlane-base = { path = "../../hyperlane-base" } hyperlane-ethereum = { path = "../../chains/hyperlane-ethereum" } diff --git a/rust/agents/validator/Cargo.toml b/rust/agents/validator/Cargo.toml index 9f90f47730..98a5fe6f83 100644 --- a/rust/agents/validator/Cargo.toml +++ b/rust/agents/validator/Cargo.toml @@ -27,7 +27,7 @@ tokio = { workspace = true, features = ["rt", "macros", "parking_lot"] } tracing-futures.workspace = true tracing.workspace = true -hyperlane-core = { path = "../../hyperlane-core", features = ["agent", "fallback-provider"] } +hyperlane-core = { path = "../../hyperlane-core", features = ["agent", "async"] } hyperlane-base = { path = "../../hyperlane-base" } hyperlane-ethereum = { path = "../../chains/hyperlane-ethereum" } hyperlane-cosmos = { path = "../../chains/hyperlane-cosmos" } diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index c105faec66..d02327111f 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -14,7 +14,9 @@ async-trait = { workspace = true } base64 = { workspace = true } bech32 = { workspace = true } cosmrs = { workspace = true, features = ["cosmwasm", "tokio", "grpc", "rpc"] } +cosmwasm-std = { workspace = true } derive-new = { workspace = true } +futures = { workspace = true } hex = { workspace = true } http = { workspace = true } hyperlane-cosmwasm-interface.workspace = true @@ -39,4 +41,4 @@ tracing = { workspace = true } tracing-futures = { workspace = true } url = { workspace = true } -hyperlane-core = { path = "../../hyperlane-core", features = ["fallback-provider"]} +hyperlane-core = { path = "../../hyperlane-core", features = ["async"]} diff --git a/rust/chains/hyperlane-cosmos/src/error.rs b/rust/chains/hyperlane-cosmos/src/error.rs index 06fffaff7e..cb8ff28cd9 100644 --- a/rust/chains/hyperlane-cosmos/src/error.rs +++ b/rust/chains/hyperlane-cosmos/src/error.rs @@ -26,6 +26,9 @@ pub enum HyperlaneCosmosError { #[error("{0}")] /// Cosmrs Tendermint Error CosmrsTendermintError(#[from] cosmrs::tendermint::Error), + #[error("{0}")] + /// CosmWasm Error + CosmWasmError(#[from] cosmwasm_std::StdError), /// Tonic error #[error("{0}")] Tonic(#[from] tonic::transport::Error), @@ -44,6 +47,9 @@ pub enum HyperlaneCosmosError { /// Fallback providers failed #[error("Fallback providers failed. (Errors: {0:?})")] FallbackProvidersFailed(Vec), + /// Custom error + #[error("{0}")] + CustomError(String), } impl From for ChainCommunicationError { diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 2beafe4e78..c6087bb0bd 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,6 +1,6 @@ use async_trait::async_trait; use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; -use cosmrs::tendermint::abci::EventAttribute; +use futures::future; use hyperlane_core::{ ChainCommunicationError, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexer, InterchainGasPaymaster, InterchainGasPayment, @@ -8,6 +8,8 @@ use hyperlane_core::{ }; use once_cell::sync::Lazy; use std::ops::RangeInclusive; +use tendermint::abci::EventAttribute; +use tracing::{instrument, warn}; use crate::{ rpc::{CosmosWasmIndexer, ParsedEvent, WasmIndexer}, @@ -83,7 +85,7 @@ static DESTINATION_ATTRIBUTE_KEY_BASE64: Lazy = Lazy::new(|| BASE64.encode(DESTINATION_ATTRIBUTE_KEY)); /// A reference to a InterchainGasPaymasterIndexer contract on some Cosmos chain -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct CosmosInterchainGasPaymasterIndexer { indexer: Box, } @@ -110,6 +112,7 @@ impl CosmosInterchainGasPaymasterIndexer { }) } + #[instrument(err)] fn interchain_gas_payment_parser( attrs: &Vec, ) -> ChainResult> { @@ -203,10 +206,34 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let result = self - .indexer - .get_range_event_logs(range, Self::interchain_gas_payment_parser) - .await?; + let logs_futures: Vec<_> = range + .map(|block_number| { + let self_clone = self.clone(); + tokio::spawn(async move { + let logs = self_clone + .indexer + .get_logs_in_block(block_number, Self::interchain_gas_payment_parser) + .await; + (logs, block_number) + }) + }) + .collect(); + + // TODO: this can be refactored when we rework indexing, to be part of the block-by-block indexing + let result = future::join_all(logs_futures) + .await + .into_iter() + .flatten() + .filter_map(|(res, block_number)| match res { + Ok(logs) => Some(logs), + Err(err) => { + warn!(?err, ?block_number, "Failed to fetch logs for block"); + None + } + }) + .flatten() + .collect(); + Ok(result) } @@ -260,7 +287,6 @@ impl TryInto for IncompleteInterchainGasPayment { #[cfg(test)] mod tests { - use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{InterchainGasPayment, H256, U256}; use std::str::FromStr; diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 8f5bab03d6..6476da13e8 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -1,4 +1,5 @@ use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; +use futures::future; use std::{ fmt::{Debug, Formatter}, io::Cursor, @@ -18,8 +19,8 @@ use crate::{grpc::WasmProvider, HyperlaneCosmosError}; use crate::{signers::Signer, utils::get_block_height_for_lag, ConnectionConf}; use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; -use cosmrs::tendermint::abci::EventAttribute; use once_cell::sync::Lazy; +use tendermint::abci::EventAttribute; use crate::utils::{CONTRACT_ADDRESS_ATTRIBUTE_KEY, CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64}; use hyperlane_core::{ @@ -32,6 +33,7 @@ use hyperlane_core::{ }; use tracing::{instrument, warn}; +#[derive(Clone)] /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox { config: ConnectionConf, @@ -262,7 +264,7 @@ static MESSAGE_ATTRIBUTE_KEY_BASE64: Lazy = Lazy::new(|| BASE64.encode(MESSAGE_ATTRIBUTE_KEY)); /// Struct that retrieves event data for a Cosmos Mailbox contract -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct CosmosMailboxIndexer { mailbox: CosmosMailbox, indexer: Box, @@ -294,6 +296,7 @@ impl CosmosMailboxIndexer { }) } + #[instrument(err)] fn hyperlane_message_parser( attrs: &Vec, ) -> ChainResult> { @@ -352,10 +355,33 @@ impl Indexer for CosmosMailboxIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let result = self - .indexer - .get_range_event_logs(range, Self::hyperlane_message_parser) - .await?; + let logs_futures: Vec<_> = range + .map(|block_number| { + let self_clone = self.clone(); + tokio::spawn(async move { + let logs = self_clone + .indexer + .get_logs_in_block(block_number, Self::hyperlane_message_parser) + .await; + (logs, block_number) + }) + }) + .collect(); + + // TODO: this can be refactored when we rework indexing, to be part of the block-by-block indexing + let result = future::join_all(logs_futures) + .await + .into_iter() + .flatten() + .filter_map(|(logs_res, block_number)| match logs_res { + Ok(logs) => Some(logs), + Err(err) => { + warn!(?err, ?block_number, "Failed to fetch logs for block"); + None + } + }) + .flatten() + .collect(); Ok(result) } @@ -400,7 +426,6 @@ impl SequenceAwareIndexer for CosmosMailboxIndexer { #[cfg(test)] mod tests { - use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::HyperlaneMessage; use crate::{rpc::ParsedEvent, utils::event_attributes_from_str}; diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 6d8ebe9104..d55ed45d79 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -2,14 +2,15 @@ use std::{fmt::Debug, num::NonZeroU64, ops::RangeInclusive, str::FromStr}; use async_trait::async_trait; use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; -use cosmrs::tendermint::abci::EventAttribute; +use futures::future; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, ChainCommunicationError, ChainResult, Checkpoint, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexer, LogMeta, MerkleTreeHook, MerkleTreeInsertion, SequenceAwareIndexer, H256, }; use once_cell::sync::Lazy; -use tracing::instrument; +use tendermint::abci::EventAttribute; +use tracing::{instrument, warn}; use crate::{ grpc::WasmProvider, @@ -25,7 +26,7 @@ use crate::{ ConnectionConf, CosmosProvider, HyperlaneCosmosError, Signer, }; -#[derive(Debug)] +#[derive(Debug, Clone)] /// A reference to a MerkleTreeHook contract on some Cosmos chain pub struct CosmosMerkleTreeHook { /// Domain @@ -184,7 +185,7 @@ const MESSAGE_ID_ATTRIBUTE_KEY: &str = "message_id"; pub(crate) static MESSAGE_ID_ATTRIBUTE_KEY_BASE64: Lazy = Lazy::new(|| BASE64.encode(MESSAGE_ID_ATTRIBUTE_KEY)); -#[derive(Debug)] +#[derive(Debug, Clone)] /// A reference to a MerkleTreeHookIndexer contract on some Cosmos chain pub struct CosmosMerkleTreeHookIndexer { /// The CosmosMerkleTreeHook @@ -217,6 +218,7 @@ impl CosmosMerkleTreeHookIndexer { }) } + #[instrument(err)] fn merkle_tree_insertion_parser( attrs: &Vec, ) -> ChainResult> { @@ -285,10 +287,33 @@ impl Indexer for CosmosMerkleTreeHookIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let result = self - .indexer - .get_range_event_logs(range, Self::merkle_tree_insertion_parser) - .await?; + let logs_futures: Vec<_> = range + .map(|block_number| { + let self_clone = self.clone(); + tokio::spawn(async move { + let logs = self_clone + .indexer + .get_logs_in_block(block_number, Self::merkle_tree_insertion_parser) + .await; + (logs, block_number) + }) + }) + .collect(); + + // TODO: this can be refactored when we rework indexing, to be part of the block-by-block indexing + let result = future::join_all(logs_futures) + .await + .into_iter() + .flatten() + .filter_map(|(logs_res, block_number)| match logs_res { + Ok(logs) => Some(logs), + Err(err) => { + warn!(?err, ?block_number, "Failed to fetch logs for block"); + None + } + }) + .flatten() + .collect(); Ok(result) } @@ -335,7 +360,6 @@ impl TryInto for IncompleteMerkleTreeInsertion { #[cfg(test)] mod tests { - use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::H256; use std::str::FromStr; diff --git a/rust/chains/hyperlane-cosmos/src/payloads/general.rs b/rust/chains/hyperlane-cosmos/src/payloads/general.rs index af2a4b0b6e..bf0931220d 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/general.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/general.rs @@ -9,6 +9,11 @@ pub struct Log { pub events: Vec, } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Events { + pub events: Vec, +} + #[derive(Serialize, Deserialize, Debug, Clone)] pub struct Event { #[serde(rename = "type")] diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 04c4f2f12f..df4b4f686d 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,18 +1,24 @@ -use std::ops::RangeInclusive; - use async_trait::async_trait; use cosmrs::rpc::client::Client; -use cosmrs::rpc::endpoint::{tx, tx_search::Response as TxSearchResponse}; -use cosmrs::rpc::query::Query; -use cosmrs::rpc::Order; -use cosmrs::tendermint::abci::EventAttribute; +use futures::Future; use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, LogMeta, H256, U256}; -use tracing::{instrument, trace}; +use sha256::digest; +use std::pin::Pin; +use std::time::Duration; +use tendermint::abci::{Event, EventAttribute}; +use tendermint::hash::Algorithm; +use tendermint::Hash; +use tendermint_rpc::endpoint::block::Response as BlockResponse; +use tendermint_rpc::endpoint::block_results::Response as BlockResultsResponse; +use tendermint_rpc::HttpClient; +use tokio::time::sleep; +use tracing::{debug, instrument, trace}; use crate::address::CosmosAddress; use crate::{ConnectionConf, CosmosProvider, HyperlaneCosmosError}; -const PAGINATION_LIMIT: u8 = 100; +const MAX_RPC_RETRIES: usize = 10; +const RPC_RETRY_SLEEP_DURATION: Duration = Duration::from_secs(2); #[async_trait] /// Trait for wasm indexer. Use rpc provider @@ -20,10 +26,10 @@ pub trait WasmIndexer: Send + Sync { /// Get the finalized block height. async fn get_finalized_block_number(&self) -> ChainResult; - /// Get logs for the given range using the given parser. - async fn get_range_event_logs( + /// Get logs for the given block using the given parser. + async fn get_logs_in_block( &self, - range: RangeInclusive, + block_number: u32, parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> ChainResult> where @@ -45,9 +51,14 @@ impl ParsedEvent { event, } } + + /// Get the inner event + pub fn inner(self) -> T { + self.event + } } -#[derive(Debug)] +#[derive(Debug, Clone)] /// Cosmwasm RPC Provider pub struct CosmosWasmIndexer { provider: CosmosProvider, @@ -83,58 +94,115 @@ impl CosmosWasmIndexer { reorg_period, }) } -} -impl CosmosWasmIndexer { - #[instrument(level = "trace", err, skip(self))] - async fn tx_search(&self, query: Query, page: u32) -> ChainResult { - Ok(self - .provider - .rpc() - .tx_search(query, false, page, PAGINATION_LIMIT, Order::Ascending) + async fn get_block(client: HttpClient, block_number: u32) -> ChainResult { + Ok(client + .block(block_number) + .await + .map_err(Into::::into)?) + } + + async fn get_block_results( + client: HttpClient, + block_number: u32, + ) -> ChainResult { + Ok(client + .block_results(block_number) + .await + .map_err(Into::::into)?) + } + + async fn get_latest_block(client: HttpClient) -> ChainResult { + Ok(client + .latest_block() .await .map_err(Into::::into)?) } + // TODO: Refactor this function into a retrying provider. Once the watermark cursor is refactored, retrying should no longer + // be required here if the error is propagated. + #[instrument(err, skip(f))] + async fn call_with_retry( + mut f: impl FnMut() -> Pin> + Send>>, + ) -> ChainResult { + for retry_number in 1..MAX_RPC_RETRIES { + match f().await { + Ok(res) => return Ok(res), + Err(err) => { + debug!(retries=retry_number, error=?err, "Retrying call"); + sleep(RPC_RETRY_SLEEP_DURATION).await; + } + } + } + + // TODO: Return the last error, or a vec of all the error instead of this string error + Err(ChainCommunicationError::from_other( + HyperlaneCosmosError::CustomError("Retrying call failed".to_string()), + )) + } +} + +impl CosmosWasmIndexer { // Iterate through all txs, filter out failed txs, find target events // in successful txs, and parse them. fn handle_txs( &self, - txs: Vec, + block: BlockResponse, + block_results: BlockResultsResponse, parser: for<'a> fn(&'a Vec) -> ChainResult>, - ) -> ChainResult + '_> + ) -> Vec<(T, LogMeta)> where T: PartialEq + 'static, { - let logs_iter = txs + let Some(tx_results) = block_results.txs_results else { + return vec![]; + }; + + let tx_hashes: Vec = block + .clone() + .block + .data .into_iter() - .filter(|tx| { - // Filter out failed txs - let tx_failed = tx.tx_result.code.is_err(); - if tx_failed { - trace!(tx_hash=?tx.hash, "Indexed tx has failed, skipping"); - } - !tx_failed + .filter_map(|tx| hex::decode(digest(tx.as_slice())).ok()) + .filter_map(|hash| { + Hash::from_bytes(Algorithm::Sha256, hash.as_slice()) + .ok() + .map(|hash| H256::from_slice(hash.as_bytes())) }) - .flat_map(move |tx| { - // Find target events in successful txs - self.handle_tx(tx, parser) - }); + .collect(); - Ok(logs_iter) + tx_results + .into_iter() + .enumerate() + .filter_map(move |(idx, tx)| { + let Some(tx_hash) = tx_hashes.get(idx) else { + debug!(?tx, "No tx hash found for tx"); + return None; + }; + if tx.code.is_err() { + debug!(?tx_hash, "Not indexing failed transaction"); + return None; + } + Some(self.handle_tx(block.clone(), tx.events, *tx_hash, idx, parser)) + }) + .flatten() + .collect() } // Iter through all events in the tx, looking for any target events // made by the contract we are indexing. fn handle_tx( &self, - tx: tx::Response, + block: BlockResponse, + tx_events: Vec, + tx_hash: H256, + transaction_index: usize, parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> impl Iterator + '_ where T: PartialEq + 'static, { - tx.tx_result.events.into_iter().enumerate().filter_map(move |(log_idx, event)| { + tx_events.into_iter().enumerate().filter_map(move |(log_idx, event)| { if event.kind.as_str() != self.target_event_kind { return None; } @@ -143,7 +211,7 @@ impl CosmosWasmIndexer { .map_err(|err| { // This can happen if we attempt to parse an event that just happens // to have the same name but a different structure. - tracing::trace!(?err, tx_hash=?tx.hash, log_idx, ?event, "Failed to parse event attributes"); + tracing::trace!(?err, tx_hash=?tx_hash, log_idx, ?event, "Failed to parse event attributes"); }) .ok() .and_then(|parsed_event| { @@ -152,18 +220,16 @@ impl CosmosWasmIndexer { // Otherwise, we might index events from other contracts that happen // to have the same target event name. if parsed_event.contract_address != self.contract_address.address() { - trace!(tx_hash=?tx.hash, log_idx, ?event, "Event contract address does not match indexer contract address"); + trace!(tx_hash=?tx_hash, log_idx, ?event, "Event contract address does not match indexer contract address"); return None; } Some((parsed_event.event, LogMeta { address: self.contract_address.digest(), - block_number: tx.height.value(), - // FIXME: block_hash is not available in tx_search. - // This isn't strictly required atm. - block_hash: H256::zero(), - transaction_id: H256::from_slice(tx.hash.as_bytes()).into(), - transaction_index: tx.index.into(), + block_number: block.block.header.height.into(), + block_hash: H256::from_slice(block.block_id.hash.as_bytes()), + transaction_id: H256::from_slice(tx_hash.as_bytes()).into(), + transaction_index: transaction_index as u64, log_index: U256::from(log_idx), })) }) @@ -173,13 +239,13 @@ impl CosmosWasmIndexer { #[async_trait] impl WasmIndexer for CosmosWasmIndexer { + #[instrument(err, skip(self))] async fn get_finalized_block_number(&self) -> ChainResult { - let latest_height: u32 = self - .provider - .rpc() - .latest_block() - .await - .map_err(Into::::into)? + let latest_block = Self::call_with_retry(move || { + Box::pin(Self::get_latest_block(self.provider.rpc().clone())) + }) + .await?; + let latest_height: u32 = latest_block .block .header .height @@ -190,47 +256,25 @@ impl WasmIndexer for CosmosWasmIndexer { } #[instrument(err, skip(self, parser))] - async fn get_range_event_logs( + async fn get_logs_in_block( &self, - range: RangeInclusive, + block_number: u32, parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> ChainResult> where - T: PartialEq + Send + Sync + 'static, + T: Send + Sync + PartialEq + 'static, { - // Page starts from 1 - let query = Query::default() - .and_gte("tx.height", *range.start() as u64) - .and_lte("tx.height", *range.end() as u64) - .and_eq( - format!("{}._contract_address", self.target_event_kind), - self.contract_address.address(), - ); - - let tx_search_result = self.tx_search(query.clone(), 1).await?; - - // Using the first tx_search_result, we can calculate the total number of pages. - let total_count = tx_search_result.total_count; - let last_page = div_ceil(total_count, PAGINATION_LIMIT.into()); - - let mut logs = self - .handle_txs(tx_search_result.txs, parser)? - .collect::>(); - - // If there are any more pages, fetch them and append to the result. - for page in 2..=last_page { - trace!(page, "Performing tx search"); + let client = self.provider.rpc().clone(); - let tx_search_result = self.tx_search(query.clone(), page).await?; + let (block_res, block_results_res) = tokio::join!( + Self::call_with_retry(|| { Box::pin(Self::get_block(client.clone(), block_number)) }), + Self::call_with_retry(|| { + Box::pin(Self::get_block_results(client.clone(), block_number)) + }), + ); + let block = block_res.map_err(ChainCommunicationError::from_other)?; + let block_results = block_results_res.map_err(ChainCommunicationError::from_other)?; - logs.extend(self.handle_txs(tx_search_result.txs, parser)?); - } - - Ok(logs) + Ok(self.handle_txs(block, block_results, parser)) } } - -// TODO: just use div_ceil when upgrading from 1.72.1 to 1.73.0 or above -fn div_ceil(numerator: u32, denominator: u32) -> u32 { - (numerator as f32 / denominator as f32).ceil() as u32 -} diff --git a/rust/chains/hyperlane-ethereum/Cargo.toml b/rust/chains/hyperlane-ethereum/Cargo.toml index a72855a00b..82b5ff82b0 100644 --- a/rust/chains/hyperlane-ethereum/Cargo.toml +++ b/rust/chains/hyperlane-ethereum/Cargo.toml @@ -30,7 +30,7 @@ tracing-futures.workspace = true tracing.workspace = true url.workspace = true -hyperlane-core = { path = "../../hyperlane-core", features = ["fallback-provider"]} +hyperlane-core = { path = "../../hyperlane-core", features = ["async"]} ethers-prometheus = { path = "../../ethers-prometheus", features = ["serde"] } [build-dependencies] diff --git a/rust/chains/hyperlane-fuel/Cargo.toml b/rust/chains/hyperlane-fuel/Cargo.toml index 82bdbc782e..d2a711feb2 100644 --- a/rust/chains/hyperlane-fuel/Cargo.toml +++ b/rust/chains/hyperlane-fuel/Cargo.toml @@ -19,7 +19,7 @@ tracing-futures.workspace = true tracing.workspace = true url.workspace = true -hyperlane-core = { path = "../../hyperlane-core", features = ["fallback-provider"]} +hyperlane-core = { path = "../../hyperlane-core", features = ["async"]} [build-dependencies] abigen = { path = "../../utils/abigen", features = ["fuels"] } diff --git a/rust/chains/hyperlane-sealevel/Cargo.toml b/rust/chains/hyperlane-sealevel/Cargo.toml index ab4e9b17f6..2a3eed634f 100644 --- a/rust/chains/hyperlane-sealevel/Cargo.toml +++ b/rust/chains/hyperlane-sealevel/Cargo.toml @@ -24,7 +24,7 @@ tracing.workspace = true url.workspace = true account-utils = { path = "../../sealevel/libraries/account-utils" } -hyperlane-core = { path = "../../hyperlane-core", features = ["solana", "fallback-provider"] } +hyperlane-core = { path = "../../hyperlane-core", features = ["solana", "async"] } hyperlane-sealevel-interchain-security-module-interface = { path = "../../sealevel/libraries/interchain-security-module-interface" } hyperlane-sealevel-mailbox = { path = "../../sealevel/programs/mailbox", features = ["no-entrypoint"] } hyperlane-sealevel-igp = { path = "../../sealevel/programs/hyperlane-sealevel-igp", features = ["no-entrypoint"] } diff --git a/rust/config/mainnet3_config.json b/rust/config/mainnet3_config.json index 61c2a0de74..dc078a1ff8 100644 --- a/rust/config/mainnet3_config.json +++ b/rust/config/mainnet3_config.json @@ -494,7 +494,7 @@ "contractAddressBytes": 32, "index": { "from": 4000000, - "chunk": 100000 + "chunk": 1 }, "blocks": { "reorgPeriod": 1 @@ -516,7 +516,7 @@ "protocol": "cosmos", "rpcUrls": [ { - "http": "https://rpc-injective.goldenratiostaking.net:443" + "http": "https://injective-rpc.polkachu.com" } ], "grpcUrls": [ @@ -533,7 +533,7 @@ "contractAddressBytes": 20, "index": { "from": 58419500, - "chunk": 100000 + "chunk": 1 }, "blocks": { "reorgPeriod": 10 diff --git a/rust/hyperlane-base/src/settings/trace/mod.rs b/rust/hyperlane-base/src/settings/trace/mod.rs index a8d835494e..0866fec0a3 100644 --- a/rust/hyperlane-base/src/settings/trace/mod.rs +++ b/rust/hyperlane-base/src/settings/trace/mod.rs @@ -68,6 +68,7 @@ impl TracingConfig { target_layer = target_layer .with_target("hyper", Level::Info) .with_target("rusoto_core", Level::Info) + .with_target("rustls", Level::Info) .with_target("reqwest", Level::Info) .with_target("h2", Level::Info) .with_target("tower", Level::Info) diff --git a/rust/hyperlane-core/Cargo.toml b/rust/hyperlane-core/Cargo.toml index 40468bef6c..d9bffe576e 100644 --- a/rust/hyperlane-core/Cargo.toml +++ b/rust/hyperlane-core/Cargo.toml @@ -55,4 +55,4 @@ agent = ["ethers", "strum"] strum = ["dep:strum"] ethers = ["dep:ethers-core", "dep:ethers-contract", "dep:ethers-providers", "dep:primitive-types"] solana = ["dep:solana-sdk"] -fallback-provider = ["tokio"] +async = ["tokio"] diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index 2f3c880793..69c66adc63 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -134,6 +134,10 @@ pub enum ChainCommunicationError { /// Rpc client error #[error(transparent)] RpcClientError(#[from] RpcClientError), + /// Tokio join error + #[cfg(feature = "async")] + #[error(transparent)] + TokioJoinError(#[from] tokio::task::JoinError), } impl ChainCommunicationError { diff --git a/rust/hyperlane-core/src/rpc_clients/mod.rs b/rust/hyperlane-core/src/rpc_clients/mod.rs index 02aaae99f5..846e508716 100644 --- a/rust/hyperlane-core/src/rpc_clients/mod.rs +++ b/rust/hyperlane-core/src/rpc_clients/mod.rs @@ -1,8 +1,8 @@ pub use self::error::*; -#[cfg(feature = "fallback-provider")] +#[cfg(feature = "async")] pub use self::fallback::*; mod error; -#[cfg(feature = "fallback-provider")] +#[cfg(feature = "async")] mod fallback; diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index b1b2b4dd47..ab14818295 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -570,7 +570,7 @@ fn termination_invariants_met( let expected_gas_payments = messages_expected; if gas_payments_scraped != expected_gas_payments { log!( - "Scraper has scraped {} gas payments, expected {}", + "Relayer has indexed {} gas payments, expected {}", gas_payments_scraped, expected_gas_payments ); diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index ea038e2549..a84e49daa8 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -95,7 +95,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '54aeb64-20240206-163119', + tag: '6fb50e7-20240229-122630', }, // whitelist: releaseCandidateHelloworldMatchingList, gasPaymentEnforcement, @@ -107,7 +107,7 @@ const releaseCandidate: RootAgentConfig = { validators: { docker: { repo, - tag: '54aeb64-20240206-163119', + tag: '6fb50e7-20240229-122630', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.ReleaseCandidate), diff --git a/typescript/infra/config/environments/mainnet3/chains.ts b/typescript/infra/config/environments/mainnet3/chains.ts index 60a30dbefe..28c243dda5 100644 --- a/typescript/infra/config/environments/mainnet3/chains.ts +++ b/typescript/infra/config/environments/mainnet3/chains.ts @@ -51,7 +51,7 @@ export const ethereumMainnetConfigs: ChainMap = { // Blessed non-Ethereum chains. export const nonEthereumMainnetConfigs: ChainMap = { // solana: chainMetadata.solana, - // neutron: chainMetadata.neutron, + neutron: chainMetadata.neutron, injective: chainMetadata.injective, }; diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index deab6cff09..c7365ff84d 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -14,5 +14,6 @@ "polygonzkevm": "2914.61", "inevm": "32.77", "viction": "0.750231", + "neutron": "1.76", "injective": "32.77" } From 18d1d0d54eda245c4758b61261a003f7445edb18 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 4 Mar 2024 11:53:39 +0000 Subject: [PATCH 02/19] Separate agent chain configurations, re-add some chains to infra, fix eclipsetestnet & solanatestnet configs (#3327) ### Description - solanatestnet and eclipsetestnet were accidentally moved in the agent JSON to not be in the `chains` object. This moves them back to the right place, and adds a test in `infra` to make sure that the agent JSON chains exactly match the environment chain names. There's opportunity for future improvement for exact consistency between TS artifacts / chain metadata and what exists in the agent JSONs, this is tracked here https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/3325 - Adds back eclipsetestnet, solanatestnet, and mumbai to the list of testnet4 chains. These seem to have been accidentally removed - I guess we never deployed to mainnet3 since we started writing to aw-multisig.json. So this writes mainnet chains for the first time - Made some modest fixes to the address persistence logic: - Previously, it didn't handle AWS & GCP keys for the same role well. For non-EVM chains, we have a GCP version of a key for submitting transactions. These exist for relayers, kathy, and validators. This resulted in contention for the relayer key - sometimes the GCP key would get written, sometimes the AWS key. For validators, we'd write both the validator checkpoint signer (AWS) and the chain signer (GCP). Now we just flat out prefer the AWS key. We already only wrote the address persistence with EVM keys in mind, so this isn't a regression - Moves to very explicitly specifying which chains will be ran on the `hyperlane` context agents - Instead of sharing a list of chains for both agents and all contract management, now it's separate. This avoids us making quick fixes and removing e.g. non-EVM chains to make ethereum-specific contract tooling happy, but accidentally removing agent support for these chains - Each chain must be specified for each role in an `AgentChainConfig` indicating whether that chain is enabled. This being consistent with the environment's chain names is enforced at runtime & in a test that's ran in CI. Explicitly indicating whether a chain is supported or not and keeping this consistent will hopefully result in fewer unintentional changes to sets of configured chains - This also allows us during partner integrations to merge a PR with the contract deploy but without necessarily running agents yet. We can just set the chain as disabled to not deploy to it ### Drive-by changes - Removes the `disabled` property for chains in our infra - this is no longer a thing and isn't needed anymore ### Related issues Fixes #3326 Fixes #2572 ### Backward compatibility ### Testing --- rust/config/testnet4_config.json | 84 ++++++------ .../templates/external-secret.yaml | 4 - rust/helm/hyperlane-agent/values.yaml | 1 - typescript/infra/config/aw-multisig.json | 121 ++++++++++++++++++ .../config/environments/mainnet3/agent.ts | 93 ++++++++++++-- .../config/environments/mainnet3/chains.ts | 53 ++------ .../environments/mainnet3/gasPrices.json | 1 + .../infra/config/environments/mainnet3/igp.ts | 2 +- .../config/environments/testnet4/agent.ts | 82 ++++++++++-- .../config/environments/testnet4/chains.ts | 27 ++-- typescript/infra/package.json | 2 +- typescript/infra/scripts/agent-utils.ts | 4 + typescript/infra/src/agents/index.ts | 3 +- typescript/infra/src/agents/key-utils.ts | 27 +++- typescript/infra/src/config/agent/agent.ts | 44 ++++++- typescript/infra/src/config/chain.ts | 25 ++++ typescript/infra/src/deployment/deploy.ts | 8 +- typescript/infra/test/agent-configs.test.ts | 47 +++++++ ...gents.test.ts => cloud-agent-keys.test.ts} | 0 19 files changed, 486 insertions(+), 142 deletions(-) create mode 100644 typescript/infra/test/agent-configs.test.ts rename typescript/infra/test/{agents.test.ts => cloud-agent-keys.test.ts} (100%) diff --git a/rust/config/testnet4_config.json b/rust/config/testnet4_config.json index 252584b5f4..ccee524eb1 100644 --- a/rust/config/testnet4_config.json +++ b/rust/config/testnet4_config.json @@ -583,52 +583,52 @@ "index": { "from": 4517401 } - } - }, - "solanatestnet": { - "name": "solanatestnet", - "chainId": 1399811150, - "domainId": 1399811150, - "mailbox": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", - "merkleTreeHook": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", - "interchainGasPaymaster": "9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy", - "validatorAnnounce": "8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3", - "protocol": "sealevel", - "blocks": { - "reorgPeriod": 0, - "confirmations": 0 }, - "rpcUrls": [ - { - "http": "https://api.testnet.solana.com" + "solanatestnet": { + "name": "solanatestnet", + "chainId": 1399811150, + "domainId": 1399811150, + "mailbox": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", + "merkleTreeHook": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", + "interchainGasPaymaster": "9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy", + "validatorAnnounce": "8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3", + "protocol": "sealevel", + "blocks": { + "reorgPeriod": 0, + "confirmations": 0 + }, + "rpcUrls": [ + { + "http": "https://api.testnet.solana.com" + } + ], + "index": { + "from": 1, + "mode": "sequence" } - ], - "index": { - "from": 1, - "mode": "sequence" - } - }, - "eclipsetestnet": { - "name": "eclipsetestnet", - "chainId": 239092742, - "domainId": 239092742, - "mailbox": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", - "merkleTreeHook": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", - "interchainGasPaymaster": "9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy", - "validatorAnnounce": "8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3", - "protocol": "sealevel", - "blocks": { - "reorgPeriod": 0, - "confirmations": 0 }, - "rpcUrls": [ - { - "http": "https://testnet.dev2.eclipsenetwork.xyz" + "eclipsetestnet": { + "name": "eclipsetestnet", + "chainId": 239092742, + "domainId": 239092742, + "mailbox": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", + "merkleTreeHook": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", + "interchainGasPaymaster": "9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy", + "validatorAnnounce": "8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3", + "protocol": "sealevel", + "blocks": { + "reorgPeriod": 0, + "confirmations": 0 + }, + "rpcUrls": [ + { + "http": "https://testnet.dev2.eclipsenetwork.xyz" + } + ], + "index": { + "from": 1, + "mode": "sequence" } - ], - "index": { - "from": 1, - "mode": "sequence" } }, "defaultRpcConsensusType": "fallback" diff --git a/rust/helm/hyperlane-agent/templates/external-secret.yaml b/rust/helm/hyperlane-agent/templates/external-secret.yaml index a6c82953e3..9be0700b75 100644 --- a/rust/helm/hyperlane-agent/templates/external-secret.yaml +++ b/rust/helm/hyperlane-agent/templates/external-secret.yaml @@ -26,20 +26,17 @@ spec: * to replace the correct value in the created secret. */}} {{- range .Values.hyperlane.chains }} - {{- if not .disabled }} HYP_CHAINS_{{ .name | upper }}_CUSTOMRPCURLS: {{ printf "'{{ .%s_rpcs | mustFromJson | join \",\" }}'" .name }} {{- if eq .protocol "cosmos" }} HYP_CHAINS_{{ .name | upper }}_CUSTOMGRPCURLS: {{ printf "'{{ .%s_grpcs | mustFromJson | join \",\" }}'" .name }} {{- end }} {{- end }} - {{- end }} data: {{- /* * For each network, load the secret in GCP secret manager with the form: environment-rpc-endpoints-network, * and associate it with the secret key networkname_rpcs. */}} {{- range .Values.hyperlane.chains }} - {{- if not .disabled }} - secretKey: {{ printf "%s_rpcs" .name }} remoteRef: key: {{ printf "%s-rpc-endpoints-%s" $.Values.hyperlane.runEnv .name }} @@ -49,4 +46,3 @@ spec: key: {{ printf "%s-grpc-endpoints-%s" $.Values.hyperlane.runEnv .name }} {{- end }} {{- end }} - {{- end }} diff --git a/rust/helm/hyperlane-agent/values.yaml b/rust/helm/hyperlane-agent/values.yaml index 7b2ca9de71..691bb81c61 100644 --- a/rust/helm/hyperlane-agent/values.yaml +++ b/rust/helm/hyperlane-agent/values.yaml @@ -50,7 +50,6 @@ hyperlane: # This should mirror @hyperlane-xyz/sdk AgentChainMetadata chains: - name: examplechain - disabled: false rpcConsensusType: fallback signer: type: # aws diff --git a/typescript/infra/config/aw-multisig.json b/typescript/infra/config/aw-multisig.json index 6f33097861..2abd102e87 100644 --- a/typescript/infra/config/aw-multisig.json +++ b/typescript/infra/config/aw-multisig.json @@ -6,6 +6,13 @@ "0x86485dcec5f7bb8478dd251676372d054dea6653" ] }, + "arbitrum": { + "validators": [ + "0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", + "0x6333e110b8a261cab28acb43030bcde59f26978a", + "0x3369e12edd52570806f126eb50be269ba5e65843" + ] + }, "arbitrumgoerli": { "validators": [ "0x071c8d135845ae5a2cb73f98d681d519014c0a8b", @@ -13,6 +20,27 @@ "0xc1590eaaeaf380e7859564c5ebcdcc87e8369e0d" ] }, + "avalanche": { + "validators": [ + "0x3fb8263859843bffb02950c492d492cae169f4cf", + "0xe58c63ad669b946e7c8211299f22679deecc9c83", + "0x6c754f1e9cd8287088b46a7c807303d55d728b49" + ] + }, + "base": { + "validators": [ + "0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9", + "0x4512985a574cb127b2af2d4bb676876ce804e3f8", + "0xb144bb2f599a5af095bc30367856f27ea8a8adc7" + ] + }, + "bsc": { + "validators": [ + "0x570af9b7b36568c8877eebba6c6727aa9dab7268", + "0x7bf928d5d262365d31d64eaa24755d48c3cae313", + "0x03047213365800f065356b4a2fe97c3c3a52296a" + ] + }, "bsctestnet": { "validators": [ "0x242d8a855a8c932dec51f7999ae7d1e48b10c95e", @@ -20,6 +48,23 @@ "0x1f030345963c54ff8229720dd3a711c15c554aeb" ] }, + "celo": { + "validators": [ + "0x63478422679303c3e4fc611b771fa4a707ef7f4a", + "0x2f4e808744df049d8acc050628f7bdd8265807f9", + "0x7bf30afcb6a7d92146d5a910ea4c154fba38d25e" + ] + }, + "eclipsetestnet": { + "validators": ["0xf344f34abca9a444545b5295066348a0ae22dda3"] + }, + "ethereum": { + "validators": [ + "0x03c842db86a6a3e524d4a6615390c1ea8e2b9541", + "0x4346776b10f5e0d9995d884b7a1dbaee4e24c016", + "0x749d6e7ad949e522c92181dc77f7bbc1c5d71506" + ] + }, "fuji": { "validators": [ "0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e", @@ -27,6 +72,13 @@ "0x43e915573d9f1383cbf482049e4a012290759e7f" ] }, + "gnosis": { + "validators": [ + "0xd4df66a859585678f2ea8357161d896be19cc1ca", + "0x06a833508579f8b59d756b3a1e72451fc70840c3", + "0xb93a72cee19402553c9dd7fed2461aebd04e2454" + ] + }, "goerli": { "validators": [ "0x05a9b5efe9f61f9142453d8e9f61565f333c6768", @@ -34,6 +86,34 @@ "0x7940a12c050e24e1839c21ecb12f65afd84e8c5b" ] }, + "inevm": { + "validators": [ + "0xf9e35ee88e4448a3673b4676a4e153e3584a08eb", + "0xae3e6bb6b3ece1c425aa6f47adc8cb0453c1f9a2", + "0xd98c9522cd9d3e3e00bee05ff76c34b91b266ec3" + ] + }, + "injective": { + "validators": [ + "0xbfb8911b72cfb138c7ce517c57d9c691535dc517", + "0x6faa139c33a7e6f53cb101f6b2ae392298283ed2", + "0x0115e3a66820fb99da30d30e2ce52a453ba99d92" + ] + }, + "mantapacific": { + "validators": [ + "0x8e668c97ad76d0e28375275c41ece4972ab8a5bc", + "0x80afdde2a81f3fb056fd088a97f0af3722dbc4f3", + "0x5dda0c4cf18de3b3ab637f8df82b24921082b54c" + ] + }, + "moonbeam": { + "validators": [ + "0x2225e2f4e9221049456da93b71d2de41f3b6b2a8", + "0x4fe067bb455358e295bfcfb92519a6f9de94b98e", + "0xcc4a78aa162482bea43313cd836ba7b560b44fc4" + ] + }, "mumbai": { "validators": [ "0xebc301013b6cd2548e347c28d2dc43ec20c068f2", @@ -41,6 +121,20 @@ "0x17517c98358c5937c5d9ee47ce1f5b4c2b7fc9f5" ] }, + "neutron": { + "validators": [ + "0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "0x60e890b34cb44ce3fa52f38684f613f31b47a1a6", + "0x7885fae56dbcf5176657f54adbbd881dc6714132" + ] + }, + "optimism": { + "validators": [ + "0x20349eadc6c72e94ce38268b96692b1a5c20de4f", + "0x04d040cee072272789e2d1f29aef73b3ad098db5", + "0x779a17e035018396724a6dec8a59bda1b5adf738" + ] + }, "optimismgoerli": { "validators": [ "0x79e58546e2faca865c6732ad5f6c4951051c4d67", @@ -55,6 +149,20 @@ "0xc906470a73e6b5aad65a4ceb4acd73e3eaf80e2c" ] }, + "polygon": { + "validators": [ + "0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac", + "0x8dd8f8d34b5ecaa5f66de24b01acd7b8461c3916", + "0xdbf3666de031bea43ec35822e8c33b9a9c610322" + ] + }, + "polygonzkevm": { + "validators": [ + "0x86f2a44592bb98da766e880cfd70d3bbb295e61a", + "0xc84076030bdabaabb9e61161d833dd84b700afda", + "0x6a1da2e0b7ae26aaece1377c0a4dbe25b85fa3ca" + ] + }, "polygonzkevmtestnet": { "validators": [ "0x3f06b725bc9648917eb11c414e9f8d76fd959550", @@ -62,6 +170,13 @@ "0xd476548222f43206d0abaa30e46e28670aa7859c" ] }, + "scroll": { + "validators": [ + "0xad557170a9f2f21c35e03de07cb30dcbcc3dff63", + "0xb37fe43a9f47b7024c2d5ae22526cc66b5261533", + "0x7210fa0a6be39a75cb14d682ebfb37e2b53ecbe5" + ] + }, "scrollsepolia": { "validators": [ "0xbe18dbd758afb367180260b524e6d4bcd1cb6d05", @@ -75,5 +190,11 @@ "0x469f0940684d147defc44f3647146cb90dd0bc8e", "0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" ] + }, + "solanatestnet": { + "validators": ["0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5"] + }, + "viction": { + "validators": ["0x1f87c368f8e05a85ef9126d984a980a20930cb9c"] } } diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index a84e49daa8..0734d6fed8 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -1,11 +1,16 @@ import { + Chains, GasPaymentEnforcementPolicyType, RpcConsensusType, chainMetadata, getDomainId, } from '@hyperlane-xyz/sdk'; -import { RootAgentConfig, allAgentChainNames } from '../../../src/config'; +import { + AgentChainConfig, + RootAgentConfig, + getAgentChainNamesFromConfig, +} from '../../../src/config'; import { GasPaymentEnforcementConfig, routerMatchingList, @@ -13,7 +18,7 @@ import { import { ALL_KEY_ROLES, Role } from '../../../src/roles'; import { Contexts } from '../../contexts'; -import { agentChainNames, environment, ethereumChainNames } from './chains'; +import { environment, supportedChainNames } from './chains'; import { helloWorld } from './helloworld'; import { validatorChainConfig } from './validators'; import arbitrumTIAAddresses from './warp/arbitrum-TIA-addresses.json'; @@ -26,11 +31,85 @@ import mantaTIAAddresses from './warp/manta-TIA-addresses.json'; const repo = 'gcr.io/abacus-labs-dev/hyperlane-agent'; +// The chains here must be consistent with the environment's supportedChainNames, which is +// checked / enforced at runtime & in the CI pipeline. +// +// This is intentionally separate and not derived from the environment's supportedChainNames +// to allow for more fine-grained control over which chains are enabled for each agent role. +export const hyperlaneContextAgentChainConfig: AgentChainConfig = { + // Generally, we run all production validators in the Hyperlane context. + [Role.Validator]: { + [Chains.arbitrum]: true, + [Chains.avalanche]: true, + [Chains.bsc]: true, + [Chains.celo]: true, + [Chains.ethereum]: true, + [Chains.neutron]: true, + [Chains.mantapacific]: true, + [Chains.moonbeam]: true, + [Chains.optimism]: true, + [Chains.polygon]: true, + [Chains.gnosis]: true, + [Chains.base]: true, + [Chains.scroll]: true, + [Chains.polygonzkevm]: true, + [Chains.injective]: true, + [Chains.inevm]: true, + [Chains.viction]: true, + }, + [Role.Relayer]: { + [Chains.arbitrum]: true, + [Chains.avalanche]: true, + [Chains.bsc]: true, + [Chains.celo]: true, + [Chains.ethereum]: true, + // At the moment, we only relay between Neutron and Manta Pacific on the neutron context. + [Chains.neutron]: false, + [Chains.mantapacific]: false, + [Chains.moonbeam]: true, + [Chains.optimism]: true, + [Chains.polygon]: true, + [Chains.gnosis]: true, + [Chains.base]: true, + [Chains.scroll]: true, + [Chains.polygonzkevm]: true, + [Chains.injective]: true, + [Chains.inevm]: true, + [Chains.viction]: true, + }, + [Role.Scraper]: { + [Chains.arbitrum]: true, + [Chains.avalanche]: true, + [Chains.bsc]: true, + [Chains.celo]: true, + [Chains.ethereum]: true, + // Cannot scrape non-EVM chains + [Chains.neutron]: false, + [Chains.mantapacific]: true, + [Chains.moonbeam]: true, + [Chains.optimism]: true, + [Chains.polygon]: true, + [Chains.gnosis]: true, + [Chains.base]: true, + [Chains.scroll]: true, + [Chains.polygonzkevm]: true, + // Cannot scrape non-EVM chains + [Chains.injective]: false, + [Chains.inevm]: true, + // Has RPC non-compliance that breaks scraping. + [Chains.viction]: false, + }, +}; + +export const hyperlaneContextAgentChainNames = getAgentChainNamesFromConfig( + hyperlaneContextAgentChainConfig, + supportedChainNames, +); + const contextBase = { namespace: environment, runEnv: environment, - contextChainNames: agentChainNames, - environmentChainNames: allAgentChainNames(agentChainNames), + environmentChainNames: supportedChainNames, aws: { region: 'us-east-1', }, @@ -45,6 +124,7 @@ const gasPaymentEnforcement: GasPaymentEnforcementConfig[] = [ const hyperlane: RootAgentConfig = { ...contextBase, context: Contexts.Hyperlane, + contextChainNames: hyperlaneContextAgentChainNames, rolesWithKeys: ALL_KEY_ROLES, relayer: { rpcConsensusType: RpcConsensusType.Fallback, @@ -86,10 +166,7 @@ const hyperlane: RootAgentConfig = { const releaseCandidate: RootAgentConfig = { ...contextBase, context: Contexts.ReleaseCandidate, - contextChainNames: { - ...contextBase.contextChainNames, - [Role.Validator]: ethereumChainNames, - }, + contextChainNames: hyperlaneContextAgentChainNames, rolesWithKeys: [Role.Relayer, Role.Kathy, Role.Validator], relayer: { rpcConsensusType: RpcConsensusType.Fallback, diff --git a/typescript/infra/config/environments/mainnet3/chains.ts b/typescript/infra/config/environments/mainnet3/chains.ts index 28c243dda5..73a1681a06 100644 --- a/typescript/infra/config/environments/mainnet3/chains.ts +++ b/typescript/infra/config/environments/mainnet3/chains.ts @@ -1,19 +1,23 @@ import { ChainMap, ChainMetadata, - Chains, Mainnets, chainMetadata, } from '@hyperlane-xyz/sdk'; -import { ProtocolType } from '@hyperlane-xyz/utils'; -import { AgentChainNames, Role } from '../../../src/roles'; +import { getChainMetadatas } from '../../../src/config/chain'; -const defaultEthereumMainnetConfigs = Object.fromEntries( - Mainnets.map((chain) => chainMetadata[chain]) - .filter((metadata) => metadata.protocol === ProtocolType.Ethereum) - .map((metadata) => [metadata.name, metadata]), -); +// The `Mainnets` from the SDK are all supported chains for the mainnet3 environment. +// These chains may be any protocol type. +export const supportedChainNames = Mainnets; + +export type MainnetChains = (typeof supportedChainNames)[number]; +export const environment = 'mainnet3'; + +const { + ethereumMetadatas: defaultEthereumMainnetConfigs, + nonEthereumMetadatas: nonEthereumMainnetConfigs, +} = getChainMetadatas(supportedChainNames); export const ethereumMainnetConfigs: ChainMap = { ...defaultEthereumMainnetConfigs, @@ -48,44 +52,11 @@ export const ethereumMainnetConfigs: ChainMap = { }, }; -// Blessed non-Ethereum chains. -export const nonEthereumMainnetConfigs: ChainMap = { - // solana: chainMetadata.solana, - neutron: chainMetadata.neutron, - injective: chainMetadata.injective, -}; - export const mainnetConfigs: ChainMap = { ...ethereumMainnetConfigs, ...nonEthereumMainnetConfigs, }; -export type MainnetChains = keyof typeof mainnetConfigs; -export const supportedChainNames = Object.keys( - mainnetConfigs, -) as MainnetChains[]; -export const environment = 'mainnet3'; - export const ethereumChainNames = Object.keys( ethereumMainnetConfigs, ) as MainnetChains[]; - -// Remove mantapacific, as it's not considered a "blessed" -// chain and we don't relay to mantapacific on the Hyperlane or RC contexts. -const relayerHyperlaneContextChains = supportedChainNames.filter( - (chainName) => chainName !== Chains.mantapacific, -); - -// Ethereum chains only. -const scraperHyperlaneContextChains = ethereumChainNames.filter( - // Has RPC non-compliance that breaks scraping. - (chainName) => chainName !== Chains.viction, -); - -// Hyperlane & RC context agent chain names. -export const agentChainNames: AgentChainNames = { - // Run validators for all chains. - [Role.Validator]: supportedChainNames, - [Role.Relayer]: relayerHyperlaneContextChains, - [Role.Scraper]: scraperHyperlaneContextChains, -}; diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index 1796b74f7a..1d647540cc 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -14,5 +14,6 @@ "polygonzkevm": "3.95", "inevm": "0.1", "viction": "0.25", + "neutron": "0.1", "injective": "0.1" } diff --git a/typescript/infra/config/environments/mainnet3/igp.ts b/typescript/infra/config/environments/mainnet3/igp.ts index f883c2f183..5e58d39bca 100644 --- a/typescript/infra/config/environments/mainnet3/igp.ts +++ b/typescript/infra/config/environments/mainnet3/igp.ts @@ -35,7 +35,7 @@ export const igp: ChainMap = objMap(owners, (local, owner) => ({ overhead: Object.fromEntries( exclude(local, supportedChainNames).map((remote) => [ remote, - remoteOverhead(remote), + remoteOverhead(remote as MainnetChains), ]), ), oracleConfig: storageGasOracleConfig[local], diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index 1c7b76ec1b..90dc043953 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -1,4 +1,5 @@ import { + Chains, GasPaymentEnforcementPolicyType, RpcConsensusType, chainMetadata, @@ -6,15 +7,16 @@ import { } from '@hyperlane-xyz/sdk'; import { + AgentChainConfig, RootAgentConfig, - allAgentChainNames, + getAgentChainNamesFromConfig, routerMatchingList, } from '../../../src/config'; import { GasPaymentEnforcementConfig } from '../../../src/config/agent/relayer'; import { ALL_KEY_ROLES, Role } from '../../../src/roles'; import { Contexts } from '../../contexts'; -import { agentChainNames, environment } from './chains'; +import { environment, supportedChainNames } from './chains'; import { helloWorld } from './helloworld'; import { validatorChainConfig } from './validators'; import plumetestnetSepoliaAddresses from './warp/plumetestnet-sepolia-addresses.json'; @@ -25,11 +27,70 @@ const releaseCandidateHelloworldMatchingList = routerMatchingList( const repo = 'gcr.io/abacus-labs-dev/hyperlane-agent'; +// The chains here must be consistent with the environment's supportedChainNames, which is +// checked / enforced at runtime & in the CI pipeline. +// +// This is intentionally separate and not derived from the environment's supportedChainNames +// to allow for more fine-grained control over which chains are enabled for each agent role. +export const hyperlaneContextAgentChainConfig: AgentChainConfig = { + [Role.Validator]: { + [Chains.alfajores]: true, + [Chains.arbitrumgoerli]: true, + [Chains.bsctestnet]: true, + [Chains.eclipsetestnet]: true, + [Chains.fuji]: true, + [Chains.goerli]: true, + [Chains.mumbai]: true, + [Chains.optimismgoerli]: true, + [Chains.plumetestnet]: true, + [Chains.polygonzkevmtestnet]: true, + [Chains.scrollsepolia]: true, + [Chains.sepolia]: true, + [Chains.solanatestnet]: true, + }, + [Role.Relayer]: { + [Chains.alfajores]: true, + [Chains.arbitrumgoerli]: true, + [Chains.bsctestnet]: true, + [Chains.eclipsetestnet]: true, + [Chains.fuji]: true, + [Chains.goerli]: true, + [Chains.mumbai]: true, + [Chains.optimismgoerli]: true, + [Chains.plumetestnet]: true, + [Chains.polygonzkevmtestnet]: true, + [Chains.scrollsepolia]: true, + [Chains.sepolia]: true, + [Chains.solanatestnet]: true, + }, + [Role.Scraper]: { + [Chains.alfajores]: true, + [Chains.arbitrumgoerli]: true, + [Chains.bsctestnet]: true, + // Cannot scrape non-EVM chains + [Chains.eclipsetestnet]: false, + [Chains.fuji]: true, + [Chains.goerli]: true, + [Chains.mumbai]: true, + [Chains.optimismgoerli]: true, + [Chains.plumetestnet]: true, + [Chains.polygonzkevmtestnet]: true, + [Chains.scrollsepolia]: true, + [Chains.sepolia]: true, + // Cannot scrape non-EVM chains + [Chains.solanatestnet]: false, + }, +}; + +export const hyperlaneContextAgentChainNames = getAgentChainNamesFromConfig( + hyperlaneContextAgentChainConfig, + supportedChainNames, +); + const contextBase = { namespace: environment, runEnv: environment, - contextChainNames: agentChainNames, - environmentChainNames: allAgentChainNames(agentChainNames), + environmentChainNames: supportedChainNames, aws: { region: 'us-east-1', }, @@ -44,14 +105,14 @@ const gasPaymentEnforcement: GasPaymentEnforcementConfig[] = [ const hyperlane: RootAgentConfig = { ...contextBase, - contextChainNames: agentChainNames, + contextChainNames: hyperlaneContextAgentChainNames, context: Contexts.Hyperlane, rolesWithKeys: ALL_KEY_ROLES, relayer: { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'd1ff3aa-20240226-122224', + tag: 'db9ff2d-20240228-143928', }, blacklist: [ ...releaseCandidateHelloworldMatchingList, @@ -98,7 +159,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '6b5b324-20240223-122143', + tag: 'db9ff2d-20240228-143928', }, chains: validatorChainConfig(Contexts.Hyperlane), }, @@ -106,7 +167,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '6b5b324-20240223-122143', + tag: 'db9ff2d-20240228-143928', }, }, }; @@ -114,12 +175,13 @@ const hyperlane: RootAgentConfig = { const releaseCandidate: RootAgentConfig = { ...contextBase, context: Contexts.ReleaseCandidate, + contextChainNames: hyperlaneContextAgentChainNames, rolesWithKeys: [Role.Relayer, Role.Kathy, Role.Validator], relayer: { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '95fe655-20240222-183959', + tag: 'db9ff2d-20240228-143928', }, whitelist: [...releaseCandidateHelloworldMatchingList], gasPaymentEnforcement, @@ -132,7 +194,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '95fe655-20240222-183959', + tag: 'db9ff2d-20240228-143928', }, chains: validatorChainConfig(Contexts.ReleaseCandidate), }, diff --git a/typescript/infra/config/environments/testnet4/chains.ts b/typescript/infra/config/environments/testnet4/chains.ts index cc690a4911..502a667f99 100644 --- a/typescript/infra/config/environments/testnet4/chains.ts +++ b/typescript/infra/config/environments/testnet4/chains.ts @@ -4,26 +4,30 @@ import { Chains, chainMetadata, } from '@hyperlane-xyz/sdk'; -import { plumetestnet } from '@hyperlane-xyz/sdk/dist/consts/chainMetadata'; -import { AgentChainNames, Role } from '../../../src/roles'; - -const selectedChains = [ +// All supported chains for the testnet4 environment. +// These chains may be any protocol type. +export const supportedChainNames = [ Chains.alfajores, Chains.arbitrumgoerli, Chains.bsctestnet, + Chains.eclipsetestnet, Chains.fuji, Chains.goerli, + Chains.mumbai, Chains.optimismgoerli, + Chains.plumetestnet, Chains.polygonzkevmtestnet, Chains.scrollsepolia, Chains.sepolia, - Chains.plumetestnet, + Chains.solanatestnet, ]; +export const environment = 'testnet4'; + export const testnetConfigs: ChainMap = { ...Object.fromEntries( - selectedChains.map((chain) => [chain, chainMetadata[chain]]), + supportedChainNames.map((chain) => [chain, chainMetadata[chain]]), ), mumbai: { ...chainMetadata.mumbai, @@ -39,14 +43,3 @@ export const testnetConfigs: ChainMap = { }, }, }; - -export const supportedChainNames = Object.keys(testnetConfigs); -export const environment = 'testnet4'; - -// Hyperlane & RC context agent chain names. -export const agentChainNames: AgentChainNames = { - [Role.Validator]: supportedChainNames, - // Only run relayers for Ethereum chains at the moment. - [Role.Relayer]: supportedChainNames, - [Role.Scraper]: supportedChainNames, -}; diff --git a/typescript/infra/package.json b/typescript/infra/package.json index f3a15d2a6c..cd81257e2f 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -70,7 +70,7 @@ "announce": "hardhat announce --network localhost", "node": "hardhat node", "prettier": "prettier --write *.ts ./src ./config ./scripts ./test", - "test": "mocha --config ../sdk/.mocharc.json test/agents.test.ts", + "test": "mocha --config ../sdk/.mocharc.json test/**/*.test.ts", "test:ci": "yarn test" }, "peerDependencies": { diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index e41b19bf25..f43c7489dd 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -365,6 +365,10 @@ export function getAgentConfigDirectory() { return path.join('../../', 'rust', 'config'); } +export function getAgentConfigJsonPath(environment: DeployEnvironment) { + return path.join(getAgentConfigDirectory(), `${environment}_config.json`); +} + export async function assertCorrectKubeContext(coreConfig: EnvironmentConfig) { const currentKubeContext = await getCurrentKubernetesContext(); if ( diff --git a/typescript/infra/src/agents/index.ts b/typescript/infra/src/agents/index.ts index 8802ccdaa7..2acbbe4a5b 100644 --- a/typescript/infra/src/agents/index.ts +++ b/typescript/infra/src/agents/index.ts @@ -112,7 +112,7 @@ export abstract class AgentHelmManager { runEnv: this.environment, context: this.context, aws: !!this.config.aws, - chains: this.config.environmentChainNames.map((chain) => { + chains: this.config.contextChainNames[this.role].map((chain) => { const metadata = chainMetadata[chain]; const reorgPeriod = metadata.blocks?.reorgPeriod; if (reorgPeriod === undefined) { @@ -120,7 +120,6 @@ export abstract class AgentHelmManager { } return { name: chain, - disabled: !this.config.contextChainNames[this.role].includes(chain), rpcConsensusType: this.rpcConsensusType(chain), protocol: metadata.protocol, blocks: { reorgPeriod }, diff --git a/typescript/infra/src/agents/key-utils.ts b/typescript/infra/src/agents/key-utils.ts index 0f6a082994..8302768e65 100644 --- a/typescript/infra/src/agents/key-utils.ts +++ b/typescript/infra/src/agents/key-utils.ts @@ -385,6 +385,16 @@ async function persistAddressesLocally( const multisigValidatorKeys: ChainMap<{ validators: Address[] }> = {}; let relayer, kathy; for (const key of keys) { + // Some types of keys come in an AWS and a GCP variant. We prefer + // to persist the AWS version of the key if AWS is enabled. + // Note this means we prefer EVM addresses here, as even if AWS + // is enabled, we use the GCP address for non-EVM chains because + // only the EVM has the tooling & cryptographic compatibility with + // our AWS KMS keys. + if (agentConfig.aws && !(key instanceof AgentAwsKey)) { + continue; + } + if (key.role === Role.Relayer) { if (relayer) throw new Error('More than one Relayer found in gcpCloudAgentKeys'); @@ -395,12 +405,17 @@ async function persistAddressesLocally( throw new Error('More than one Kathy found in gcpCloudAgentKeys'); kathy = key.address; } - if (!key.chainName) continue; - multisigValidatorKeys[key.chainName] ||= { - validators: [], - }; - if (key.chainName) - multisigValidatorKeys[key.chainName].validators.push(key.address); + + if (key.chainName) { + multisigValidatorKeys[key.chainName] ||= { + validators: [], + }; + + // The validator role always has a chainName. + if (key.role === Role.Validator) { + multisigValidatorKeys[key.chainName].validators.push(key.address); + } + } } if (!relayer) throw new Error('No Relayer found in awsCloudAgentKeys'); if (!kathy) throw new Error('No Kathy found in awsCloudAgentKeys'); diff --git a/typescript/infra/src/config/agent/agent.ts b/typescript/infra/src/config/agent/agent.ts index d53e68e056..85b379e5e3 100644 --- a/typescript/infra/src/config/agent/agent.ts +++ b/typescript/infra/src/config/agent/agent.ts @@ -2,14 +2,15 @@ import { AgentChainMetadata, AgentSignerAwsKey, AgentSignerKeyType, + ChainMap, ChainName, RpcConsensusType, chainMetadata, } from '@hyperlane-xyz/sdk'; -import { ProtocolType } from '@hyperlane-xyz/utils'; +import { ProtocolType, objMap } from '@hyperlane-xyz/utils'; import { Contexts } from '../../../config/contexts'; -import { AgentChainNames, Role } from '../../roles'; +import { AgentChainNames, AgentRole, Role } from '../../roles'; import { DeployEnvironment } from '../environment'; import { HelmImageValues } from '../infrastructure'; @@ -56,7 +57,6 @@ interface HelmHyperlaneValues { export interface HelmAgentChainOverride extends DeepPartial { name: AgentChainMetadata['name']; - disabled?: boolean; } export interface RootAgentConfig extends AgentContextConfig { @@ -207,3 +207,41 @@ export function defaultChainSignerKeyConfig(chainName: ChainName): KeyConfig { return { type: AgentSignerKeyType.Hex }; } } + +export type AgentChainConfig = Record>; + +/// Converts an AgentChainConfig to an AgentChainNames object. +export function getAgentChainNamesFromConfig( + config: AgentChainConfig, + supportedChainNames: ChainName[], +): AgentChainNames { + ensureAgentChainConfigIncludesAllChainNames(config, supportedChainNames); + + return objMap(config, (role, roleConfig) => + Object.entries(roleConfig) + .filter(([_chain, enabled]) => enabled) + .map(([chain]) => chain), + ); +} + +// Throws if any of the roles in the config do not have all the expected chain names. +export function ensureAgentChainConfigIncludesAllChainNames( + config: AgentChainConfig, + expectedChainNames: ChainName[], +) { + for (const [role, roleConfig] of Object.entries(config)) { + const chainNames = Object.keys(roleConfig); + const missingChainNames = expectedChainNames.filter( + (chainName) => !chainNames.includes(chainName), + ); + const unknownChainNames = chainNames.filter( + (chainName) => !expectedChainNames.includes(chainName), + ); + + if (missingChainNames.length > 0 || unknownChainNames.length > 0) { + throw new Error( + `${role} agent chain config incorrect. Missing chain names: ${missingChainNames}, unknown chain names: ${unknownChainNames}`, + ); + } + } +} diff --git a/typescript/infra/src/config/chain.ts b/typescript/infra/src/config/chain.ts index af99549c8f..dda0edc7c4 100644 --- a/typescript/infra/src/config/chain.ts +++ b/typescript/infra/src/config/chain.ts @@ -1,13 +1,17 @@ import { providers } from 'ethers'; import { + ChainMap, + ChainMetadata, ChainMetadataManager, ChainName, + CoreChainName, HyperlaneSmartProvider, ProviderRetryOptions, RpcConsensusType, chainMetadata, } from '@hyperlane-xyz/sdk'; +import { ProtocolType, objFilter } from '@hyperlane-xyz/utils'; import { getSecretRpcEndpoint } from '../agents'; @@ -52,3 +56,24 @@ export async function fetchProvider( throw Error(`Unsupported connectionType: ${connectionType}`); } } + +export function getChainMetadatas(chains: Array) { + const allMetadatas = Object.fromEntries( + chains + .map((chain) => chainMetadata[chain]) + .map((metadata) => [metadata.name, metadata]), + ); + + const ethereumMetadatas = objFilter( + allMetadatas, + (_, metadata): metadata is ChainMetadata => + metadata.protocol === ProtocolType.Ethereum, + ); + const nonEthereumMetadatas = objFilter( + allMetadatas, + (_, metadata): metadata is ChainMetadata => + metadata.protocol !== ProtocolType.Ethereum, + ); + + return { ethereumMetadatas, nonEthereumMetadatas }; +} diff --git a/typescript/infra/src/deployment/deploy.ts b/typescript/infra/src/deployment/deploy.ts index 5088a672e5..5c2f4c1a8d 100644 --- a/typescript/infra/src/deployment/deploy.ts +++ b/typescript/infra/src/deployment/deploy.ts @@ -11,7 +11,7 @@ import { } from '@hyperlane-xyz/sdk'; import { objMap, objMerge, promiseObjAll } from '@hyperlane-xyz/utils'; -import { getAgentConfigDirectory } from '../../scripts/agent-utils'; +import { getAgentConfigJsonPath } from '../../scripts/agent-utils'; import { DeployEnvironment } from '../config'; import { readJSONAtPath, @@ -143,9 +143,5 @@ export async function writeAgentConfig( addresses as ChainMap, startBlocks, ); - writeMergedJSON( - getAgentConfigDirectory(), - `${environment}_config.json`, - agentConfig, - ); + writeMergedJSONAtPath(getAgentConfigJsonPath(environment), agentConfig); } diff --git a/typescript/infra/test/agent-configs.test.ts b/typescript/infra/test/agent-configs.test.ts new file mode 100644 index 0000000000..ea7c6f3777 --- /dev/null +++ b/typescript/infra/test/agent-configs.test.ts @@ -0,0 +1,47 @@ +import { expect } from 'chai'; + +import { hyperlaneContextAgentChainConfig as mainnet3AgentChainConfig } from '../config/environments/mainnet3/agent'; +import { supportedChainNames as mainnet3SupportedChainNames } from '../config/environments/mainnet3/chains'; +import { hyperlaneContextAgentChainConfig as testnet4AgentChainConfig } from '../config/environments/testnet4/agent'; +import { supportedChainNames as testnet4SupportedChainNames } from '../config/environments/testnet4/chains'; +import { getAgentConfigJsonPath } from '../scripts/agent-utils'; +import { ensureAgentChainConfigIncludesAllChainNames } from '../src/config'; +import { readJSONAtPath } from '../src/utils/utils'; + +const environmentChainConfigs = { + mainnet3: { + agentChainConfig: mainnet3AgentChainConfig, + // We read the agent config from the file system instead of importing + // to get around the agent JSON configs living outside the typescript rootDir + agentJsonConfig: readJSONAtPath(getAgentConfigJsonPath('mainnet3')), + supportedChainNames: mainnet3SupportedChainNames, + }, + testnet4: { + agentChainConfig: testnet4AgentChainConfig, + agentJsonConfig: readJSONAtPath(getAgentConfigJsonPath('testnet4')), + supportedChainNames: testnet4SupportedChainNames, + }, +}; + +describe('Agent configs', () => { + Object.entries(environmentChainConfigs).forEach(([environment, config]) => { + describe(`Environment: ${environment}`, () => { + it('AgentChainConfig specifies all chains for each role in the agent chain config', () => { + // This will throw if there are any inconsistencies + ensureAgentChainConfigIncludesAllChainNames( + config.agentChainConfig, + config.supportedChainNames, + ); + }); + + it('Agent JSON config matches environment chains', () => { + const agentJsonConfigChains = Object.keys( + config.agentJsonConfig.chains, + ); + expect(agentJsonConfigChains).to.have.members( + config.supportedChainNames, + ); + }); + }); + }); +}); diff --git a/typescript/infra/test/agents.test.ts b/typescript/infra/test/cloud-agent-keys.test.ts similarity index 100% rename from typescript/infra/test/agents.test.ts rename to typescript/infra/test/cloud-agent-keys.test.ts From 3ff8eb3c3d435e98a52631d8c14eca0dc1d063c5 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Mon, 4 Mar 2024 09:08:33 -0700 Subject: [PATCH 03/19] Update mainnet3 governance and validator configurations (#3315) ### Description - Transfer inEVM and injective contracts to multisig - Configure safes as owners on mainnet3 ### Drive-by changes - Support foreign domains in ISM factory - Fix transfer ownership bugs in deployers and ISM factory ### Related issues - Fixes https://github.com/hyperlane-xyz/issues/issues/813 - Fixes https://github.com/hyperlane-xyz/issues/issues/973 - Fixes https://github.com/hyperlane-xyz/issues/issues/1028 ### Backward compatibility - Yes ### Testing - Env tests --- .changeset/wild-horses-burn.md | 6 ++++++ .github/workflows/test.yml | 1 + .../config/environments/mainnet3/core.ts | 6 +++--- .../infra/config/environments/mainnet3/igp.ts | 15 +++++++------- .../config/environments/mainnet3/owners.ts | 8 +++++--- typescript/infra/fork.sh | 3 --- typescript/infra/scripts/check-deploy.ts | 3 ++- typescript/infra/scripts/deploy.ts | 9 ++++++++- typescript/infra/src/utils/fork.ts | 4 ++++ typescript/sdk/src/consts/multisigIsm.ts | 8 ++++---- .../sdk/src/deploy/HyperlaneDeployer.ts | 2 +- .../sdk/src/hook/HyperlaneHookDeployer.ts | 20 ++++++++++++------- typescript/sdk/src/ism/HyperlaneIsmFactory.ts | 14 ++++++++++--- 13 files changed, 66 insertions(+), 33 deletions(-) create mode 100644 .changeset/wild-horses-burn.md diff --git a/.changeset/wild-horses-burn.md b/.changeset/wild-horses-burn.md new file mode 100644 index 0000000000..44922d2880 --- /dev/null +++ b/.changeset/wild-horses-burn.md @@ -0,0 +1,6 @@ +--- +'@hyperlane-xyz/infra': patch +'@hyperlane-xyz/sdk': patch +--- + +Patch transfer ownership in hook deployer diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 868b037dbc..0431e5b38e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -296,6 +296,7 @@ jobs: runs-on: ubuntu-latest needs: [yarn-build] strategy: + fail-fast: false matrix: environment: [mainnet3] chain: [ethereum, arbitrum, optimism, inevm, viction] diff --git a/typescript/infra/config/environments/mainnet3/core.ts b/typescript/infra/config/environments/mainnet3/core.ts index 8dc23b6a38..8332de9250 100644 --- a/typescript/infra/config/environments/mainnet3/core.ts +++ b/typescript/infra/config/environments/mainnet3/core.ts @@ -22,7 +22,7 @@ import { objMap } from '@hyperlane-xyz/utils'; import { supportedChainNames } from './chains'; import { igp } from './igp'; -import { owners } from './owners'; +import { DEPLOYER, owners } from './owners'; export const core: ChainMap = objMap(owners, (local, owner) => { const originMultisigs: ChainMap = Object.fromEntries( @@ -56,7 +56,7 @@ export const core: ChainMap = objMap(owners, (local, owner) => { const pausableIsm: PausableIsmConfig = { type: IsmType.PAUSABLE, - ...owner, + owner: DEPLOYER, // keep pausable hot }; const defaultIsm: AggregationIsmConfig = { @@ -76,7 +76,7 @@ export const core: ChainMap = objMap(owners, (local, owner) => { const pausableHook: PausableHookConfig = { type: HookType.PAUSABLE, - ...owner, + owner: DEPLOYER, // keep pausable hot }; const aggregationHooks = objMap( originMultisigs, diff --git a/typescript/infra/config/environments/mainnet3/igp.ts b/typescript/infra/config/environments/mainnet3/igp.ts index 5e58d39bca..c6b66f7c25 100644 --- a/typescript/infra/config/environments/mainnet3/igp.ts +++ b/typescript/infra/config/environments/mainnet3/igp.ts @@ -12,11 +12,7 @@ import { supportedChainNames, } from './chains'; import { storageGasOracleConfig } from './gas-oracle'; -import { owners } from './owners'; - -// TODO: make this generic -const KEY_FUNDER_ADDRESS = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; -const DEPLOYER_ADDRESS = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; +import { DEPLOYER, owners } from './owners'; const FOREIGN_DEFAULT_OVERHEAD = 600_000; // cosmwasm warp route somewhat arbitrarily chosen @@ -30,8 +26,13 @@ const remoteOverhead = (remote: MainnetChains) => export const igp: ChainMap = objMap(owners, (local, owner) => ({ ...owner, - oracleKey: DEPLOYER_ADDRESS, - beneficiary: KEY_FUNDER_ADDRESS, + ownerOverrides: { + ...owner.ownerOverrides, + interchainGasPaymaster: DEPLOYER, + storageGasOracle: DEPLOYER, + }, + oracleKey: DEPLOYER, + beneficiary: DEPLOYER, overhead: Object.fromEntries( exclude(local, supportedChainNames).map((remote) => [ remote, diff --git a/typescript/infra/config/environments/mainnet3/owners.ts b/typescript/infra/config/environments/mainnet3/owners.ts index 1a1a87a7a2..8f9c21615a 100644 --- a/typescript/infra/config/environments/mainnet3/owners.ts +++ b/typescript/infra/config/environments/mainnet3/owners.ts @@ -18,18 +18,20 @@ export const safes: ChainMap
= { optimism: '0xb523CFAf45AACF472859f8B793CB0BFDB16bD257', moonbeam: '0xF0cb1f968Df01fc789762fddBfA704AE0F952197', gnosis: '0x36b0AA0e7d04e7b825D7E409FEa3c9A3d57E4C22', + inevm: '0x77F3863ea99F2360D84d4BA1A2E441857D0357fa', // caldera + injective + // injective: 'inj1632x8j35kenryam3mkrsez064sqg2y2fr0frzt', // solana: 'EzppBFV2taxWw8kEjxNYvby6q7W1biJEqwP3iC7YgRe3', }; -const deployer = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; +export const DEPLOYER = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; export const owners: ChainMap = Object.fromEntries( ethereumChainNames.map((local) => [ local, { - owner: deployer, // TODO: change this to the safe + owner: safes[local] ?? DEPLOYER, ownerOverrides: { - proxyAdmin: timelocks[local] ?? safes[local] ?? deployer, + proxyAdmin: timelocks[local] ?? safes[local] ?? DEPLOYER, }, }, ]), diff --git a/typescript/infra/fork.sh b/typescript/infra/fork.sh index 13ed5a9a9e..1e29e4dd55 100755 --- a/typescript/infra/fork.sh +++ b/typescript/infra/fork.sh @@ -36,9 +36,6 @@ yarn ts-node ./scripts/deploy.ts -e $ENVIRONMENT -f $CHAIN -m $MODULE AFTER=$(cast balance $DEPLOYER --rpc-url http://localhost:8545) DEPLOY_DELTA="$((BEFORE-AFTER))" -# build SDK to get the latest addresses -yarn --cwd ../sdk build - BEFORE=$(cast balance $DEPLOYER --rpc-url http://localhost:8545) yarn ts-node ./scripts/check-deploy.ts -e $ENVIRONMENT -f $CHAIN --govern -m $MODULE diff --git a/typescript/infra/scripts/check-deploy.ts b/typescript/infra/scripts/check-deploy.ts index 52b73c34b3..81902dc4fe 100644 --- a/typescript/infra/scripts/check-deploy.ts +++ b/typescript/infra/scripts/check-deploy.ts @@ -51,7 +51,8 @@ async function check() { }); const owner = config.core[fork].owner; - const signer = await impersonateAccount(owner); + const signer = await impersonateAccount(owner, 1e18); + multiProvider.setSigner(fork, signer); } } diff --git a/typescript/infra/scripts/deploy.ts b/typescript/infra/scripts/deploy.ts index b83d1019b8..8026a306aa 100644 --- a/typescript/infra/scripts/deploy.ts +++ b/typescript/infra/scripts/deploy.ts @@ -69,7 +69,14 @@ async function main() { }); await useLocalProvider(multiProvider, fork); - const signer = await impersonateAccount(envConfig.owners[fork].owner); + // const deployers = await envConfig.getKeys( + // Contexts.Hyperlane, + // Role.Deployer, + // ); + // const deployer = deployers[fork].address; + const deployer = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba'; + const signer = await impersonateAccount(deployer); + multiProvider.setSharedSigner(signer); } diff --git a/typescript/infra/src/utils/fork.ts b/typescript/infra/src/utils/fork.ts index 3d50f8eac3..c51d40a8b1 100644 --- a/typescript/infra/src/utils/fork.ts +++ b/typescript/infra/src/utils/fork.ts @@ -15,9 +15,13 @@ export const resetFork = async (url: string) => { export const impersonateAccount = async ( account: string, + spoofBalance?: number, ): Promise => { const provider = new JsonRpcProvider('http://127.0.0.1:8545'); await provider.send('hardhat_impersonateAccount', [account]); + if (spoofBalance) { + await provider.send('hardhat_setBalance', [account, spoofBalance]); + } return provider.getSigner(account); }; diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 22059db955..74de5c62fb 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -138,8 +138,8 @@ export const defaultMultisigConfigs: ChainMap = { threshold: 2, validators: [ '0xf9e35ee88e4448a3673b4676a4e153e3584a08eb', - '0xae3e6bb6b3ece1c425aa6f47adc8cb0453c1f9a2', - '0xd98c9522cd9d3e3e00bee05ff76c34b91b266ec3', + '0x6B1d09A97b813D53e9D4b7523DA36604C0B52242', // caldera + '0x9ab11f38a609940153850df611c9a2175dcffe0f', // imperator ], }, @@ -147,8 +147,8 @@ export const defaultMultisigConfigs: ChainMap = { threshold: 2, validators: [ '0xbfb8911b72cfb138c7ce517c57d9c691535dc517', - '0x6faa139c33a7e6f53cb101f6b2ae392298283ed2', - '0x0115e3a66820fb99da30d30e2ce52a453ba99d92', + '0x6B1d09A97b813D53e9D4b7523DA36604C0B52242', // caldera + '0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9', // imperator ], }, diff --git a/typescript/sdk/src/deploy/HyperlaneDeployer.ts b/typescript/sdk/src/deploy/HyperlaneDeployer.ts index c0370701ff..4714657610 100644 --- a/typescript/sdk/src/deploy/HyperlaneDeployer.ts +++ b/typescript/sdk/src/deploy/HyperlaneDeployer.ts @@ -640,7 +640,7 @@ export abstract class HyperlaneDeployer< return ret; } - protected async transferOwnershipOfContracts( + async transferOwnershipOfContracts( chain: ChainName, config: OwnableConfig, ownables: Partial>, diff --git a/typescript/sdk/src/hook/HyperlaneHookDeployer.ts b/typescript/sdk/src/hook/HyperlaneHookDeployer.ts index c87d8777b7..0af7d4fd3c 100644 --- a/typescript/sdk/src/hook/HyperlaneHookDeployer.ts +++ b/typescript/sdk/src/hook/HyperlaneHookDeployer.ts @@ -258,13 +258,15 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer< throw new Error(`Mailbox address is required for ${config.type}`); } + const deployer = await this.multiProvider.getSigner(chain).getAddress(); + let routingHook: DomainRoutingHook | FallbackDomainRoutingHook; switch (config.type) { case HookType.ROUTING: { this.logger('Deploying DomainRoutingHook for %s', chain); routingHook = await this.deployContract(chain, HookType.ROUTING, [ mailbox, - config.owner, + deployer, ]); break; } @@ -278,7 +280,7 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer< routingHook = await this.deployContract( chain, HookType.FALLBACK_ROUTING, - [mailbox, config.owner, fallbackHook[config.fallback.type].address], + [mailbox, deployer, fallbackHook[config.fallback.type].address], ); break; } @@ -309,13 +311,17 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer< } const overrides = this.multiProvider.getTransactionOverrides(chain); - await this.multiProvider.handleTx( - chain, - routingHook.setHooks(routingConfigs, { - ...overrides, - }), + await this.runIfOwner(chain, routingHook, async () => + this.multiProvider.handleTx( + chain, + routingHook.setHooks(routingConfigs, overrides), + ), ); + await this.transferOwnershipOfContracts(chain, config, { + [config.type]: routingHook, + }); + return routingHook; } } diff --git a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts index b51c1131f1..ae0dd6d8b3 100644 --- a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts +++ b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts @@ -27,6 +27,7 @@ import { } from '@hyperlane-xyz/utils'; import { HyperlaneApp } from '../app/HyperlaneApp'; +import { chainMetadata } from '../consts/chainMetadata'; import { HyperlaneEnvironment, hyperlaneEnvironments, @@ -164,6 +165,9 @@ export class HyperlaneIsmFactory extends HyperlaneApp { IsmType.PAUSABLE, [config.owner], ); + await this.deployer?.transferOwnershipOfContracts(destination, config, { + [IsmType.PAUSABLE]: contract, + }); break; case IsmType.TEST_ISM: if (!this.deployer) { @@ -236,7 +240,9 @@ export class HyperlaneIsmFactory extends HyperlaneApp { config.domains = objFilter( config.domains, (domain, config): config is IsmConfig => { - const domainId = this.multiProvider.tryGetDomainId(domain); + const domainId = + chainMetadata[domain]?.domainId ?? + this.multiProvider.tryGetDomainId(domain); if (domainId === null) { warn( `Domain ${domain} doesn't have chain metadata provided, skipping ...`, @@ -245,8 +251,10 @@ export class HyperlaneIsmFactory extends HyperlaneApp { return domainId !== null; }, ); - const safeConfigDomains = Object.keys(config.domains).map((domain) => - this.multiProvider.getDomainId(domain), + const safeConfigDomains = Object.keys(config.domains).map( + (domain) => + chainMetadata[domain]?.domainId ?? + this.multiProvider.getDomainId(domain), ); const delta: RoutingIsmDelta = existingIsmAddress ? await routingModuleDelta( From 332826c5a67dcb011956868eeeb38adc13881c9d Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 5 Mar 2024 12:19:52 +0000 Subject: [PATCH 04/19] Friendlier error when an agent has insufficient funds for a Cosmos tx (#3359) ### Description An error that will be easier to debug in the case of the signer not having sufficient funds to cover a tx that's being sent. ### Drive-by changes ### Related issues Fixes #3358 ### Backward compatibility ### Testing --- .../hyperlane-cosmos/src/providers/grpc.rs | 67 ++++++++++++------- rust/hyperlane-core/src/error.rs | 15 +++-- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index a6bc070aba..f91be32bb5 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -191,12 +191,13 @@ impl WasmGrpcProvider { self.gas_price.amount.clone() } - /// Generates an unsigned SignDoc for a transaction. - async fn generate_unsigned_sign_doc( + /// Generates an unsigned SignDoc for a transaction and the Coin amount + /// required to pay for tx fees. + async fn generate_unsigned_sign_doc_and_fee( &self, msgs: Vec, gas_limit: u64, - ) -> ChainResult { + ) -> ChainResult<(SignDoc, Coin)> { // As this function is only used for estimating gas or sending transactions, // we can reasonably expect to have a signer. let signer = self.get_signer()?; @@ -215,15 +216,14 @@ impl WasmGrpcProvider { let amount: u128 = (FixedPointNumber::from(gas_limit) * self.gas_price()) .ceil_to_integer() .try_into()?; - let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( - Coin::new( - // The fee to pay is the gas limit * the gas price - amount, - self.conf.get_canonical_asset().as_str(), - ) - .map_err(Into::::into)?, - gas_limit, - )); + let fee_coin = Coin::new( + // The fee to pay is the gas limit * the gas price + amount, + self.conf.get_canonical_asset().as_str(), + ) + .map_err(Into::::into)?; + let auth_info = + signer_info.auth_info(Fee::from_amount_and_gas(fee_coin.clone(), gas_limit)); let chain_id = self .conf @@ -231,39 +231,46 @@ impl WasmGrpcProvider { .parse() .map_err(Into::::into)?; - Ok( + Ok(( SignDoc::new(&tx_body, &auth_info, &chain_id, account_info.account_number) .map_err(Into::::into)?, - ) + fee_coin, + )) } - /// Generates a raw signed transaction including `msgs`, estimating gas if a limit is not provided. - async fn generate_raw_signed_tx( + /// Generates a raw signed transaction including `msgs`, estimating gas if a limit is not provided, + /// and the Coin amount required to pay for tx fees. + async fn generate_raw_signed_tx_and_fee( &self, msgs: Vec, gas_limit: Option, - ) -> ChainResult> { + ) -> ChainResult<(Vec, Coin)> { let gas_limit = if let Some(l) = gas_limit { l } else { self.estimate_gas(msgs.clone()).await? }; - let sign_doc = self.generate_unsigned_sign_doc(msgs, gas_limit).await?; + let (sign_doc, fee) = self + .generate_unsigned_sign_doc_and_fee(msgs, gas_limit) + .await?; let signer = self.get_signer()?; let tx_signed = sign_doc .sign(&signer.signing_key()?) .map_err(Into::::into)?; - Ok(tx_signed - .to_bytes() - .map_err(Into::::into)?) + Ok(( + tx_signed + .to_bytes() + .map_err(Into::::into)?, + fee, + )) } /// Estimates gas for a transaction containing `msgs`. async fn estimate_gas(&self, msgs: Vec) -> ChainResult { // Get a sign doc with 0 gas, because we plan to simulate - let sign_doc = self.generate_unsigned_sign_doc(msgs, 0).await?; + let (sign_doc, _) = self.generate_unsigned_sign_doc_and_fee(msgs, 0).await?; let raw_tx = TxRaw { body_bytes: sign_doc.body_bytes, @@ -551,7 +558,21 @@ impl WasmProvider for WasmGrpcProvider { None } }); - let tx_bytes = self.generate_raw_signed_tx(msgs, gas_limit).await?; + let (tx_bytes, fee) = self.generate_raw_signed_tx_and_fee(msgs, gas_limit).await?; + + // Check if the signer has enough funds to pay for the fee so we can get + // a more informative error. + let signer_balance = self + .get_balance(signer.address.clone(), fee.denom.to_string()) + .await?; + let fee_amount: U256 = fee.amount.into(); + if signer_balance < fee_amount { + return Err(ChainCommunicationError::InsufficientFunds { + required: fee_amount, + available: signer_balance, + }); + } + let tx_res = self .provider .call(move |provider| { diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index 69c66adc63..12d51a4653 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -10,9 +10,7 @@ use crate::config::StrOrIntParseError; use crate::rpc_clients::RpcClientError; use std::string::FromUtf8Error; -use crate::Error as PrimitiveTypeError; -use crate::HyperlaneProviderError; -use crate::H256; +use crate::{Error as PrimitiveTypeError, HyperlaneProviderError, H256, U256}; /// The result of interacting with a chain. pub type ChainResult = Result; @@ -122,9 +120,14 @@ pub enum ChainCommunicationError { /// Error message msg: String, }, - /// Failed to estimate transaction gas cost. - #[error("Failed to estimate transaction gas cost {0}")] - TxCostEstimateError(String), + /// Insufficient funds. + #[error("Insufficient funds. Required: {required:?}, available: {available:?}")] + InsufficientFunds { + /// The required amount of funds. + required: U256, + /// The available amount of funds. + available: U256, + }, /// Primitive type error #[error(transparent)] PrimitiveTypeError(#[from] PrimitiveTypeError), From 16c0fb10aedf09891f55e1c51713dad90728fc00 Mon Sep 17 00:00:00 2001 From: Lee <6251863+ltyu@users.noreply.github.com> Date: Tue, 5 Mar 2024 11:59:49 -0500 Subject: [PATCH 05/19] CCIP Gateway Server (#3273) ### Description Gateway Server and Proof Services to create proofs to be consumed by LightClient ISM. See README for more details ### Drive-by changes ### Related issues Used in #3149 ### Backward compatibility Yes ### Testing Manual/Unit Tests --- solidity/test/test-data/getProof-data.json | 25 + typescript/ccip-server/.eslintrc | 6 + typescript/ccip-server/.gitignore | 4 + typescript/ccip-server/README.md | 45 + typescript/ccip-server/jest.config.js | 5 + typescript/ccip-server/package.json | 38 + .../ccip-server/src/abis/ProofsServiceAbi.ts | 7 + .../src/abis/TelepathyCcipReadIsmAbi.ts | 7 + typescript/ccip-server/src/config.ts | 23 + typescript/ccip-server/src/server.ts | 28 + .../src/services/HyperlaneService.ts | 36 + .../src/services/LightClientService.ts | 99 + .../ccip-server/src/services/ProofsService.ts | 149 + .../ccip-server/src/services/RPCService.ts | 47 + .../services/__mocks__/HyperlaneService.ts | 25 + .../services/__mocks__/LightClientService.ts | 27 + .../src/services/__mocks__/RPCService.ts | 13 + .../src/services/common/ProofStatusEnum.ts | 8 + .../tests/services/HyperlaneService.test.ts | 18 + .../tests/services/LightClientService.test.ts | 29 + .../tests/services/ProofsService.test.ts | 77 + .../tests/services/RPCService.test.ts | 18 + yarn.lock | 5566 ++++++++++++++++- 23 files changed, 6088 insertions(+), 212 deletions(-) create mode 100644 solidity/test/test-data/getProof-data.json create mode 100644 typescript/ccip-server/.eslintrc create mode 100644 typescript/ccip-server/.gitignore create mode 100644 typescript/ccip-server/README.md create mode 100644 typescript/ccip-server/jest.config.js create mode 100644 typescript/ccip-server/package.json create mode 100644 typescript/ccip-server/src/abis/ProofsServiceAbi.ts create mode 100644 typescript/ccip-server/src/abis/TelepathyCcipReadIsmAbi.ts create mode 100644 typescript/ccip-server/src/config.ts create mode 100644 typescript/ccip-server/src/server.ts create mode 100644 typescript/ccip-server/src/services/HyperlaneService.ts create mode 100644 typescript/ccip-server/src/services/LightClientService.ts create mode 100644 typescript/ccip-server/src/services/ProofsService.ts create mode 100644 typescript/ccip-server/src/services/RPCService.ts create mode 100644 typescript/ccip-server/src/services/__mocks__/HyperlaneService.ts create mode 100644 typescript/ccip-server/src/services/__mocks__/LightClientService.ts create mode 100644 typescript/ccip-server/src/services/__mocks__/RPCService.ts create mode 100644 typescript/ccip-server/src/services/common/ProofStatusEnum.ts create mode 100644 typescript/ccip-server/tests/services/HyperlaneService.test.ts create mode 100644 typescript/ccip-server/tests/services/LightClientService.test.ts create mode 100644 typescript/ccip-server/tests/services/ProofsService.test.ts create mode 100644 typescript/ccip-server/tests/services/RPCService.test.ts diff --git a/solidity/test/test-data/getProof-data.json b/solidity/test/test-data/getProof-data.json new file mode 100644 index 0000000000..73744c40e3 --- /dev/null +++ b/solidity/test/test-data/getProof-data.json @@ -0,0 +1,25 @@ +{ + "address": "0x3ef546f04a1b24eaf9dce2ed4338a1b5c32e2a56", + "balance": "0x0", + "codeHash": "0x2a5a7c6a053518aea9c1affe22c95e2e692204d39c9bdb0826de5012e7c93c4d", + "nonce": "0x1", + "storageHash": "0x3f85413bd5bccd8348f123724fb024c5fbab1ab934b0a7485202f75d84803743", + "accountProof": [ + "0xf90211a0857923ed0df1a7e89c6c157d9f228ca778b5028cce0fe977bbacdc29ebdcbe1da04cc511d34d843e5ed02112368d4885e8bc25e8e394abbc526459f4e38b842737a07f59950cdd53d4bb97096bbd99e7c04a5d21a97dac8a049f9b308610ea66c98fa02b8ce5f6b67ac79c8947b1919460f7bed77488762c059e5e88c64dfc722aaa56a03521e9571b798e0f86681b9ce0f0e9bf698e9059542d778cc4cde5659a31f9d2a0b90c6a5217bfd233f103dba76e18067f90001297c801cb6feb0c1f7912e0a522a0831099c940ebe93be0a1044566150044d22a8d414518eeb5d919d05468c8f510a054a09da1ca52551a35be75a623e419840060f2e56f86eb3678a689f66b38051da05945b528b186c0162d7cbfa281d30a361ece2a9f1788b33e7fda6bd7c3c5eb07a0401c3ac89520c5a59a19086e82314bb30ad2ecc5ddce09cdf613dd19adb41feca031e6288dc6db773d11cd579b974658473547abfcd82531cf1833484079baff58a099184994c461f1d6ce42e5e91ac66d6c6a5b4cc7ed845f058b795005b46328c1a054bde23ceae3fe9564654f16f867f3f321e0b7e16e3b08e925beb5fb5ffcb1fda040f8d48347ec397a261b090c7e3506f939b6033993c2836c24a487318310da67a0a6e90ed0e95843baeec2c8a6a017e61702556b67ca90c9576342fe268d0a9edba0ca8b4b3ea82cc66299ee45708b555de9b6272d3df24cb472c7baffaa72b39a0d80", + "0xf90211a0d124c71cf01214346e6facb7cd9e7743fca3a36f4252045573e37dd5b1fc208aa09318652584a16019f80279509f3133ee0f6fed3d391c1c0522b590b923b9283fa0fc90168fe3e76ff17c23781513065c71d13b5f963e492106f2b9a05ed1c9e3dca0c919acc2a76e4fef630534efea6f77a197646db3823ff861c430944385391672a0708cd1310ea8f59c163d0d7b905b456ed377000e989a343dbc61523ec4da6de3a0ade6811b1e1dc547362bfb0cdc943d6ae5d8283252f1e73d3000176a24ed8320a0effada816260fe1f7053c9c6f0cb49e0ee5ebb72be8a05f0cbcad3e7c95dd518a087d09c9bd032f470eed0637da12daa8e6d7c52102d51e87dfdecfdd0f01fc665a0d830bd0ebb1b7d0ddc716138e4341e64fa0c96d4330ac643c3306a842fdfb72ea05fb1c8a24c36a2ccae1ab7c39c0efdf56325dbc5de011f3c548827d592bd7f3ba0e127892391fcf8d6640c45c518ea6f1014b6983586e97e3ec4ae0e546ac22696a0573a0337bba203efa7a2ba3fab1a145e3cfd3b7a70d096489c2c549f9abad184a0daeb93e98ba67210f9e62088838adf7b2e83caa8ec9902e669095066f5abd1f4a0907a2f066f7bad1ebb9ba8998e217c82b2169336daa0f4c0db3b8ac05ad59fc5a03ac759b9a285ceb7293f13071d838261585bb87ae6a8c5489d13b7a818a60e8ea042abb78fd5f125d0dfd6ea10da83f064ed39920c3616e97b7810ee1f306559ec80", + "0xf90211a0316755c60ab5ac6d1ca0ce7fc7131544cb41bb5907b6c44b0659731c5196f505a0f4d87833b3b7fdb40011cd61f5e4fddf82a99e195e15a6650310d59f276111aba04c923074395b960cd08d04910a3c14ec3cb7d1ae858f9aef5cc888e6e03fbfb8a07c9d54b33c8a9db1e3efe12d0adb042d741fa2f2bccab2bf7d0afcb03626fba8a066400964da5b44e27fadbac20d48cfafc511c3c6bfaa68c1b92ae215e914f61ca038e0e323e92c7a20aaf13c302a493a5241c52a2c169aaaf8d48d23e17f44f643a0646a80b8ac762550cf167377f0837a5993536789eb065369829fd3b13bb52cc5a0de5c001063a09ee8b228199fcd393226a04ac68bc38f600729f7af2305c10368a035cb84ac8c8bb1ddb01e3377a7a17e22e23de20c89f4fa1bd7997bdc0421516aa01a598f35bf00309ed051c4096b8aac157d3411013211b2df2a02a8246eb5d0b6a0fab8ac4cedece1fe1ba89c617413a8df9a28e287e32f92bc52db1485ebb2396ea036f69b2bdc01e9b90102d5df53f9c02f3474db4f613f91d13c46f341b9fb9746a0d0bda7e73681df8b78903454ae252ebd8d34e48af88aa0ad18d6c2fb86a99d89a00d98621a3d3071cc04c492fd2c666637f27138eea11b83f516467f33a00b5eefa0198f566c5350232b08192dfe9cb7dd0a07b21c15638a80f912114a2b5c96be59a035092d3d51e3cd65ad2dcdb2d6c19aadb63a944ac9cedb7093ea68be58b7d83e80", + "0xf90211a0a7aea3e55e49172a7da1f511fceb247072cb0b4d8a87d9cd5cde0bc87046665ca08a057cd8f49b6ad4841f8e23b81706b8a424eb092663e4e1e60f98dba1e07e44a064098aa80e0d7e101f4e87fa5983f9a43ff6c26d8adaafea0c8f745e0fb9099aa09a5ec75b929e80a80ae115a1aec2827dcdb3eec116fce7a805eebe02d51ff3d7a027c8ef5bfc576ad5e7577005716a18d16ae203c440d65e12a9581a252b9f0e4ba01d352d5770faf1ab8a8096739876d9af10846effbd5f0a4bbb3a53bcb687fc9ca0a9da86853b0a80f1be569b6563aa35e8ab5d635132836b9dc95952b83192bdd3a0aa42135324b35a446ec3620ab361bb98d4636ebd2774715f142550b66cb5c723a0cc9734326b403f694d73ee6dd774e56c5675428ebf24b2ec28b319146f0d1ebda0a0d2c0664e654776405127a978a6edf6c249a71e94747158b2cae156b795b9eaa07a5811d019afead667944b567e595b7ef6084036be9bfde82097a479f3b9d01ca009e0186fe2bbb6f5f8399fabcbda45902405241f25b34352ff7ec66c78fa124aa0cacc8baa6b996e057fe8abaa433f50ba5f9b7afd501a1dbb8b952371e4b604efa081e453659b14017d3f3492fecfa4e9b3a03b8b8d3236fd2c3082c9abf528b6aca030e4ddd56b0b072e820f1afd7bd32cf5cf06f92d69231cbdc236a968c1f43283a0961d902b6b6ee68fb1d75a633a76786a7783f7603f8812ada01f865639e9daf880", + "0xf90211a045376ea7070c6b6bba71480a083c5ee916a4c72aa89ddc0539f69ca2f951ce96a0786afe5e76d004a35a17fb7931e70f40b0ce3a57e5246c94ebc4629e0a61e5bca0ce44e7e569e415dc667a71d212d260023fee99415bd0bcfd1e5aeee1cdbd8ec9a051cabbabc99fbd009590821598f342f3c2606a4241c81c46dd7e65c18d9ee098a0dbae505b1ce907ff5d451c5d113736ed911b239897d1f6887d3350da314f174ba047f6b90756987d0268044b85bc44da5a34e988044014a6c27cf62d185c7b46e9a0f7566eb4d5c9bc2361ecfffe8fc6a5ac5b5b9380c8b8152284cd714d44e79b12a0cc4a7ee9c4e83d67d64a9bfb0aec93cc3b8966c235b5b65f17333832b023a464a00b9024cfba692f2385d58ea3dca746f9e062982fb21f6f16ead2cefb70d25657a0d187348c2d25747788855d8094ce6e3df6940e26dca20cec4cc26e4f2292ee67a0355474e9a646331b74d171dd023e68f7c50f4bc1257a6433ee01a9ea8ce1577aa096f7bfa110a35e95127808a58ec44f3478b8b67f98ff3b8b140a3e9d249a6deba0dac2dea453ebb23f8a6a8a82db61ca160792aa967db905d98ee0dbcb2b81ef88a0bf7bac1cc4c2e30b47c5bc62ef9aedba995e46ad0432cf78cc8ec064ebf62ec7a0a0b931ee3c50545a4f91864c9501fb02eaa879ab02e4f677b11a1667d42cd55ca0654f679d8743df36bb61fe7eecca444d1a1773435b876fcafadd36c1c9bfe24980", + "0xf901d1a0c6d1570250983b95bd625c871d0627cc5bf6557738904ec34f6ce54c4d4782dba098975098243c73d0de47c1e3edf85d54a2010b50e85ffdac2192cc71484993e0a028e68d0c580151049649c5c882ddc4fa3f946f832b6fe34f210420f82ad18e0c80a0a0c6abc7c7b8c738ddb43a72c19c6a0dc4eee7808e4653d2ac67d5d777c5cfe8a0a3843b012a7d6170298a6e0024a79e466614296d4d09a72876be8049294d7dcfa02370c2a2892d2eacc15cdc46cef02125499df7afe41a16af6ce78d5fb8d5a7b9a0e9c8fa9b7269050b18b76ac5f07847e93e2403a438783e27bb69bb89484a7a52a08a7fef1f6d80c56ae256362f9de34169d3d66b17a8f0be6dbd0fe82c31a0c4da80a081b05ed42fc65a32afabe8f3ab58eedc8658472f383150e4c631ce1b3a36bacda04fe5deb98851372cb69ab014dba185f1c488ccd9810b4998d7737d0bee884718a0c8d739dcf5707542a9f751ec6a0acb228f28e55659c35973ee8a46aefa9a7a4fa0f0128b39c576d4e23e8180b154d7e8f7031a7d6775191188c87cc11573730008a0d391bf99084848ebff2c014653ec6f9634c80b1115850174cdf0edf83669b073a031d14af58dae3d2fdf510a3c48e988b860d1bfe406e6365be92252d63f4c316080", + "0xf8679e20bc9ed3e4003248a3f81d89ecc98e14f0359535a5195a1d33a6fe19556bb846f8440180a03f85413bd5bccd8348f123724fb024c5fbab1ab934b0a7485202f75d84803743a02a5a7c6a053518aea9c1affe22c95e2e692204d39c9bdb0826de5012e7c93c4d" + ], + "storageProof": [ + { + "key": "0x02c1eed75677f1bd39cc3abdd3042974bf12ab4a12ecc40df73fe3aa103e5e0e", + "proof": [ + "0xf844a120443dd0be11dd8e645a2e5675fd62011681443445ea8b04c77d2cdeb1326739eca1a031ede38d2e93c5aee49c836f329a626d8c6322abfbff3783e82e5759f870d7e9" + ], + "value": "0x31ede38d2e93c5aee49c836f329a626d8c6322abfbff3783e82e5759f870d7e9" + } + ] +} diff --git a/typescript/ccip-server/.eslintrc b/typescript/ccip-server/.eslintrc new file mode 100644 index 0000000000..05936cd4e4 --- /dev/null +++ b/typescript/ccip-server/.eslintrc @@ -0,0 +1,6 @@ +{ + "rules": { + "no-console": ["off"] + } + } + \ No newline at end of file diff --git a/typescript/ccip-server/.gitignore b/typescript/ccip-server/.gitignore new file mode 100644 index 0000000000..66abda2f13 --- /dev/null +++ b/typescript/ccip-server/.gitignore @@ -0,0 +1,4 @@ +.env* +/dist +/cache +/configs \ No newline at end of file diff --git a/typescript/ccip-server/README.md b/typescript/ccip-server/README.md new file mode 100644 index 0000000000..915acfd999 --- /dev/null +++ b/typescript/ccip-server/README.md @@ -0,0 +1,45 @@ +# CCIP-read service framework + +This package contains the service framework for the CCIP-read project, built off of the [CCIP-server framework](https://github.com/smartcontractkit/ccip-read). It allows building of any execution logic, given a Hyperlane Relayer call. + +# Definitions + +- Server: The main entry point, and refers to `server.ts`. +- Service: A class that handles all logic for a particular service, e.g. ProofService, RPCService, etc. +- Service ABI: The interface for a service that tells the Server what input and output to expect. It serves similar functionalities as the Solidity ABIs, i.e., used for encoding and decoding data. + +# Usage + +The Relayer will make a POST request to the Server with a request body similar to the following: + +```json +{ + "data": "0x0ee9bb2f000000000000000000000000873afca0319f5c04421e90e882566c496877aff8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a2d9059b6d822aa460229510c754e9ecec100bb9f649186f5c7d4da8edf59858", + "sender": "0x4a679253410272dd5232b3ff7cf5dbb88f295319" +} +``` + +The `data` property will be ABI-encoded, and server will parse it according to the Service ABI. It then will call the handler function with the parsed input. + +# Building a Service + +1. Create a Service ABI for your Service. This ABI tells the Server how to parse the incoming `data`, and how to encode the output. See `/abi/ProofsServiceAbi.ts` for an example. +2. Create a new Service class to handle your logic. This should inherit from `HandlerDescriptionEnumerated` if a function will be used to handle a Server request. The handler function should return a Promise that resolves to the output of the Service. See `/service/ProofsService.ts` for examples. +3. Instantiate the new Service in `server.ts`. For example: + +```typescript +const proofsService = new ProofsService( + config.LIGHT_CLIENT_ADDR, + config.RPC_ADDRESS, + config.STEP_FN_ID, + config.CHAIN_ID, + config.SUCCINCT_PLATFORM_URL, + config.SUCCINCT_API_KEY, +); +``` + +4. Add the new Service by calling `server.add(...)` by providing the Service ABI, and the handler function. For example: + +```typescript +server.add(ProofsServiceAbi, [proofsService.handler('getProofs')]); +``` diff --git a/typescript/ccip-server/jest.config.js b/typescript/ccip-server/jest.config.js new file mode 100644 index 0000000000..3745fc2237 --- /dev/null +++ b/typescript/ccip-server/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +}; diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json new file mode 100644 index 0000000000..46a4a4ebb1 --- /dev/null +++ b/typescript/ccip-server/package.json @@ -0,0 +1,38 @@ +{ + "name": "@hyperlane-xyz/ccip-server", + "version": "0.0.0", + "description": "CCIP server", + "typings": "dist/index.d.ts", + "typedocMain": "src/index.ts", + "private": true, + "files": [ + "src" + ], + "engines": { + "node": ">=14" + }, + "scripts": { + "start": "ts-node src/server.ts", + "dev": "nodemon src/server.ts", + "test": "jest", + "prettier": "prettier --write ./src/* ./tests/" + }, + "author": "brolee", + "license": "Apache-2.0", + "devDependencies": { + "@jest/globals": "^29.7.0", + "@types/node": "^16.9.1", + "jest": "^29.7.0", + "nodemon": "^3.0.3", + "prettier": "^2.8.8", + "ts-jest": "^29.1.2", + "ts-node": "^10.8.0", + "typescript": "5.1.6" + }, + "dependencies": { + "@chainlink/ccip-read-server": "^0.2.1", + "dotenv-flow": "^4.1.0", + "ethers": "5.7.2", + "hyperlane-explorer": "https://github.com/hyperlane-xyz/hyperlane-explorer.git" + } +} diff --git a/typescript/ccip-server/src/abis/ProofsServiceAbi.ts b/typescript/ccip-server/src/abis/ProofsServiceAbi.ts new file mode 100644 index 0000000000..d9960c21da --- /dev/null +++ b/typescript/ccip-server/src/abis/ProofsServiceAbi.ts @@ -0,0 +1,7 @@ +// This is the ABI for the ProofsService. +// This is used to 1) Select the function 2) encode output +const ProofsServiceAbi = [ + 'function getProofs(address, bytes32, uint256) public view returns (string[][])', +]; + +export { ProofsServiceAbi }; diff --git a/typescript/ccip-server/src/abis/TelepathyCcipReadIsmAbi.ts b/typescript/ccip-server/src/abis/TelepathyCcipReadIsmAbi.ts new file mode 100644 index 0000000000..68a61a543f --- /dev/null +++ b/typescript/ccip-server/src/abis/TelepathyCcipReadIsmAbi.ts @@ -0,0 +1,7 @@ +const TelepathyCcipReadIsmAbi = [ + 'function verify(bytes, bytes) public view returns (bool)', + 'function step(uint256) external', + 'function syncCommitteePoseidons(uint256) external view returns (bytes32)', +]; + +export { TelepathyCcipReadIsmAbi }; diff --git a/typescript/ccip-server/src/config.ts b/typescript/ccip-server/src/config.ts new file mode 100644 index 0000000000..f5fa74658a --- /dev/null +++ b/typescript/ccip-server/src/config.ts @@ -0,0 +1,23 @@ +import dotenvFlow from 'dotenv-flow'; + +dotenvFlow.config(); + +const RPC_ADDRESS = process.env.RPC_ADDRESS as string; +const LIGHT_CLIENT_ADDR = process.env.LIGHT_CLIENT_ADDR as string; +const STEP_FN_ID = process.env.STEP_FN_ID as string; +const CHAIN_ID = process.env.CHAIN_ID as string; +const SUCCINCT_PLATFORM_URL = process.env.SUCCINCT_PLATFORM_URL as string; +const SUCCINCT_API_KEY = process.env.SUCCINCT_API_KEY as string; +const SERVER_PORT = process.env.SERVER_PORT as string; +const SERVER_URL_PREFIX = process.env.SERVER_URL_PREFIX as string; + +export { + RPC_ADDRESS, + LIGHT_CLIENT_ADDR, + STEP_FN_ID, + CHAIN_ID, + SUCCINCT_PLATFORM_URL, + SUCCINCT_API_KEY, + SERVER_PORT, + SERVER_URL_PREFIX, +}; diff --git a/typescript/ccip-server/src/server.ts b/typescript/ccip-server/src/server.ts new file mode 100644 index 0000000000..ddd2fa330d --- /dev/null +++ b/typescript/ccip-server/src/server.ts @@ -0,0 +1,28 @@ +import { Server } from '@chainlink/ccip-read-server'; + +import { ProofsServiceAbi } from './abis/ProofsServiceAbi'; +import * as config from './config'; +import { ProofsService } from './services/ProofsService'; + +// Initalize Services +const proofsService = new ProofsService( + config.LIGHT_CLIENT_ADDR, + config.RPC_ADDRESS, + config.STEP_FN_ID, + config.CHAIN_ID, + config.SUCCINCT_PLATFORM_URL, + config.SUCCINCT_API_KEY, +); + +// Initalize Server and add Service handlers +const server = new Server(); + +server.add(ProofsServiceAbi, [ + { type: 'getProofs', func: proofsService.getProofs.bind(this) }, +]); + +// Start Server +const app = server.makeApp(config.SERVER_URL_PREFIX); +app.listen(config.SERVER_PORT, () => + console.log(`Listening on port ${config.SERVER_PORT}`), +); diff --git a/typescript/ccip-server/src/services/HyperlaneService.ts b/typescript/ccip-server/src/services/HyperlaneService.ts new file mode 100644 index 0000000000..2898a386ed --- /dev/null +++ b/typescript/ccip-server/src/services/HyperlaneService.ts @@ -0,0 +1,36 @@ +import { info } from 'console'; +import { Message, MessageTx } from 'hyperlane-explorer/src/types'; + +// These types are copied from hyperlane-explorer. TODO: export them so this file can use them directly. +interface ApiResult { + status: '0' | '1'; + message: string; + result: R; +} + +enum API_ACTION { + GetMessages = 'get-messages', +} + +class HyperlaneService { + constructor(readonly baseUrl: string) {} + + /** + * Makes a request to the Explorer API to get the block info by message Id. Throws if request fails, or no results + * @param id: Message id to look up + */ + async getOriginBlockByMessageId(id: string): Promise { + info(`Fetching block for id: ${id}`); + const response = await fetch( + `${this.baseUrl}?module=message&action=${API_ACTION.GetMessages}&id=${id}`, + ); + const responseAsJson: ApiResult = await response.json(); + if (responseAsJson.status === '1') { + return responseAsJson.result[0]?.origin; + } else { + throw new Error(responseAsJson.message); + } + } +} + +export { HyperlaneService }; diff --git a/typescript/ccip-server/src/services/LightClientService.ts b/typescript/ccip-server/src/services/LightClientService.ts new file mode 100644 index 0000000000..3d5238b94b --- /dev/null +++ b/typescript/ccip-server/src/services/LightClientService.ts @@ -0,0 +1,99 @@ +import { ethers, utils } from 'ethers'; + +import { TelepathyCcipReadIsmAbi } from '../abis/TelepathyCcipReadIsmAbi'; + +import { ProofStatus } from './common/ProofStatusEnum'; + +export type SuccinctConfig = { + readonly lightClientAddress: string; + readonly stepFunctionId: string; + readonly platformUrl: string; + readonly apiKey: string; +}; + +// Service that interacts with the LightClient/ISM +class LightClientService { + constructor( + private readonly lightClientContract: ethers.Contract, // TODO USE TYPECHAIN + private succinctConfig: SuccinctConfig, + ) {} + + private getSyncCommitteePeriod(slot: bigint): bigint { + return slot / 8192n; // Slots Per Period + } + + /** + * Gets syncCommitteePoseidons from ISM/LightClient + * @param slot + * @returns + */ + async getSyncCommitteePoseidons(slot: bigint): Promise { + return await this.lightClientContract.syncCommitteePoseidons( + this.getSyncCommitteePeriod(slot), + ); + } + + /** + * Calculates the slot given a timestamp, and the LightClient's configured Genesis Time and Secods Per Slot + * @param timestamp timestamp to calculate slot with + */ + async calculateSlot(timestamp: bigint): Promise { + return ( + (timestamp - (await this.lightClientContract.GENESIS_TIME())) / + (await this.lightClientContract.SECONDS_PER_SLOT()) + ); + } + + /** + * Request the proof from Succinct. + * @param slot + * @param syncCommitteePoseidon + */ + async requestProof( + syncCommitteePoseidon: string, + slot: bigint, + ): Promise { + console.log(`Requesting proof for${slot}`); + + // Note that Succinct will asynchronously call step() on the ISM/LightClient + const telepathyIface = new utils.Interface(TelepathyCcipReadIsmAbi); + + const body = { + chainId: this.lightClientContract.chainId, + to: this.lightClientContract.address, + data: telepathyIface.encodeFunctionData('step', [slot]), + functionId: this.lightClientContract.stepFunctionId, + input: utils.defaultAbiCoder.encode( + ['bytes32', 'uint64'], + [syncCommitteePoseidon, slot], + ), + retry: true, + }; + + const response = await fetch( + `${this.lightClientContract.platformUrl}/new`, + { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${this.succinctConfig.apiKey}`, + }, + body: JSON.stringify(body), + }, + ); + const responseAsJson = await response.json(); + + return responseAsJson.proof_id; + } + + // @dev in the case of when a proof doesn't exist, the request returns an object of { error: 'failed to get proof' }. + // Example: GET https://alpha.succinct.xyz/api/proof/4dfd2802-4edf-4c4f-91db-b2d05eb69791 + async getProofStatus(proofId: string): Promise { + const response = await fetch( + `${this.lightClientContract.platformUrl}/${proofId}`, + ); + const responseAsJson = await response.json(); + return responseAsJson.status ?? ProofStatus.error; + } +} + +export { LightClientService, ProofStatus }; diff --git a/typescript/ccip-server/src/services/ProofsService.ts b/typescript/ccip-server/src/services/ProofsService.ts new file mode 100644 index 0000000000..1d05e7a3f7 --- /dev/null +++ b/typescript/ccip-server/src/services/ProofsService.ts @@ -0,0 +1,149 @@ +import { ethers } from 'ethers'; + +import { TelepathyCcipReadIsmAbi } from '../abis/TelepathyCcipReadIsmAbi'; + +import { HyperlaneService } from './HyperlaneService'; +import { LightClientService, SuccinctConfig } from './LightClientService'; +import { RPCService } from './RPCService'; +import { ProofResult } from './RPCService'; +import { ProofStatus } from './common/ProofStatusEnum'; + +type RPCConfig = { + readonly url: string; + readonly chainId: string; +}; + +type HyperlaneConfig = { + readonly url: string; +}; + +// Service that requests proofs from Succinct and RPC Provider +class ProofsService { + // Maps from pendingProofKey to pendingProofId + pendingProof = new Map(); + + // External Services + rpcService: RPCService; + lightClientService: LightClientService; + hyperlaneService: HyperlaneService; + + constructor( + succinctConfig: Required, + rpcConfig: Required, + hyperlaneConfig: Required, + ) { + this.rpcService = new RPCService(rpcConfig.url); + const lightClientContract = new ethers.Contract( + succinctConfig.lightClientAddress, + TelepathyCcipReadIsmAbi, + this.rpcService.provider, + ); + + this.lightClientService = new LightClientService( + lightClientContract, + succinctConfig, + ); + + this.hyperlaneService = new HyperlaneService(hyperlaneConfig.url); + } + + /** + * Requests the Succinct proof, state proof, and returns account and storage proof + * @dev Upon requesting Succinct Proof, this function will revert to force the relayer to re-check the pending proof + * @param target contract address to get the proof for + * @param storageKeys storage keys to get the proof for + * @param messageId messageId that will be used to get the block info from hyperlane + * @returns The account and a single storage proof + */ + async getProofs([ + target, + storageKey, + messageId, + ]: ethers.utils.Result): Promise> { + const proofs: Array<[string[], string[]]> = []; + const pendingProofKey = this.getPendingProofKey( + target, + storageKey, + messageId, + ); + if (!this.pendingProof.has(pendingProofKey)) { + // Request a Proof from Succinct + const pendingProofId = await this.requestProofFromSuccinct(messageId); + this.pendingProof.set(pendingProofKey, pendingProofId); + this.forceRelayerRecheck(); + } else { + // Proof is being generated, check status + const proofStatus = await this.lightClientService.getProofStatus( + this.pendingProof.get(pendingProofKey)!, + ); + if (proofStatus === ProofStatus.success) { + // Succinct Proof is ready. + // This means that the LightClient should have the latest state root. Fetch and return the storage proofs from eth_getProof + proofs.push(await this.getStorageProofs(target, storageKey, messageId)); + this.pendingProof.delete(pendingProofKey); + } else { + this.forceRelayerRecheck(); + } + } + // TODO Write tests to check proofs + return proofs; + } + + /** + * Requests the Succinct proof + * @param messageId messageId that will be used to get the block info from hyperlane + * @returns the proofId + */ + async requestProofFromSuccinct(messageId: string) { + const { timestamp } = await this.hyperlaneService.getOriginBlockByMessageId( + messageId, + ); + const slot = await this.lightClientService.calculateSlot(BigInt(timestamp)); + const syncCommitteePoseidon = ''; // TODO get from LC + return await this.lightClientService.requestProof( + syncCommitteePoseidon, + slot, + ); + } + + /** + * Gets the account and single storage proof from eth_getProof + * @param target contract address to get the proof for + * @param storageKeys storage keys to get the proof for + * @param messageId messageId that will be used to get the block info from hyperlane + * @returns The account and a single storage proof + */ + async getStorageProofs( + target: string, + storageKey: string, + messageId: string, + ): Promise<[string[], string[]]> { + const { blockNumber } = + await this.hyperlaneService.getOriginBlockByMessageId(messageId); + const { accountProof, storageProof }: ProofResult = + await this.rpcService.getProofs( + target, + [storageKey], + new Number(blockNumber).toString(16), // Converts to hexstring + ); + + return [accountProof, storageProof[0].proof]; // Since we only expect one storage key, we only return the first proof + } + + getPendingProofKey( + target: string, + storageKey: string, + messageId: string, + ): string { + return ethers.utils.defaultAbiCoder.encode( + ['string', 'string', 'string'], + [target, storageKey, messageId], + ); + } + + forceRelayerRecheck(): void { + throw new Error('Proof is not ready'); + } +} + +export { ProofsService }; diff --git a/typescript/ccip-server/src/services/RPCService.ts b/typescript/ccip-server/src/services/RPCService.ts new file mode 100644 index 0000000000..353e5af707 --- /dev/null +++ b/typescript/ccip-server/src/services/RPCService.ts @@ -0,0 +1,47 @@ +import { ethers } from 'ethers'; + +type ProofResultStorageProof = { + key: string; + proof: Array; + value: string; +}; + +type ProofResult = { + accountProof: Array; + storageProof: Array; + address: string; + balance: string; + codeHash: string; + nonce: string; + storageHash: string; +}; + +class RPCService { + provider: ethers.providers.JsonRpcProvider; + constructor(private readonly providerAddress: string) { + this.provider = new ethers.providers.JsonRpcProvider(this.providerAddress); + } + + /** + * Request state proofs using eth_getProofs + * @param address + * @param storageKeys + * @param block + * @returns + */ + async getProofs( + address: string, + storageKeys: string[], + block: string, + ): Promise { + const results = await this.provider.send('eth_getProof', [ + address, + storageKeys, + block, + ]); + + return results; + } +} + +export { RPCService, ProofResult }; diff --git a/typescript/ccip-server/src/services/__mocks__/HyperlaneService.ts b/typescript/ccip-server/src/services/__mocks__/HyperlaneService.ts new file mode 100644 index 0000000000..b197fc3f87 --- /dev/null +++ b/typescript/ccip-server/src/services/__mocks__/HyperlaneService.ts @@ -0,0 +1,25 @@ +import { MessageTx } from 'hyperlane-explorer/src/types'; + +class HyperlaneService { + async getOriginBlockByMessageId(id: string): Promise { + return { + timestamp: 123456789, + hash: '0x123abc456def789', + from: '0x9876543210abcdef', + to: '0xabcdef0123456789', + blockHash: '0x456789abc123def', + blockNumber: 12345, + mailbox: '0xabcdef0123456789', + nonce: 0, + gasLimit: 1000000, + gasPrice: 100, + effectiveGasPrice: 90, + gasUsed: 50000, + cumulativeGasUsed: 1234567, + maxFeePerGas: 150, + maxPriorityPerGas: 100, + }; + } +} + +export { HyperlaneService }; diff --git a/typescript/ccip-server/src/services/__mocks__/LightClientService.ts b/typescript/ccip-server/src/services/__mocks__/LightClientService.ts new file mode 100644 index 0000000000..097cb57ff1 --- /dev/null +++ b/typescript/ccip-server/src/services/__mocks__/LightClientService.ts @@ -0,0 +1,27 @@ +// TODO figure out why I cannot import this from LightClientService. +enum ProofStatus { + running = 'running', + success = 'success', + error = 'error', +} + +class LightClientService { + proofStatus: ProofStatus = ProofStatus.running; + async calculateSlot(timestamp: bigint): Promise { + return ( + (timestamp - 1606824023n) / 12n // (timestamp - GENESIS TIME) / SLOTS_PER_SECOND + ); + } + + async requestProof( + syncCommitteePoseidon: string, + slot: BigInt, + ): Promise { + return 'pendingProofId12'; + } + async getProofStatus(pendingProofId: string): Promise { + return ProofStatus.success; + } +} + +export { LightClientService }; diff --git a/typescript/ccip-server/src/services/__mocks__/RPCService.ts b/typescript/ccip-server/src/services/__mocks__/RPCService.ts new file mode 100644 index 0000000000..801c93bdbb --- /dev/null +++ b/typescript/ccip-server/src/services/__mocks__/RPCService.ts @@ -0,0 +1,13 @@ +import ETH_GET_PROOFS from '../../../../../solidity/test/test-data/getProof-data.json'; + +class RPCService { + getProofs = async ( + address: string, + storageKeys: string[], + block: string, + ): Promise => { + return ETH_GET_PROOFS; + }; +} + +export { RPCService }; diff --git a/typescript/ccip-server/src/services/common/ProofStatusEnum.ts b/typescript/ccip-server/src/services/common/ProofStatusEnum.ts new file mode 100644 index 0000000000..aa1b593bd7 --- /dev/null +++ b/typescript/ccip-server/src/services/common/ProofStatusEnum.ts @@ -0,0 +1,8 @@ +// Needs to be in its own file because Mocks will mock the entire file +enum ProofStatus { + running = 'running', + success = 'success', + error = 'error', +} + +export { ProofStatus }; diff --git a/typescript/ccip-server/tests/services/HyperlaneService.test.ts b/typescript/ccip-server/tests/services/HyperlaneService.test.ts new file mode 100644 index 0000000000..894f377107 --- /dev/null +++ b/typescript/ccip-server/tests/services/HyperlaneService.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, test } from '@jest/globals'; + +import { HyperlaneService } from '../../src/services/HyperlaneService'; + +describe('HyperlaneServiceTest', () => { + let hyperlaneService: HyperlaneService; + beforeEach(() => { + hyperlaneService = new HyperlaneService( + 'https://explorer.hyperlane.xyz/api', + ); + }); + test('should get the block by messageId', async () => { + await hyperlaneService.getOriginBlockByMessageId( + '0xb0430e396f4014883c01bb3ee43df17ce93d8257a0a0b5778d9d3229a1bf02bb', + ); + expect(true).toBe(true); + }); +}); diff --git a/typescript/ccip-server/tests/services/LightClientService.test.ts b/typescript/ccip-server/tests/services/LightClientService.test.ts new file mode 100644 index 0000000000..4541762096 --- /dev/null +++ b/typescript/ccip-server/tests/services/LightClientService.test.ts @@ -0,0 +1,29 @@ +import { describe, expect, jest, test } from '@jest/globals'; +import { ethers } from 'ethers'; + +import { TelepathyCcipReadIsmAbi } from '../../src/abis/TelepathyCcipReadIsmAbi'; +import { LightClientService } from '../../src/services/LightClientService'; +import { RPCService } from '../../src/services/RPCService'; + +describe('LightClientService', () => { + let lightClientService: LightClientService; + beforeEach(() => { + const rpcService = new RPCService('http://localhost:8545'); + const lightClientContract = new ethers.Contract( + 'lightClientAddress', + TelepathyCcipReadIsmAbi, + rpcService.provider, + ); + lightClientService = new LightClientService(lightClientContract, { + lightClientAddress: ethers.constants.AddressZero, + stepFunctionId: ethers.constants.HashZero, + platformUrl: 'http://localhost:8080', + apiKey: 'apiKey', + }); + + jest.resetModules(); + }); + test('should return the correct proof status', () => { + expect(lightClientService.calculateSlot(1n)).toBeGreaterThan(0); + }); +}); diff --git a/typescript/ccip-server/tests/services/ProofsService.test.ts b/typescript/ccip-server/tests/services/ProofsService.test.ts new file mode 100644 index 0000000000..be063e9185 --- /dev/null +++ b/typescript/ccip-server/tests/services/ProofsService.test.ts @@ -0,0 +1,77 @@ +import { describe, expect, jest, test } from '@jest/globals'; +import { ethers } from 'ethers'; + +// import { LightClientService } from '../../src/services/LightClientService'; +import { ProofsService } from '../../src/services/ProofsService'; + +// Fixtures +jest.mock('../../src/services/HyperlaneService'); +jest.mock('../../src/services/LightClientService'); +jest.mock('../../src/services/RPCService'); + +describe('ProofsService', () => { + const TARGET_ADDR = 'targetAddress'; + const MESSAGE_ID = 'msgId'; + const STORAGE_KEY = ethers.utils.formatBytes32String('10'); + let proofsService: ProofsService; + let pendingProofKey: string; + + beforeEach(() => { + proofsService = new ProofsService( + { + lightClientAddress: ethers.constants.AddressZero, + stepFunctionId: ethers.constants.HashZero, + platformUrl: 'http://localhost:8080', + apiKey: 'apiKey', + }, + { + url: 'http://localhost:8545', + chainId: '1337', + }, + { + url: 'http://localhost:8545', + }, + ); + pendingProofKey = proofsService.getPendingProofKey( + TARGET_ADDR, + STORAGE_KEY, + MESSAGE_ID, + ); + jest.clearAllMocks(); + }); + + test('should set currentProofId, if proof is not ready', async () => { + try { + await proofsService.getProofs([TARGET_ADDR, STORAGE_KEY, MESSAGE_ID]); + } catch (e) { + expect(proofsService.pendingProof.get(pendingProofKey)).toEqual( + 'pendingProofId12', + ); + } + }); + + test('should reset currentProofId, if proof is ready', async () => { + const pendingProofKey = proofsService.getPendingProofKey( + TARGET_ADDR, + STORAGE_KEY, + MESSAGE_ID, + ); + try { + await proofsService.getProofs([TARGET_ADDR, STORAGE_KEY, MESSAGE_ID]); + expect(proofsService.pendingProof.get(pendingProofKey)).toEqual( + 'pendingProofId12', + ); + } catch (e) { + // Try to get the proof again + const proofs = await proofsService.getProofs([ + TARGET_ADDR, + STORAGE_KEY, + MESSAGE_ID, + ]); + expect(proofs[0][1]).toEqual([ + '0xf844a120443dd0be11dd8e645a2e5675fd62011681443445ea8b04c77d2cdeb1326739eca1a031ede38d2e93c5aee49c836f329a626d8c6322abfbff3783e82e5759f870d7e9', + ]); + expect(proofsService.pendingProof.get(pendingProofKey)).toBeUndefined(); + } + }); +}); diff --git a/typescript/ccip-server/tests/services/RPCService.test.ts b/typescript/ccip-server/tests/services/RPCService.test.ts new file mode 100644 index 0000000000..fde1373f2d --- /dev/null +++ b/typescript/ccip-server/tests/services/RPCService.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, test } from '@jest/globals'; + +import * as config from '../../src/config'; +import { RPCService } from '../../src/services/RPCService'; + +describe('RPCService', () => { + const rpcService = new RPCService(config.RPC_ADDRESS); + + test('should return the proofs from api', async () => { + const proofs = await rpcService.getProofs( + '0x3ef546f04a1b24eaf9dce2ed4338a1b5c32e2a56', + ['0x02c1eed75677f1bd39cc3abdd3042974bf12ab4a12ecc40df73fe3aa103e5e0e'], + '0x1221E88', + ); + + expect(proofs).not.toBeNull(); + }); +}); diff --git a/yarn.lock b/yarn.lock index 16e0a54516..e7f51888e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,16 @@ __metadata: languageName: node linkType: hard +"@ampproject/remapping@npm:^2.2.0": + version: 2.2.1 + resolution: "@ampproject/remapping@npm:2.2.1" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.0" + "@jridgewell/trace-mapping": "npm:^0.3.9" + checksum: e15fecbf3b54c988c8b4fdea8ef514ab482537e8a080b2978cc4b47ccca7140577ca7b65ad3322dcce65bc73ee6e5b90cbfe0bbd8c766dad04d5c62ec9634c42 + languageName: node + linkType: hard + "@arbitrum/sdk@npm:^3.0.0": version: 3.0.0 resolution: "@arbitrum/sdk@npm:3.0.0" @@ -2428,6 +2438,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" + dependencies: + "@babel/highlight": "npm:^7.23.4" + chalk: "npm:^2.4.2" + checksum: 44e58529c9d93083288dc9e649c553c5ba997475a7b0758cc3ddc4d77b8a7d985dbe78cc39c9bbc61f26d50af6da1ddf0a3427eae8cc222a9370619b671ed8f5 + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.22.13": version: 7.22.13 resolution: "@babel/code-frame@npm:7.22.13" @@ -2438,6 +2458,36 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/compat-data@npm:7.23.5" + checksum: 088f14f646ecbddd5ef89f120a60a1b3389a50a9705d44603dca77662707d0175a5e0e0da3943c3298f1907a4ab871468656fbbf74bb7842cd8b0686b2c19736 + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": + version: 7.23.9 + resolution: "@babel/core@npm:7.23.9" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.23.5" + "@babel/generator": "npm:^7.23.6" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helpers": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@babel/template": "npm:^7.23.9" + "@babel/traverse": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 268cdbb86bef1b8ea5b1300f2f325e56a1740a5051360cb228ffeaa0f80282b6674f3a2b4d6466adb0691183759b88d4c37b4a4f77232c84a49ed771c84cdc27 + languageName: node + linkType: hard + "@babel/generator@npm:7.17.7": version: 7.17.7 resolution: "@babel/generator@npm:7.17.7" @@ -2461,6 +2511,31 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": + version: 7.23.6 + resolution: "@babel/generator@npm:7.23.6" + dependencies: + "@babel/types": "npm:^7.23.6" + "@jridgewell/gen-mapping": "npm:^0.3.2" + "@jridgewell/trace-mapping": "npm:^0.3.17" + jsesc: "npm:^2.5.1" + checksum: 864090d5122c0aa3074471fd7b79d8a880c1468480cbd28925020a3dcc7eb6e98bedcdb38983df299c12b44b166e30915b8085a7bc126e68fa7e2aadc7bd1ac5 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/helper-compilation-targets@npm:7.23.6" + dependencies: + "@babel/compat-data": "npm:^7.23.5" + "@babel/helper-validator-option": "npm:^7.23.5" + browserslist: "npm:^4.22.2" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 05595cd73087ddcd81b82d2f3297aac0c0422858dfdded43d304786cf680ec33e846e2317e6992d2c964ee61d93945cbf1fa8ec80b55aee5bfb159227fb02cb9 + languageName: node + linkType: hard + "@babel/helper-environment-visitor@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-environment-visitor@npm:7.22.20" @@ -2487,6 +2562,46 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-module-imports@npm:7.22.15" + dependencies: + "@babel/types": "npm:^7.22.15" + checksum: 5ecf9345a73b80c28677cfbe674b9f567bb0d079e37dcba9055e36cb337db24ae71992a58e1affa9d14a60d3c69907d30fe1f80aea105184501750a58d15c81c + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-module-imports": "npm:^7.22.15" + "@babel/helper-simple-access": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/helper-validator-identifier": "npm:^7.22.20" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 583fa580f8e50e6f45c4f46aa76a8e49c2528deb84e25f634d66461b9a0e2420e13979b0a607b67aef67eaf8db8668eb9edc038b4514b16e3879fe09e8fd294b + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.22.5 + resolution: "@babel/helper-plugin-utils@npm:7.22.5" + checksum: ab220db218089a2aadd0582f5833fd17fa300245999f5f8784b10f5a75267c4e808592284a29438a0da365e702f05acb369f99e1c915c02f9f9210ec60eab8ea + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-simple-access@npm:7.22.5" + dependencies: + "@babel/types": "npm:^7.22.5" + checksum: 7d5430eecf880937c27d1aed14245003bd1c7383ae07d652b3932f450f60bfcf8f2c1270c593ab063add185108d26198c69d1aca0e6fb7c6fdada4bcf72ab5b7 + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:^7.22.6": version: 7.22.6 resolution: "@babel/helper-split-export-declaration@npm:7.22.6" @@ -2503,6 +2618,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c352082474a2ee1d2b812bd116a56b2e8b38065df9678a32a535f151ec6f58e54633cc778778374f10544b930703cca6ddf998803888a636afa27e2658068a9c + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-validator-identifier@npm:7.16.7" @@ -2524,6 +2646,24 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/helper-validator-option@npm:7.23.5" + checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/helpers@npm:7.23.9" + dependencies: + "@babel/template": "npm:^7.23.9" + "@babel/traverse": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" + checksum: dd56daac8bbd7ed174bb00fd185926fd449e591d9a00edaceb7ac6edbdd7a8db57e2cb365b4fafda382201752789ced2f7ae010f667eab0f198a4571cda4d2c5 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.16.7": version: 7.17.12 resolution: "@babel/highlight@npm:7.17.12" @@ -2546,6 +2686,26 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + checksum: 62fef9b5bcea7131df4626d009029b1ae85332042f4648a4ce6e740c3fd23112603c740c45575caec62f260c96b11054d3be5987f4981a5479793579c3aac71f + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/parser@npm:7.23.9" + bin: + parser: ./bin/babel-parser.js + checksum: 727a7a807100f6a26df859e2f009c4ddbd0d3363287b45daa50bd082ccd0d431d0c4d0e610a91f806e04a1918726cd0f5a0592c9b902a815337feed12e1cafd9 + languageName: node + linkType: hard + "@babel/parser@npm:^7.22.15": version: 7.22.16 resolution: "@babel/parser@npm:7.22.16" @@ -2573,6 +2733,169 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.23.3 + resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 89037694314a74e7f0e7a9c8d3793af5bf6b23d80950c29b360db1c66859d67f60711ea437e70ad6b5b4b29affe17eababda841b6c01107c2b638e0493bafb4e + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.23.3 + resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: abfad3a19290d258b028e285a1f34c9b8a0cbe46ef79eafed4ed7ffce11b5d0720b5e536c82f91cbd8442cde35a3dd8e861fa70366d87ff06fdc0d4756e30876 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.12.5": + version: 7.23.9 + resolution: "@babel/runtime@npm:7.23.9" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 9a520fe1bf72249f7dd60ff726434251858de15cccfca7aa831bd19d0d3fb17702e116ead82724659b8da3844977e5e13de2bae01eb8a798f2823a669f122be6 + languageName: node + linkType: hard + "@babel/runtime@npm:^7.17.2": version: 7.22.5 resolution: "@babel/runtime@npm:7.22.5" @@ -2620,6 +2943,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.23.9, @babel/template@npm:^7.3.3": + version: 7.23.9 + resolution: "@babel/template@npm:7.23.9" + dependencies: + "@babel/code-frame": "npm:^7.23.5" + "@babel/parser": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" + checksum: 1b011ba9354dc2e646561d54b6862e0df51760e6179faadd79be05825b0b6da04911e4e192df943f1766748da3037fd8493615b38707f7cadb0cf0c96601c170 + languageName: node + linkType: hard + "@babel/traverse@npm:7.23.2": version: 7.23.2 resolution: "@babel/traverse@npm:7.23.2" @@ -2638,6 +2972,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/traverse@npm:7.23.9" + dependencies: + "@babel/code-frame": "npm:^7.23.5" + "@babel/generator": "npm:^7.23.6" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/parser": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: e2bb845f7f229feb7c338f7e150f5f1abc5395dcd3a6a47f63a25242ec3ec6b165f04a6df7d4849468547faee34eb3cf52487eb0bd867a7d3c42fec2a648266f + languageName: node + linkType: hard + "@babel/types@npm:7.17.0": version: 7.17.0 resolution: "@babel/types@npm:7.17.0" @@ -2648,6 +3000,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.3.3": + version: 7.23.9 + resolution: "@babel/types@npm:7.23.9" + dependencies: + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: bed9634e5fd0f9dc63c84cfa83316c4cb617192db9fedfea464fca743affe93736d7bf2ebf418ee8358751a9d388e303af87a0c050cb5d87d5870c1b0154f6cb + languageName: node + linkType: hard + "@babel/types@npm:^7.17.0, @babel/types@npm:^7.8.3": version: 7.18.4 resolution: "@babel/types@npm:7.18.4" @@ -2691,6 +3054,24 @@ __metadata: languageName: node linkType: hard +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 1a1f0e356a3bb30b5f1ced6f79c413e6ebacf130421f15fac5fcd8be5ddf98aedb4404d7f5624e3285b700e041f9ef938321f3ca4d359d5b716f96afa120d88d + languageName: node + linkType: hard + +"@chainlink/ccip-read-server@npm:^0.2.1": + version: 0.2.1 + resolution: "@chainlink/ccip-read-server@npm:0.2.1" + dependencies: + cors: "npm:^2.8.5" + ethers: "npm:^5.3.1" + express: "npm:^4.17.1" + checksum: a0a45c7e7f7c612e96caa8bfd1b9cf6b45db569eb7afe5c69f7f09060fcfbd88517d7e32cfe25561b3b0f6b6063d7ee789f562132c6951bb6d09abb080a4cc96 + languageName: node + linkType: hard + "@chainsafe/as-sha256@npm:^0.3.1": version: 0.3.1 resolution: "@chainsafe/as-sha256@npm:0.3.1" @@ -2973,6 +3354,23 @@ __metadata: languageName: node linkType: hard +"@coinbase/wallet-sdk@npm:^3.6.6": + version: 3.9.1 + resolution: "@coinbase/wallet-sdk@npm:3.9.1" + dependencies: + bn.js: "npm:^5.2.1" + buffer: "npm:^6.0.3" + clsx: "npm:^1.2.1" + eth-block-tracker: "npm:^7.1.0" + eth-json-rpc-filters: "npm:^6.0.0" + eventemitter3: "npm:^5.0.1" + keccak: "npm:^3.0.3" + preact: "npm:^10.16.0" + sha.js: "npm:^2.4.11" + checksum: afa2b01ba69edb96c5d8d0b34e68eb9ab1ef99c20f0a6db81c0b42f6f234c4dec538b978e6dc69d9dd37539e6d7290068e3aae960029afee78995bd515bc8077 + languageName: node + linkType: hard + "@confio/ics23@npm:^0.6.8": version: 0.6.8 resolution: "@confio/ics23@npm:0.6.8" @@ -3149,6 +3547,13 @@ __metadata: languageName: node linkType: hard +"@emotion/hash@npm:^0.8.0": + version: 0.8.0 + resolution: "@emotion/hash@npm:0.8.0" + checksum: 4b35d88a97e67275c1d990c96d3b0450451d089d1508619488fc0acb882cb1ac91e93246d471346ebd1b5402215941ef4162efe5b51534859b39d8b3a0e3ffaa + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -3397,6 +3802,16 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/common@npm:^3.2.0": + version: 3.2.0 + resolution: "@ethereumjs/common@npm:3.2.0" + dependencies: + "@ethereumjs/util": "npm:^8.1.0" + crc-32: "npm:^1.2.0" + checksum: b3f612406b6bcefaf9117ceb42eff58d311e2b50205e3d55b4c793d803de517efbc84075e058dc0e2ec27a2bff11dfc279dda1fa2b249ed6ab3973be045898f4 + languageName: node + linkType: hard + "@ethereumjs/ethash@npm:^1.1.0": version: 1.1.0 resolution: "@ethereumjs/ethash@npm:1.1.0" @@ -3410,6 +3825,15 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/rlp@npm:^4.0.1": + version: 4.0.1 + resolution: "@ethereumjs/rlp@npm:4.0.1" + bin: + rlp: bin/rlp + checksum: bfdffd634ce72f3b17e3d085d071f2fe7ce9680aebdf10713d74b30afd80ef882d17f19ff7175fcb049431a56e800bd3558d3b028bd0d82341927edb303ab450 + languageName: node + linkType: hard + "@ethereumjs/tx@npm:3.3.2": version: 3.3.2 resolution: "@ethereumjs/tx@npm:3.3.2" @@ -3440,6 +3864,29 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/tx@npm:^4.1.2, @ethereumjs/tx@npm:^4.2.0": + version: 4.2.0 + resolution: "@ethereumjs/tx@npm:4.2.0" + dependencies: + "@ethereumjs/common": "npm:^3.2.0" + "@ethereumjs/rlp": "npm:^4.0.1" + "@ethereumjs/util": "npm:^8.1.0" + ethereum-cryptography: "npm:^2.0.0" + checksum: cbd2ffc3ef76ca5416d58f2f694858d9fcac946e6a107fef44cf3f308a7c9fcc996a6847868609354d72d5b356faee68408e9d5601c4c4f7dad8e18cb2c24a95 + languageName: node + linkType: hard + +"@ethereumjs/util@npm:^8.1.0": + version: 8.1.0 + resolution: "@ethereumjs/util@npm:8.1.0" + dependencies: + "@ethereumjs/rlp": "npm:^4.0.1" + ethereum-cryptography: "npm:^2.0.0" + micro-ftch: "npm:^0.3.1" + checksum: cc35338932e49b15e54ca6e548b32a1f48eed7d7e1d34ee743e4d3600dd616668bd50f70139e86c5c35f55aac35fba3b6cc4e6f679cf650aeba66bf93016200c + languageName: node + linkType: hard + "@ethereumjs/vm@npm:5.6.0": version: 5.6.0 resolution: "@ethereumjs/vm@npm:5.6.0" @@ -4206,6 +4653,19 @@ __metadata: languageName: node linkType: hard +"@headlessui/react@npm:^1.7.17": + version: 1.7.18 + resolution: "@headlessui/react@npm:1.7.18" + dependencies: + "@tanstack/react-virtual": "npm:^3.0.0-beta.60" + client-only: "npm:^0.0.1" + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + checksum: 9615f7b709842f2e56b3ef1a8f1a77faed7982e86af52f057a5c2a9950d073672073a6c09829f0c26ed7287e298f5e2345f3898dbc2cc13318af10598ceb4bbc + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.11.10": version: 0.11.10 resolution: "@humanwhocodes/config-array@npm:0.11.10" @@ -4231,6 +4691,25 @@ __metadata: languageName: node linkType: hard +"@hyperlane-xyz/ccip-server@workspace:typescript/ccip-server": + version: 0.0.0-use.local + resolution: "@hyperlane-xyz/ccip-server@workspace:typescript/ccip-server" + dependencies: + "@chainlink/ccip-read-server": "npm:^0.2.1" + "@jest/globals": "npm:^29.7.0" + "@types/node": "npm:^16.9.1" + dotenv-flow: "npm:^4.1.0" + ethers: "npm:5.7.2" + hyperlane-explorer: "https://github.com/hyperlane-xyz/hyperlane-explorer.git" + jest: "npm:^29.7.0" + nodemon: "npm:^3.0.3" + prettier: "npm:^2.8.8" + ts-jest: "npm:^29.1.2" + ts-node: "npm:^10.8.0" + typescript: "npm:5.1.6" + languageName: unknown + linkType: soft + "@hyperlane-xyz/cli@workspace:typescript/cli": version: 0.0.0-use.local resolution: "@hyperlane-xyz/cli@workspace:typescript/cli" @@ -4457,6 +4936,17 @@ __metadata: languageName: unknown linkType: soft +"@hyperlane-xyz/widgets@npm:3.7.0": + version: 3.7.0 + resolution: "@hyperlane-xyz/widgets@npm:3.7.0" + peerDependencies: + "@hyperlane-xyz/sdk": ^3.1 + react: ^18 + react-dom: ^18 + checksum: 5ddf7a7a5f599f1b340bbe4e981e0cb10dd8930cc616c566abb58210658acd2826386afd18e8789f8bb62fc19d14b69db87433adcc97c38ebda2c322cc7865a2 + languageName: node + linkType: hard + "@inquirer/checkbox@npm:^1.3.5": version: 1.3.5 resolution: "@inquirer/checkbox@npm:1.3.5" @@ -4597,21 +5087,278 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@ioredis/commands@npm:^1.1.1": + version: 1.2.0 + resolution: "@ioredis/commands@npm:1.2.0" + checksum: a8253c9539b7e5463d4a98e6aa5b1b863fb4a4978191ba9dc42ec2c0fb5179d8d1fe4a29096d5954f91ba9600d1bdc6c1d18b044eab36f645f267fd37d7c0906 + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" dependencies: - "@jridgewell/set-array": "npm:^1.0.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 072ace159c39ab85944bdabe017c3de15c5e046a4a4a772045b00ff05e2ebdcfa3840b88ae27e897d473eb4d4845b37be3c78e28910c779f5aeeeae2fb7f0cc2 + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: b000a5acd8d4fe6e34e25c399c8bdbb5d3a202b4e10416e17bfc25e12bab90bb56d33db6089ae30569b52686f4b35ff28ef26e88e21e69821d2b85884bd055b8 languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:3.1.0": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: 320ceb37af56953757b28e5b90c34556157676d41e3d0a3ff88769274d62373582bb0f0276a4f2d29c3f4fdd55b82b8be5731f52d391ad2ecae9b321ee1c742d +"@istanbuljs/schema@npm:^0.1.2": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: a9b1e49acdf5efc2f5b2359f2df7f90c5c725f2656f16099e8b2cd3a000619ecca9fc48cf693ba789cf0fd989f6e0df6a22bc05574be4223ecdbb7997d04384b + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 4a80c750e8a31f344233cb9951dee9b77bf6b89377cb131f8b3cde07ff218f504370133a5963f6a786af4d2ce7f85642db206ff7a15f99fe58df4c38ac04899e + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: ab6ac2e562d083faac7d8152ec1cc4eccc80f62e9579b69ed40aedf7211a6b2d57024a6cd53c4e35fd051c39a236e86257d1d99ebdb122291969a0a04563b51e + languageName: node + linkType: hard + +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 90b5844a9a9d8097f2cf107b1b5e57007c552f64315da8c1f51217eeb0a9664889d3f145cdf8acf23a84f4d8309a6675e27d5b059659a004db0ea9546d1c81a8 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: ef8d379778ef574a17bde2801a6f4469f8022a46a5f9e385191dc73bb1fc318996beaed4513fbd7055c2847227a1bed2469977821866534593a6e52a281499ee + languageName: node + linkType: hard + +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: fea6c3317a8da5c840429d90bfe49d928e89c9e89fceee2149b93a11b7e9c73d2f6e4d7cdf647163da938fc4e2169e4490be6bae64952902bc7a701033fd4880 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 9b394e04ffc46f91725ecfdff34c4e043eb7a16e1d78964094c9db3fde0b1c8803e45943a980e8c740d0a3d45661906de1416ca5891a538b0660481a3a828c27 + languageName: node + linkType: hard + +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: a17d1644b26dea14445cedd45567f4ba7834f980be2ef74447204e14238f121b50d8b858fde648083d2cd8f305f81ba434ba49e37a5f4237a6f2a61180cc73dc + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: c073ab7dfe3c562bff2b8fee6cc724ccc20aa96bcd8ab48ccb2aa309b4c0c1923a9e703cea386bd6ae9b71133e92810475bb9c7c22328fc63f797ad3324ed189 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 4420c26a0baa7035c5419b0892ff8ffe9a41b1583ec54a10db3037cd46a7e29dd3d7202f8aa9d376e9e53be5f8b1bc0d16e1de6880a6d319b033b01dc4c8f639 + languageName: node + linkType: hard + +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 30f42293545ab037d5799c81d3e12515790bb58513d37f788ce32d53326d0d72ebf5b40f989e6896739aa50a5f77be44686e510966370d58511d5ad2637c68c1 + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: f74bf512fd09bbe2433a2ad460b04668b7075235eea9a0c77d6a42222c10a79b9747dc2b2a623f140ed40d6865a2ed8f538f3cbb75169120ea863f29a7ed76cd + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.3 + resolution: "@jridgewell/gen-mapping@npm:0.3.3" + dependencies: + "@jridgewell/set-array": "npm:^1.0.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.9" + checksum: 072ace159c39ab85944bdabe017c3de15c5e046a4a4a772045b00ff05e2ebdcfa3840b88ae27e897d473eb4d4845b37be3c78e28910c779f5aeeeae2fb7f0cc2 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: 320ceb37af56953757b28e5b90c34556157676d41e3d0a3ff88769274d62373582bb0f0276a4f2d29c3f4fdd55b82b8be5731f52d391ad2ecae9b321ee1c742d languageName: node linkType: hard @@ -4622,6 +5369,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d + languageName: node + linkType: hard + "@jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" @@ -4643,6 +5397,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09 + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:0.3.9": version: 0.3.9 resolution: "@jridgewell/trace-mapping@npm:0.3.9" @@ -4653,6 +5414,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18": + version: 0.3.22 + resolution: "@jridgewell/trace-mapping@npm:0.3.22" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 48d3e3db00dbecb211613649a1849876ba5544a3f41cf5e6b99ea1130272d6cf18591b5b67389bce20f1c871b4ede5900c3b6446a7aab6d0a3b2fe806a834db7 + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.17": version: 0.3.18 resolution: "@jridgewell/trace-mapping@npm:0.3.18" @@ -4673,6 +5444,13 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/connect-kit-loader@npm:^1.0.1": + version: 1.1.8 + resolution: "@ledgerhq/connect-kit-loader@npm:1.1.8" + checksum: 8352e0932e9c4a7179eb0d162b0e7c92437de9216a2efa04bd274450edf205fdba3fe971ff41593c1ac851cfb3a7a474900b7e467da87f982c85f0c5edba45b5 + languageName: node + linkType: hard + "@ledgerhq/cryptoassets@npm:^5.27.2": version: 5.53.0 resolution: "@ledgerhq/cryptoassets@npm:5.53.0" @@ -4784,6 +5562,22 @@ __metadata: languageName: node linkType: hard +"@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": + version: 1.2.0 + resolution: "@lit-labs/ssr-dom-shim@npm:1.2.0" + checksum: 33679defe08538ac6fb612854e7d32b4ea1e787cceba2c3373d26fd56baa9833881887da7bade3930a176ba518dc00bb42ce95d82ddb6af6b05b8fbe1fc3169f + languageName: node + linkType: hard + +"@lit/reactive-element@npm:^1.3.0, @lit/reactive-element@npm:^1.6.0": + version: 1.6.3 + resolution: "@lit/reactive-element@npm:1.6.3" + dependencies: + "@lit-labs/ssr-dom-shim": "npm:^1.0.0" + checksum: 664c899bb0b144590dc4faf83b358b1504810eac107778c3aeb384affc65a7ef4eda754944bcc34a57237db03dff145332406345ac24da19ca37cf4b3cb343d3 + languageName: node + linkType: hard + "@manypkg/find-root@npm:^1.1.0": version: 1.1.0 resolution: "@manypkg/find-root@npm:1.1.0" @@ -4810,6 +5604,17 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-json-rpc-provider@npm:^1.0.0": + version: 1.0.1 + resolution: "@metamask/eth-json-rpc-provider@npm:1.0.1" + dependencies: + "@metamask/json-rpc-engine": "npm:^7.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" + checksum: 4ed1a96afc32eb46f585ff54e16cb2aee2e7027dcf6a142d875b9c6248f15c9a00dd1df43035f2e64efbf01a96954040699d9d97e3b483c958f5b1d6c0fa6f50 + languageName: node + linkType: hard + "@metamask/eth-sig-util@npm:^4.0.0": version: 4.0.1 resolution: "@metamask/eth-sig-util@npm:4.0.1" @@ -4823,6 +5628,234 @@ __metadata: languageName: node linkType: hard +"@metamask/jazzicon@https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6": + version: 2.1.0 + resolution: "@metamask/jazzicon@https://github.com/jmrossy/jazzicon.git#commit=7a8df28974b4e81129bfbe3cab76308b889032a6" + dependencies: + mersenne-twister: "npm:^1.1.0" + checksum: 5e56251b375eade58294334783fb37a15e8fd48d792f6dc93f7247b8897541324f9cf2d3f1d9b1cffdac1d932a8bc48a89dee7cdbd6e4a312ca2ff85df90131b + languageName: node + linkType: hard + +"@metamask/json-rpc-engine@npm:^7.0.0": + version: 7.3.2 + resolution: "@metamask/json-rpc-engine@npm:7.3.2" + dependencies: + "@metamask/rpc-errors": "npm:^6.1.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + checksum: d90e5fdf88461aa90af41ba0304729200afa8226ab8b73db348704a1f545e416c49281a1dfd58591dde769e1ab263080b26d5a0ab1be8362398639dc2d6354de + languageName: node + linkType: hard + +"@metamask/rpc-errors@npm:^6.1.0": + version: 6.2.0 + resolution: "@metamask/rpc-errors@npm:6.2.0" + dependencies: + "@metamask/utils": "npm:^8.3.0" + fast-safe-stringify: "npm:^2.0.6" + checksum: 25c05005f461a7db99d7ad6d2942cbdeb49337f47ce86823b8c3b8785d865584f19ca17abcb70c811fbc2bd394227f82fb7f0c5085b3b68e5d65bbe2f1c1dd9b + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^2.0.0": + version: 2.0.0 + resolution: "@metamask/safe-event-emitter@npm:2.0.0" + checksum: 3e4f00c64aa1ddf9b9ae5c2337fb8cee359b6c481ded0ec21ef70610960c51cdcc4a9b569de334dcd7cb1fe445cafd298360907c1e211e244c5990b55246f350 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^3.0.0": + version: 3.0.0 + resolution: "@metamask/safe-event-emitter@npm:3.0.0" + checksum: 8dc58a76f9f75bf2405931465fc311c68043d851e6b8ebe9f82ae339073a08a83430dba9338f8e3adc4bfc8067607125074bcafa32baee3a5157f42343dc89e5 + languageName: node + linkType: hard + +"@metamask/utils@npm:^5.0.1": + version: 5.0.2 + resolution: "@metamask/utils@npm:5.0.2" + dependencies: + "@ethereumjs/tx": "npm:^4.1.2" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + semver: "npm:^7.3.8" + superstruct: "npm:^1.0.3" + checksum: c0d3ee4c3144b557936ab01c1a64950c0f99782bd0cf5596c0fabe8fd224dba48ed3483c0ea954791fe2ee81064a445adb489df50c776bbbeb67b5b96e930115 + languageName: node + linkType: hard + +"@metamask/utils@npm:^8.3.0": + version: 8.3.0 + resolution: "@metamask/utils@npm:8.3.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + superstruct: "npm:^1.0.3" + checksum: 728a4f6b3ab14223a487e8974a21b1917e470ff2c131afc0b8a6a6823839d6cf7454243ddb0ff695ceebede62feaf628f4d32b4b529bb5c044c6c95576a142ef + languageName: node + linkType: hard + +"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/animation@npm:10.17.0" + dependencies: + "@motionone/easing": "npm:^10.17.0" + "@motionone/types": "npm:^10.17.0" + "@motionone/utils": "npm:^10.17.0" + tslib: "npm:^2.3.1" + checksum: 85ac8a36f33b7510cec239b12d90eec38a8f191158e2686c95c7ba237b17cac0e14b1533748fb27e10c18b8f4f4ea9798bc0a9286cf854852ab957d290a09ba9 + languageName: node + linkType: hard + +"@motionone/dom@npm:^10.16.2, @motionone/dom@npm:^10.16.4": + version: 10.17.0 + resolution: "@motionone/dom@npm:10.17.0" + dependencies: + "@motionone/animation": "npm:^10.17.0" + "@motionone/generators": "npm:^10.17.0" + "@motionone/types": "npm:^10.17.0" + "@motionone/utils": "npm:^10.17.0" + hey-listen: "npm:^1.0.8" + tslib: "npm:^2.3.1" + checksum: 7a9c5f01eacc084b95ac59c5f96de9c153b713d60cc99bc66b4c7619326f6b04d9acc14445ce0f3d9c7f65c8834a9543c59d3c90f7399de916aaaacbf38f4fb9 + languageName: node + linkType: hard + +"@motionone/easing@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/easing@npm:10.17.0" + dependencies: + "@motionone/utils": "npm:^10.17.0" + tslib: "npm:^2.3.1" + checksum: 69f0fc4999a209801b128586cbb328937d9db1c091bed26762d30d035ecc5c01b0cbdce610c6550f609c0be78c1ad03c808e6c61f15fc52621f614449ce10a86 + languageName: node + linkType: hard + +"@motionone/generators@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/generators@npm:10.17.0" + dependencies: + "@motionone/types": "npm:^10.17.0" + "@motionone/utils": "npm:^10.17.0" + tslib: "npm:^2.3.1" + checksum: 06bd6c16cdb3c9fbb3a3fca05d6941d5e756b6ce151e2e9cc4f49c3b021fb54a5b970b01e3ddae9d77175e58b66cacb00927ee829f545fafd0bbdbdc838933aa + languageName: node + linkType: hard + +"@motionone/svelte@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/svelte@npm:10.16.4" + dependencies: + "@motionone/dom": "npm:^10.16.4" + tslib: "npm:^2.3.1" + checksum: 5ad532d4d9bb16a9f311487e6409fa7e1a66ec12f82e3c36434ab6dfe3cedc61b35dae6314cee4fba8dca463b8a259cafb83801a932b7ad5f4a6e45baaa581f4 + languageName: node + linkType: hard + +"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/types@npm:10.17.0" + checksum: 9449991493f6e7be59261e4fc1a3d4a5b842da8962084d742905f964b4d3aad5fd6c37bd95d5ab51f65fda7b0c389a332c5f7c7eccd6be54eb765ee2fc6e7070 + languageName: node + linkType: hard + +"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/utils@npm:10.17.0" + dependencies: + "@motionone/types": "npm:^10.17.0" + hey-listen: "npm:^1.0.8" + tslib: "npm:^2.3.1" + checksum: 030359d37a6edebf29e0477050e638340f3756fc993a75b877e923b31ed4f3092a61f9d2323494f4b561ada1afc5ea774fb34022e7afbe2ec449c215585ab392 + languageName: node + linkType: hard + +"@motionone/vue@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/vue@npm:10.16.4" + dependencies: + "@motionone/dom": "npm:^10.16.4" + tslib: "npm:^2.3.1" + checksum: 2400d31bbf5c3e02bc68f4b88d96d9c0672ba646bca0b6566e555cd7e8f14849a645f558f574e658fd90574a0b548b61712ae5edcee055c60288fd9382d711ea + languageName: node + linkType: hard + +"@next/env@npm:13.5.6": + version: 13.5.6 + resolution: "@next/env@npm:13.5.6" + checksum: c81bd6052db366407da701e4e431becbc80ef36a88bec7883b0266cdfeb45a7da959d37c38e1a816006cd2da287e5ff5b928bdb71025e3d4aa59e07dea3edd59 + languageName: node + linkType: hard + +"@next/swc-darwin-arm64@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-darwin-arm64@npm:13.5.6" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-darwin-x64@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-darwin-x64@npm:13.5.6" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@next/swc-linux-arm64-gnu@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-linux-arm64-gnu@npm:13.5.6" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@next/swc-linux-arm64-musl@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-linux-arm64-musl@npm:13.5.6" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@next/swc-linux-x64-gnu@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-linux-x64-gnu@npm:13.5.6" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@next/swc-linux-x64-musl@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-linux-x64-musl@npm:13.5.6" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@next/swc-win32-arm64-msvc@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-win32-arm64-msvc@npm:13.5.6" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-win32-ia32-msvc@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-win32-ia32-msvc@npm:13.5.6" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@next/swc-win32-x64-msvc@npm:13.5.6": + version: 13.5.6 + resolution: "@next/swc-win32-x64-msvc@npm:13.5.6" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": version: 1.2.0 resolution: "@noble/curves@npm:1.2.0" @@ -4832,6 +5865,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:1.3.0, @noble/curves@npm:~1.3.0": + version: 1.3.0 + resolution: "@noble/curves@npm:1.3.0" + dependencies: + "@noble/hashes": "npm:1.3.3" + checksum: f3cbdd1af00179e30146eac5539e6df290228fb857a7a8ba36d1a772cbe59288a2ca83d06f175d3446ef00db3a80d7fd8b8347f7de9c2d4d5bf3865d8bb78252 + languageName: node + linkType: hard + "@noble/curves@npm:^1.0.0": version: 1.1.0 resolution: "@noble/curves@npm:1.1.0" @@ -4862,7 +5904,7 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:~1.3.2": +"@noble/hashes@npm:1.3.3, @noble/hashes@npm:~1.3.2": version: 1.3.3 resolution: "@noble/hashes@npm:1.3.3" checksum: 1025ddde4d24630e95c0818e63d2d54ee131b980fe113312d17ed7468bc18f54486ac86c907685759f8a7e13c2f9b9e83ec7b67d1cc20836f36b5e4a65bb102d @@ -5247,10 +6289,155 @@ __metadata: languageName: node linkType: hard -"@pnpm/config.env-replace@npm:^1.1.0": - version: 1.1.0 - resolution: "@pnpm/config.env-replace@npm:1.1.0" - checksum: fabe35cede1b72ad12877b8bed32f7c2fcd89e94408792c4d69009b886671db7988a2132bc18b7157489d2d0fd4266a06c9583be3d2e10c847bf06687420cb2a +"@parcel/watcher-android-arm64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-android-arm64@npm:2.4.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.4.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.4.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.4.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.4.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.4.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.4.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.4.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.4.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-wasm@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-wasm@npm:2.4.0" + dependencies: + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + napi-wasm: "npm:^1.1.0" + checksum: bb6943b4c4b894d54b42de73fc901d0ad8496e2d761def88cd245eb8e1cbf12bd708755375b616c28c5cdc67209c6f811835d0d073dd8cd78c29c82e54e82840 + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.4.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.4.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-win32-x64@npm:2.4.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher@npm:2.4.0" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.4.0" + "@parcel/watcher-darwin-arm64": "npm:2.4.0" + "@parcel/watcher-darwin-x64": "npm:2.4.0" + "@parcel/watcher-freebsd-x64": "npm:2.4.0" + "@parcel/watcher-linux-arm-glibc": "npm:2.4.0" + "@parcel/watcher-linux-arm64-glibc": "npm:2.4.0" + "@parcel/watcher-linux-arm64-musl": "npm:2.4.0" + "@parcel/watcher-linux-x64-glibc": "npm:2.4.0" + "@parcel/watcher-linux-x64-musl": "npm:2.4.0" + "@parcel/watcher-win32-arm64": "npm:2.4.0" + "@parcel/watcher-win32-ia32": "npm:2.4.0" + "@parcel/watcher-win32-x64": "npm:2.4.0" + detect-libc: "npm:^1.0.3" + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 2839cf275ea38b47a2c9c6d74ff6fc312613b58e63b072ece75307d718712cecda5ca7f5e88eee3619bdd3cad3bcb1c4048a50573afe76956eb48a94d3949760 + languageName: node + linkType: hard + +"@pnpm/config.env-replace@npm:^1.1.0": + version: 1.1.0 + resolution: "@pnpm/config.env-replace@npm:1.1.0" + checksum: fabe35cede1b72ad12877b8bed32f7c2fcd89e94408792c4d69009b886671db7988a2132bc18b7157489d2d0fd4266a06c9583be3d2e10c847bf06687420cb2a languageName: node linkType: hard @@ -5347,6 +6534,25 @@ __metadata: languageName: node linkType: hard +"@rainbow-me/rainbowkit@npm:0.12.16": + version: 0.12.16 + resolution: "@rainbow-me/rainbowkit@npm:0.12.16" + dependencies: + "@vanilla-extract/css": "npm:1.9.1" + "@vanilla-extract/dynamic": "npm:2.0.2" + "@vanilla-extract/sprinkles": "npm:1.5.0" + clsx: "npm:1.1.1" + qrcode: "npm:1.5.0" + react-remove-scroll: "npm:2.5.4" + peerDependencies: + ethers: ">=5.6.8" + react: ">=17" + react-dom: ">=17" + wagmi: ">=0.12.18 <1.0.0" + checksum: b55af69f295c857f33b01e0d0460912ef1b66b76746b698f49d3d350a59c2f501b58cda0aa2338b53f2d8d8fe9a2b3f7aa57b930a09cb88b504d75148a04e948 + languageName: node + linkType: hard + "@resolver-engine/core@npm:^0.3.3": version: 0.3.3 resolution: "@resolver-engine/core@npm:0.3.3" @@ -5420,6 +6626,36 @@ __metadata: languageName: node linkType: hard +"@safe-global/safe-apps-provider@npm:^0.15.2": + version: 0.15.2 + resolution: "@safe-global/safe-apps-provider@npm:0.15.2" + dependencies: + "@safe-global/safe-apps-sdk": "npm:7.9.0" + events: "npm:^3.3.0" + checksum: 9e4c8a3fd58e6b563452c173d569f0a249a8e122e89d95dbb06a515629e627a5e304ab16bc91bf1c198d2d710426990e1e294f619bbeb48bb931804421dca5c7 + languageName: node + linkType: hard + +"@safe-global/safe-apps-sdk@npm:7.9.0": + version: 7.9.0 + resolution: "@safe-global/safe-apps-sdk@npm:7.9.0" + dependencies: + "@safe-global/safe-gateway-typescript-sdk": "npm:^3.5.3" + ethers: "npm:^5.7.2" + checksum: d350dc1de984ac57ce07b4d5fd3f63b867959c2f0ac57ead91499cf1e57f32c39e33cf5e3740a3449aa06a95b717c9e5798b39e55086123e4cf529f6b7194ba7 + languageName: node + linkType: hard + +"@safe-global/safe-apps-sdk@npm:^7.9.0": + version: 7.11.0 + resolution: "@safe-global/safe-apps-sdk@npm:7.11.0" + dependencies: + "@safe-global/safe-gateway-typescript-sdk": "npm:^3.5.3" + ethers: "npm:^5.7.2" + checksum: 698df52d088496db994d4df065e3624289550821f938e68f21a2f4a732032bbb7c1ab78746c1e8eca3769e9dc8ea07db9b3e5248cc91e145d31f69cfd44f8cb4 + languageName: node + linkType: hard + "@safe-global/safe-core-sdk-types@npm:^2.2.0": version: 2.2.0 resolution: "@safe-global/safe-core-sdk-types@npm:2.2.0" @@ -5442,6 +6678,20 @@ __metadata: languageName: node linkType: hard +"@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": + version: 3.17.0 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.17.0" + checksum: 8fe4ba9b2811205fad6b4cf1d8ae4cf694cdf9228812a5bc1b08625ec4003efa7c2f7daae45e884bff52b805c6cd67669d82be0a00913a30bb0100198da6d183 + languageName: node + linkType: hard + +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.4": + version: 1.1.5 + resolution: "@scure/base@npm:1.1.5" + checksum: 543fa9991c6378b6a0d5ab7f1e27b30bb9c1e860d3ac81119b4213cfdf0ad7b61be004e06506e89de7ce0cec9391c17f5c082bb34c3b617a2ee6a04129f52481 + languageName: node + linkType: hard + "@scure/base@npm:~1.0.0": version: 1.0.0 resolution: "@scure/base@npm:1.0.0" @@ -5485,6 +6735,17 @@ __metadata: languageName: node linkType: hard +"@scure/bip32@npm:1.3.3": + version: 1.3.3 + resolution: "@scure/bip32@npm:1.3.3" + dependencies: + "@noble/curves": "npm:~1.3.0" + "@noble/hashes": "npm:~1.3.2" + "@scure/base": "npm:~1.1.4" + checksum: 4b8b75567866ff7d6b3ba154538add02d2951e9433e8dd7f0014331ac500cda5a88fe3d39b408fcc36e86b633682013f172b967af022c2e4e4ab07336801d688 + languageName: node + linkType: hard + "@scure/bip39@npm:1.0.0": version: 1.0.0 resolution: "@scure/bip39@npm:1.0.0" @@ -5505,6 +6766,16 @@ __metadata: languageName: node linkType: hard +"@scure/bip39@npm:1.2.2": + version: 1.2.2 + resolution: "@scure/bip39@npm:1.2.2" + dependencies: + "@noble/hashes": "npm:~1.3.2" + "@scure/base": "npm:~1.1.4" + checksum: f71aceda10a7937bf3779fd2b4c4156c95ec9813269470ddca464cb8ab610d2451b173037f4b1e6dac45414e406e7adc7b5814c51279f4474d5d38140bbee542 + languageName: node + linkType: hard + "@sentry/core@npm:5.30.0": version: 5.30.0 resolution: "@sentry/core@npm:5.30.0" @@ -5587,6 +6858,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 297f95ff77c82c54de8c9907f186076e715ff2621c5222ba50b8d40a170661c0c5242c763cba2a4791f0f91cb1d8ffa53ea1d7294570cf8cd4694c0e383e484d + languageName: node + linkType: hard + "@sindresorhus/is@npm:^4.6.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" @@ -5610,6 +6888,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: "npm:4.0.8" + checksum: a0af217ba7044426c78df52c23cedede6daf377586f3ac58857c565769358ab1f44ebf95ba04bbe38814fba6e316ca6f02870a009328294fc2c555d0f85a7117 + languageName: node + linkType: hard + "@sinonjs/fake-timers@npm:>=5, @sinonjs/fake-timers@npm:^9.1.2": version: 9.1.2 resolution: "@sinonjs/fake-timers@npm:9.1.2" @@ -5619,6 +6906,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 78155c7bd866a85df85e22028e046b8d46cf3e840f72260954f5e3ed5bd97d66c595524305a6841ffb3f681a08f6e5cef572a2cce5442a8a232dc29fb409b83e + languageName: node + linkType: hard + "@sinonjs/samsam@npm:^6.1.1": version: 6.1.1 resolution: "@sinonjs/samsam@npm:6.1.1" @@ -5735,150 +7031,444 @@ __metadata: languageName: node linkType: hard -"@szmarczak/http-timer@npm:^5.0.1": - version: 5.0.1 - resolution: "@szmarczak/http-timer@npm:5.0.1" - dependencies: - defer-to-connect: "npm:^2.0.1" - checksum: fc9cb993e808806692e4a3337c90ece0ec00c89f4b67e3652a356b89730da98bc824273a6d67ca84d5f33cd85f317dcd5ce39d8cc0a2f060145a608a7cb8ce92 +"@stablelib/aead@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/aead@npm:1.0.1" + checksum: 1a6f68d138f105d17dd65349751515bd252ab0498c77255b8555478d28415600dde493f909eb718245047a993f838dfae546071e1687566ffb7b8c3e10c918d9 languageName: node linkType: hard -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 +"@stablelib/binary@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/binary@npm:1.0.1" + dependencies: + "@stablelib/int": "npm:^1.0.1" + checksum: c5ed769e2b5d607a5cdb72d325fcf98db437627862fade839daad934bd9ccf02a6f6e34f9de8cb3b18d72fce2ba6cc019a5d22398187d7d69d2607165f27f8bf languageName: node linkType: hard -"@trivago/prettier-plugin-sort-imports@npm:^4.2.1": - version: 4.3.0 - resolution: "@trivago/prettier-plugin-sort-imports@npm:4.3.0" - dependencies: - "@babel/generator": "npm:7.17.7" - "@babel/parser": "npm:^7.20.5" - "@babel/traverse": "npm:7.23.2" - "@babel/types": "npm:7.17.0" - javascript-natural-sort: "npm:0.7.1" - lodash: "npm:^4.17.21" - peerDependencies: - "@vue/compiler-sfc": 3.x - prettier: 2.x - 3.x - peerDependenciesMeta: - "@vue/compiler-sfc": - optional: true - checksum: eb25cbeeaf85d3acd54019d1f3563447337a2faee7a35558adb69dff44ce3b93714a5b64ba4d0374f3df3191c32c993d441493fdc43a2c97c9b8a0e3d58702cf +"@stablelib/bytes@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/bytes@npm:1.0.1" + checksum: 23d4d632a8a15ca91be1dc56da92eefed695d9b66068d1ab27a5655d0233dc2ac0b8668f875af542ca4ed526893c65dd53e777c72c8056f3648115aac98823ee languageName: node linkType: hard -"@trufflesuite/bigint-buffer@npm:1.1.10": - version: 1.1.10 - resolution: "@trufflesuite/bigint-buffer@npm:1.1.10" +"@stablelib/chacha20poly1305@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha20poly1305@npm:1.0.1" dependencies: - node-gyp: "npm:latest" - node-gyp-build: "npm:4.4.0" - checksum: 544b39fe3c7ebf895359bc46d255e350c723700601498674c8797bc2e6b6139cb898307530331d1c96821faa0b4a63d5a38876b4b32891dc3a4b3422014df0bf + "@stablelib/aead": "npm:^1.0.1" + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/chacha": "npm:^1.0.1" + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/poly1305": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 2a4df136b078b7c09acb3c6fe029613d4c9f70a0ce8bec65551a4a5016930a4f9091d3b83ed1cfc9c2e7bd6ec7f5ee93a7dc729b784b3900dcb97f3c7f5da84a languageName: node linkType: hard -"@trufflesuite/bigint-buffer@npm:1.1.9": - version: 1.1.9 - resolution: "@trufflesuite/bigint-buffer@npm:1.1.9" +"@stablelib/chacha@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha@npm:1.0.1" dependencies: - node-gyp: "npm:latest" - node-gyp-build: "npm:4.3.0" - checksum: e175bcfdaffe53a5e787146ea93e7687a3d755217a6a736e1efb7cfb9b7230f56671f5d4aa2fc29dba932da76ec26848014912c47c8bee839275fa75e17d01f1 + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 38cd8095d94eda29a9bb8a742b1c945dba7f9ec91fc07ab351c826680d03976641ac6366c3d004a00a72d746fcd838215fe1263ef4b0660c453c5de18a0a4295 languageName: node linkType: hard -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df +"@stablelib/constant-time@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/constant-time@npm:1.0.1" + checksum: dba4f4bf508de2ff15f7f0cbd875e70391aa3ba3698290fe1ed2feb151c243ba08a90fc6fb390ec2230e30fcc622318c591a7c0e35dcb8150afb50c797eac3d7 languageName: node linkType: hard -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.10 - resolution: "@tsconfig/node12@npm:1.0.10" - checksum: 3683668703d5a2b43fe9b3135c5e475c401b5aaf7a586df8bb7eead1184b901d6606b6aee093dbb82e2d23b58f26104da433c86601a2912f512c1c935e4144a0 +"@stablelib/ed25519@npm:^1.0.2": + version: 1.0.3 + resolution: "@stablelib/ed25519@npm:1.0.3" + dependencies: + "@stablelib/random": "npm:^1.0.2" + "@stablelib/sha512": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 52e861e4fbd9d3d0a1a370d9ad96de8e2e15f133249bbbc32da66b8993e843db598054a3af17a746beb3fd5043b7529613a5dda7f2e79de6613eb3ebe5ffe3dd languageName: node linkType: hard -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.2 - resolution: "@tsconfig/node14@npm:1.0.2" - checksum: 6260dd461728c200921b4848cd9e1df2bfb2c1ee6c1b6dadbc9bf81afadff8ddf11c6312e08c07de89f6c40163916ff8307f6008bf6c76a4d72a2833dae7bf7c +"@stablelib/hash@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hash@npm:1.0.1" + checksum: 3ff1f12d1a4082aaf4b6cdf40c2010aabe5c4209d3b40b97b5bbb0d9abc0ee94abdc545e57de0614afaea807ca0212ac870e247ec8f66cdce91ec39ce82948cf languageName: node linkType: hard -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f +"@stablelib/hkdf@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/hkdf@npm:1.0.1" + dependencies: + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/hmac": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 9d45e303715a1835c8612b78e6c1b9d2b7463699b484241d8681fb5c17e0f2bbde5ce211c882134b64616a402e09177baeba80426995ff227b3654a155ab225d languageName: node linkType: hard -"@typechain/ethers-v5@npm:^10.0.0": - version: 10.2.1 - resolution: "@typechain/ethers-v5@npm:10.2.1" +"@stablelib/hmac@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hmac@npm:1.0.1" dependencies: - lodash: "npm:^4.17.15" - ts-essentials: "npm:^7.0.1" - peerDependencies: - "@ethersproject/abi": ^5.0.0 - "@ethersproject/providers": ^5.0.0 - ethers: ^5.1.3 - typechain: ^8.1.1 - typescript: ">=4.3.0" - checksum: 463dbb5cd7314d492c3fd53c18e888c33e7c70d1b6bf0ffb38697ef112998c27e9c6bdf22dc7c7662cd43dfca644e53c7f245b6795a6dc615e273b248cd96fa8 + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: d3ac9e2fea2b4972a5d874ee9d96c94f8c8207452e2d243a2668b1325a7b20bd9a1541df32387789a0e9bfef82c3fe021a785f46eb3442c782443863faf75205 languageName: node linkType: hard -"@typechain/hardhat@npm:^6.0.0": - version: 6.1.0 - resolution: "@typechain/hardhat@npm:6.1.0" - dependencies: - fs-extra: "npm:^9.1.0" - lodash: "npm:^4.17.15" - peerDependencies: - "@ethersproject/abi": ^5.4.7 - "@ethersproject/providers": ^5.4.7 - "@typechain/ethers-v5": ^10.1.0 - ethers: ^5.4.7 - hardhat: ^2.9.9 - typechain: ^8.1.0 - checksum: d905fcd6a49286fffec45c9a1977a43362005c01868ebf1ed30083e34ae0033ca360fed104923ea3dc821990fb7714a8ad9b43bc65971e8fdb48c4dd0406a39b +"@stablelib/int@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/int@npm:1.0.1" + checksum: 65bfbf50a382eea70c68e05366bf379cfceff8fbc076f1c267ef2f2411d7aed64fd140c415cb6c29f19a3910d3b8b7805d4b32ad5721a5007a8e744a808c7ae3 languageName: node linkType: hard -"@types/abstract-leveldown@npm:*": - version: 7.2.5 - resolution: "@types/abstract-leveldown@npm:7.2.5" - checksum: 3a99b13c81a53a62b42bea9cff326880de3146b4eeff528b039be69a268515b3120a6c12142e96646fcb0a03c463f298998581e86d9ddb29fbea3612f40edb2b +"@stablelib/keyagreement@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/keyagreement@npm:1.0.1" + dependencies: + "@stablelib/bytes": "npm:^1.0.1" + checksum: 3c8ec904dd50f72f3162f5447a0fa8f1d9ca6e24cd272d3dbe84971267f3b47f9bd5dc4e4eeedf3fbac2fe01f2d9277053e57c8e60db8c5544bfb35c62d290dd languageName: node linkType: hard -"@types/bn.js@npm:^4.11.3": - version: 4.11.6 - resolution: "@types/bn.js@npm:4.11.6" +"@stablelib/poly1305@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/poly1305@npm:1.0.1" dependencies: - "@types/node": "npm:*" - checksum: 9ff3e7a1539a953c381c0d30ea2049162e3cab894cda91ee10f3a84d603f9afa2b2bc2a38fe9b427de94b6e2b7b77aefd217c1c7b07a10ae8d7499f9d6697a41 + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: b01d4b532a42e5260f7f263e3a670924849c7ba51569abd8ece8279a448e625cbe4049bff1d50ad0d3a9d5f268c1b52fc611808640a6e684550edd7589a0a581 languageName: node linkType: hard -"@types/bn.js@npm:^5.1.0": - version: 5.1.0 - resolution: "@types/bn.js@npm:5.1.0" +"@stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": + version: 1.0.2 + resolution: "@stablelib/random@npm:1.0.2" dependencies: - "@types/node": "npm:*" - checksum: 43d06b6f802eb7479fc58a7910cfc7af0c540fab86529c1c9b0022b992df916fc41f811da8822b6726f4e20209d5809b456c25e7f3fce37c338ebdf684b8a4b6 + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: f5ace0a588dc4c21f01cb85837892d4c872e994ae77a58a8eb7dd61aa0b26fb1e9b46b0445e71af57d963ef7d9f5965c64258fc0d04df7b2947bc48f2d3560c5 languageName: node linkType: hard -"@types/bn.js@npm:^5.1.1": - version: 5.1.1 +"@stablelib/sha256@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha256@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 4d55f6c676e2cc0dd2a32be0cfa96837f3e15ae48dc50a340e56db2b201f1341a9ecabb429a3a44a5bf31adee0a8151467a8e7cc15346c561c914faad415d4d4 + languageName: node + linkType: hard + +"@stablelib/sha512@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha512@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 35d188cd62f20d27e1d61ea07984022e9a78815a023c8f7c747d92456a60823f0683138591e87158a47cd72e73cf24ecf97f8936aa6fba8b3bef6fcb138e723d + languageName: node + linkType: hard + +"@stablelib/wipe@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/wipe@npm:1.0.1" + checksum: 287802eb146810a46ba72af70b82022caf83a8aeebde23605f5ee0decf64fe2b97a60c856e43b6617b5801287c30cfa863cfb0469e7fcde6f02d143cf0c6cbf4 + languageName: node + linkType: hard + +"@stablelib/x25519@npm:^1.0.3": + version: 1.0.3 + resolution: "@stablelib/x25519@npm:1.0.3" + dependencies: + "@stablelib/keyagreement": "npm:^1.0.1" + "@stablelib/random": "npm:^1.0.2" + "@stablelib/wipe": "npm:^1.0.1" + checksum: fb5469e390ee2515d926633e3e179038894ac4f5e8c8cd2c2fc912022e34a051112eab0fe80c4dbc6e59129679844182562a036abff89444e5c4a05dd42ed329 + languageName: node + linkType: hard + +"@swc/helpers@npm:0.5.2": + version: 0.5.2 + resolution: "@swc/helpers@npm:0.5.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 3a3b179b3369acd26c5da89a0e779c756ae5231eb18a5507524c7abf955f488d34d86649f5b8417a0e19879688470d06319f5cfca2273d6d6b2046950e0d79af + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^5.0.1": + version: 5.0.1 + resolution: "@szmarczak/http-timer@npm:5.0.1" + dependencies: + defer-to-connect: "npm:^2.0.1" + checksum: fc9cb993e808806692e4a3337c90ece0ec00c89f4b67e3652a356b89730da98bc824273a6d67ca84d5f33cd85f317dcd5ce39d8cc0a2f060145a608a7cb8ce92 + languageName: node + linkType: hard + +"@tanstack/query-core@npm:4.36.1": + version: 4.36.1 + resolution: "@tanstack/query-core@npm:4.36.1" + checksum: 7c648872cd491bcab2aa4c18e0b7ca130c072f05c277a5876977fa3bfa87634bbfde46e9d249236587d78c39866889a02e4e202b478dc6074ff96093732ae56d + languageName: node + linkType: hard + +"@tanstack/query-persist-client-core@npm:4.36.1": + version: 4.36.1 + resolution: "@tanstack/query-persist-client-core@npm:4.36.1" + dependencies: + "@tanstack/query-core": "npm:4.36.1" + checksum: b511da36e5648f2680ba168db6ddc3f2e8fadda98431643ff21323726eb45bbf9334dd9e8a37687279526b464a0c8f1762332470f32e2bd8a0e72511878371cf + languageName: node + linkType: hard + +"@tanstack/query-sync-storage-persister@npm:^4.27.1": + version: 4.36.1 + resolution: "@tanstack/query-sync-storage-persister@npm:4.36.1" + dependencies: + "@tanstack/query-persist-client-core": "npm:4.36.1" + checksum: 27a31696ecf7f7ed64294a5212a873fc2852973982edcedf36d1fa53f1cb8b20654a79509f819d35f64861cdcf5d0d7e8782136a4f9aabcc8160cc577c1a4c03 + languageName: node + linkType: hard + +"@tanstack/react-query-persist-client@npm:^4.28.0": + version: 4.36.1 + resolution: "@tanstack/react-query-persist-client@npm:4.36.1" + dependencies: + "@tanstack/query-persist-client-core": "npm:4.36.1" + peerDependencies: + "@tanstack/react-query": ^4.36.1 + checksum: d6720fba52d98401d593be2f2d0a6e429394581082164c36629937abd788c8d80838749d36dce2b20558efd9cbbfa3131bf0212a187f0bef63811ea160d7b390 + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^4.24.10, @tanstack/react-query@npm:^4.28.0": + version: 4.36.1 + resolution: "@tanstack/react-query@npm:4.36.1" + dependencies: + "@tanstack/query-core": "npm:4.36.1" + use-sync-external-store: "npm:^1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: "*" + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 764b860c3ac8d254fc6b07e01054a0f58058644d59626c724b213293fbf1e31c198cbb26e4c32c0d16dcaec0353c0ae19147d9c667675b31f8cea1d64f1ff4ac + languageName: node + linkType: hard + +"@tanstack/react-virtual@npm:^3.0.0-beta.60": + version: 3.1.2 + resolution: "@tanstack/react-virtual@npm:3.1.2" + dependencies: + "@tanstack/virtual-core": "npm:3.1.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: dd7a241b4ea047bdf0fedc102ee73e9908cfe49145e48b2bbfa24279eb6ee2861465cb4f779a77182ffb4809ed8ffb584415f0670046ad2ccf2c43c03c59859a + languageName: node + linkType: hard + +"@tanstack/virtual-core@npm:3.1.2": + version: 3.1.2 + resolution: "@tanstack/virtual-core@npm:3.1.2" + checksum: 0e5c251050362eb0803b658210196e364172b9874900ea6bd1621ac58cb7b5d5add90a0e86a5b7a8f696921f9ff955effb58e65c02931056ce73adbc170af5cb + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@trivago/prettier-plugin-sort-imports@npm:^4.2.1": + version: 4.3.0 + resolution: "@trivago/prettier-plugin-sort-imports@npm:4.3.0" + dependencies: + "@babel/generator": "npm:7.17.7" + "@babel/parser": "npm:^7.20.5" + "@babel/traverse": "npm:7.23.2" + "@babel/types": "npm:7.17.0" + javascript-natural-sort: "npm:0.7.1" + lodash: "npm:^4.17.21" + peerDependencies: + "@vue/compiler-sfc": 3.x + prettier: 2.x - 3.x + peerDependenciesMeta: + "@vue/compiler-sfc": + optional: true + checksum: eb25cbeeaf85d3acd54019d1f3563447337a2faee7a35558adb69dff44ce3b93714a5b64ba4d0374f3df3191c32c993d441493fdc43a2c97c9b8a0e3d58702cf + languageName: node + linkType: hard + +"@trufflesuite/bigint-buffer@npm:1.1.10": + version: 1.1.10 + resolution: "@trufflesuite/bigint-buffer@npm:1.1.10" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:4.4.0" + checksum: 544b39fe3c7ebf895359bc46d255e350c723700601498674c8797bc2e6b6139cb898307530331d1c96821faa0b4a63d5a38876b4b32891dc3a4b3422014df0bf + languageName: node + linkType: hard + +"@trufflesuite/bigint-buffer@npm:1.1.9": + version: 1.1.9 + resolution: "@trufflesuite/bigint-buffer@npm:1.1.9" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:4.3.0" + checksum: e175bcfdaffe53a5e787146ea93e7687a3d755217a6a736e1efb7cfb9b7230f56671f5d4aa2fc29dba932da76ec26848014912c47c8bee839275fa75e17d01f1 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.10 + resolution: "@tsconfig/node12@npm:1.0.10" + checksum: 3683668703d5a2b43fe9b3135c5e475c401b5aaf7a586df8bb7eead1184b901d6606b6aee093dbb82e2d23b58f26104da433c86601a2912f512c1c935e4144a0 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.2 + resolution: "@tsconfig/node14@npm:1.0.2" + checksum: 6260dd461728c200921b4848cd9e1df2bfb2c1ee6c1b6dadbc9bf81afadff8ddf11c6312e08c07de89f6c40163916ff8307f6008bf6c76a4d72a2833dae7bf7c + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.3 + resolution: "@tsconfig/node16@npm:1.0.3" + checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f + languageName: node + linkType: hard + +"@typechain/ethers-v5@npm:^10.0.0": + version: 10.2.1 + resolution: "@typechain/ethers-v5@npm:10.2.1" + dependencies: + lodash: "npm:^4.17.15" + ts-essentials: "npm:^7.0.1" + peerDependencies: + "@ethersproject/abi": ^5.0.0 + "@ethersproject/providers": ^5.0.0 + ethers: ^5.1.3 + typechain: ^8.1.1 + typescript: ">=4.3.0" + checksum: 463dbb5cd7314d492c3fd53c18e888c33e7c70d1b6bf0ffb38697ef112998c27e9c6bdf22dc7c7662cd43dfca644e53c7f245b6795a6dc615e273b248cd96fa8 + languageName: node + linkType: hard + +"@typechain/hardhat@npm:^6.0.0": + version: 6.1.0 + resolution: "@typechain/hardhat@npm:6.1.0" + dependencies: + fs-extra: "npm:^9.1.0" + lodash: "npm:^4.17.15" + peerDependencies: + "@ethersproject/abi": ^5.4.7 + "@ethersproject/providers": ^5.4.7 + "@typechain/ethers-v5": ^10.1.0 + ethers: ^5.4.7 + hardhat: ^2.9.9 + typechain: ^8.1.0 + checksum: d905fcd6a49286fffec45c9a1977a43362005c01868ebf1ed30083e34ae0033ca360fed104923ea3dc821990fb7714a8ad9b43bc65971e8fdb48c4dd0406a39b + languageName: node + linkType: hard + +"@types/abstract-leveldown@npm:*": + version: 7.2.5 + resolution: "@types/abstract-leveldown@npm:7.2.5" + checksum: 3a99b13c81a53a62b42bea9cff326880de3146b4eeff528b039be69a268515b3120a6c12142e96646fcb0a03c463f298998581e86d9ddb29fbea3612f40edb2b + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: c32838d280b5ab59d62557f9e331d3831f8e547ee10b4f85cb78753d97d521270cebfc73ce501e9fb27fe71884d1ba75e18658692c2f4117543f0fc4e3e118b3 + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: b53c215e9074c69d212402990b0ca8fa57595d09e10d94bda3130aa22b55d796e50449199867879e4ea0ee968f3a2099e009cfb21a726a53324483abbf25cd30 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: d7a02d2a9b67e822694d8e6a7ddb8f2b71a1d6962dfd266554d2513eefbb205b33ca71a0d163b1caea3981ccf849211f9964d8bd0727124d18ace45aa6c9ae29 + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.5 + resolution: "@types/babel__traverse@npm:7.20.5" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: f0352d537448e1e37f27e6bb8c962d7893720a92fde9d8601a68a93dbc14e15c088b4c0c8f71021d0966d09fba802ef3de11fdb6766c33993f8cf24f1277c6a9 + languageName: node + linkType: hard + +"@types/bn.js@npm:^4.11.3": + version: 4.11.6 + resolution: "@types/bn.js@npm:4.11.6" + dependencies: + "@types/node": "npm:*" + checksum: 9ff3e7a1539a953c381c0d30ea2049162e3cab894cda91ee10f3a84d603f9afa2b2bc2a38fe9b427de94b6e2b7b77aefd217c1c7b07a10ae8d7499f9d6697a41 + languageName: node + linkType: hard + +"@types/bn.js@npm:^5.1.0": + version: 5.1.0 + resolution: "@types/bn.js@npm:5.1.0" + dependencies: + "@types/node": "npm:*" + checksum: 43d06b6f802eb7479fc58a7910cfc7af0c540fab86529c1c9b0022b992df916fc41f811da8822b6726f4e20209d5809b456c25e7f3fce37c338ebdf684b8a4b6 + languageName: node + linkType: hard + +"@types/bn.js@npm:^5.1.1": + version: 5.1.1 resolution: "@types/bn.js@npm:5.1.1" dependencies: "@types/node": "npm:*" @@ -5958,6 +7548,25 @@ __metadata: languageName: node linkType: hard +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "npm:*" + checksum: 79d746a8f053954bba36bd3d94a90c78de995d126289d656fb3271dd9f1229d33f678da04d10bce6be440494a5a73438e2e363e92802d16b8315b051036c5256 + languageName: node + linkType: hard + +"@types/hoist-non-react-statics@npm:^3.3.1": + version: 3.3.5 + resolution: "@types/hoist-non-react-statics@npm:3.3.5" + dependencies: + "@types/react": "npm:*" + hoist-non-react-statics: "npm:^3.3.0" + checksum: b645b062a20cce6ab1245ada8274051d8e2e0b2ee5c6bd58215281d0ec6dae2f26631af4e2e7c8abe238cdcee73fcaededc429eef569e70908f82d0cc0ea31d7 + languageName: node + linkType: hard + "@types/http-cache-semantics@npm:*": version: 4.0.1 resolution: "@types/http-cache-semantics@npm:4.0.1" @@ -5981,6 +7590,31 @@ __metadata: languageName: node linkType: hard +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" @@ -6187,6 +7821,13 @@ __metadata: languageName: node linkType: hard +"@types/prop-types@npm:*": + version: 15.7.11 + resolution: "@types/prop-types@npm:15.7.11" + checksum: 7519ff11d06fbf6b275029fe03fff9ec377b4cb6e864cac34d87d7146c7f5a7560fd164bdc1d2dbe00b60c43713631251af1fd3d34d46c69cd354602bc0c7c54 + languageName: node + linkType: hard + "@types/qs@npm:^6.2.31": version: 6.9.7 resolution: "@types/qs@npm:6.9.7" @@ -6194,6 +7835,17 @@ __metadata: languageName: node linkType: hard +"@types/react@npm:*": + version: 18.2.57 + resolution: "@types/react@npm:18.2.57" + dependencies: + "@types/prop-types": "npm:*" + "@types/scheduler": "npm:*" + csstype: "npm:^3.0.2" + checksum: beee45a8ee48862fb5101f6ebdd89ccc20c5a6df29dcd2315560bc3b57ea3af8d09a8e9bb1c58063a70f9010e0d2c7bd300819438e2ca62810285c3d7275ab5a + languageName: node + linkType: hard + "@types/readable-stream@npm:^2.3.13": version: 2.3.15 resolution: "@types/readable-stream@npm:2.3.15" @@ -6222,6 +7874,13 @@ __metadata: languageName: node linkType: hard +"@types/scheduler@npm:*": + version: 0.16.8 + resolution: "@types/scheduler@npm:0.16.8" + checksum: 6c091b096daa490093bf30dd7947cd28e5b2cd612ec93448432b33f724b162587fed9309a0acc104d97b69b1d49a0f3fc755a62282054d62975d53d7fd13472d + languageName: node + linkType: hard + "@types/secp256k1@npm:^4.0.1": version: 4.0.3 resolution: "@types/secp256k1@npm:4.0.3" @@ -6287,6 +7946,20 @@ __metadata: languageName: node linkType: hard +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 + languageName: node + linkType: hard + +"@types/trusted-types@npm:^2.0.2": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 8e4202766a65877efcf5d5a41b7dd458480b36195e580a3b1085ad21e948bc417d55d6f8af1fd2a7ad008015d4117d5fdfe432731157da3c68678487174e4ba3 + languageName: node + linkType: hard + "@types/wrap-ansi@npm:^3.0.0": version: 3.0.0 resolution: "@types/wrap-ansi@npm:3.0.0" @@ -6328,6 +8001,15 @@ __metadata: languageName: node linkType: hard +"@types/yargs@npm:^17.0.8": + version: 17.0.32 + resolution: "@types/yargs@npm:17.0.32" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 1e2b2673847011ce43607df690d392f137d95a2d6ea85aa319403eadda2ef4277365efd4982354d8843f2611ef3846c88599660aaeb537fa9ccddae83c2a89de + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.62.0": version: 5.62.0 resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" @@ -6449,6 +8131,73 @@ __metadata: languageName: node linkType: hard +"@urql/core@npm:^3.2.0": + version: 3.2.2 + resolution: "@urql/core@npm:3.2.2" + dependencies: + wonka: "npm:^6.1.2" + peerDependencies: + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 2ad58a282897d6c7ee07d09b5e78c12e86c8820e41390c3b2663262cb86e028557a77138d07476f58daea60e6950ff91063e7ed5827844d3d542d0a256688697 + languageName: node + linkType: hard + +"@vanilla-extract/css@npm:1.9.1": + version: 1.9.1 + resolution: "@vanilla-extract/css@npm:1.9.1" + dependencies: + "@emotion/hash": "npm:^0.8.0" + "@vanilla-extract/private": "npm:^1.0.3" + ahocorasick: "npm:1.0.2" + chalk: "npm:^4.1.1" + css-what: "npm:^5.0.1" + cssesc: "npm:^3.0.0" + csstype: "npm:^3.0.7" + deep-object-diff: "npm:^1.1.0" + deepmerge: "npm:^4.2.2" + media-query-parser: "npm:^2.0.2" + outdent: "npm:^0.8.0" + checksum: 0f3ff175356bdc7dd420bd68c997bedfb539ea2d0a056aca37f0825a518951edcb05a489969d083a97072a6ccc6a89bc64b89d8b26d9cc67774488855c44e1d3 + languageName: node + linkType: hard + +"@vanilla-extract/dynamic@npm:2.0.2": + version: 2.0.2 + resolution: "@vanilla-extract/dynamic@npm:2.0.2" + dependencies: + "@vanilla-extract/private": "npm:^1.0.3" + checksum: 26a73d2273f9da91ccbe3ffdcac92d3bab00921ade71c1bfd1936333d82aa3a8fc32c3c4ef962196d25a79fbdff1ccf060c9dd0fe0d73ca2f14f08fbc16a976c + languageName: node + linkType: hard + +"@vanilla-extract/private@npm:^1.0.3": + version: 1.0.3 + resolution: "@vanilla-extract/private@npm:1.0.3" + checksum: 5f27238d711fc190146869cb76258328d8d8c09bf4fca9df65168ce13704a5c78750824eb469fa961a2ab1cfefca43c37607d755b8a4aa937c8dd7df478036df + languageName: node + linkType: hard + +"@vanilla-extract/sprinkles@npm:1.5.0": + version: 1.5.0 + resolution: "@vanilla-extract/sprinkles@npm:1.5.0" + peerDependencies: + "@vanilla-extract/css": ^1.0.0 + checksum: 20045dc160ba7daa9772219dd4e73d76a6a9d77ede13f0f995a236a87e5f99b31ca409c35c49cab71cb2c568c2660b019bd4d7bbde26a523bd906b7f09146426 + languageName: node + linkType: hard + +"@wagmi/chains@npm:0.2.22": + version: 0.2.22 + resolution: "@wagmi/chains@npm:0.2.22" + peerDependencies: + typescript: ">=4.9.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 018f798831988579501311b934959dc93e101328794de6048e9fd6a6496260907642039e119d9266458b6884a99a3582d2a4011d823e57980d0145bebc7743d0 + languageName: node + linkType: hard + "@wagmi/chains@npm:^1.8.0": version: 1.8.0 resolution: "@wagmi/chains@npm:1.8.0" @@ -6461,6 +8210,478 @@ __metadata: languageName: node linkType: hard +"@wagmi/connectors@npm:0.3.22": + version: 0.3.22 + resolution: "@wagmi/connectors@npm:0.3.22" + dependencies: + "@coinbase/wallet-sdk": "npm:^3.6.6" + "@ledgerhq/connect-kit-loader": "npm:^1.0.1" + "@safe-global/safe-apps-provider": "npm:^0.15.2" + "@safe-global/safe-apps-sdk": "npm:^7.9.0" + "@walletconnect/ethereum-provider": "npm:2.8.4" + "@walletconnect/legacy-provider": "npm:^2.0.0" + "@walletconnect/modal": "npm:^2.5.4" + abitype: "npm:^0.3.0" + eventemitter3: "npm:^4.0.7" + peerDependencies: + "@wagmi/core": ">=0.9.x" + ethers: ">=5.5.1 <6" + typescript: ">=4.9.4" + peerDependenciesMeta: + "@wagmi/core": + optional: true + typescript: + optional: true + checksum: 1f527a2ec46ff735ee73395cb2f2fa6271324be48aa926c9dea9c5dd779ea4e00dd0f5e6dc35e9cc8adf95e00c00d0597dda61ba9537061f6fedd31c0a23350e + languageName: node + linkType: hard + +"@wagmi/core@npm:0.10.16": + version: 0.10.16 + resolution: "@wagmi/core@npm:0.10.16" + dependencies: + "@wagmi/chains": "npm:0.2.22" + "@wagmi/connectors": "npm:0.3.22" + abitype: "npm:^0.3.0" + eventemitter3: "npm:^4.0.7" + zustand: "npm:^4.3.1" + peerDependencies: + ethers: ">=5.5.1 <6" + typescript: ">=4.9.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: cd1c1c53985bac26fcecd00f3bb6cf6de260e797662518721a80c02902ce20b52e5d435681df6dbc8302665d06cfa84a5043e51fb814e822242575227768b0a9 + languageName: node + linkType: hard + +"@walletconnect/core@npm:2.8.4": + version: 2.8.4 + resolution: "@walletconnect/core@npm:2.8.4" + dependencies: + "@walletconnect/heartbeat": "npm:1.2.1" + "@walletconnect/jsonrpc-provider": "npm:1.0.13" + "@walletconnect/jsonrpc-types": "npm:1.0.3" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/jsonrpc-ws-connection": "npm:^1.0.11" + "@walletconnect/keyvaluestorage": "npm:^1.0.2" + "@walletconnect/logger": "npm:^2.0.1" + "@walletconnect/relay-api": "npm:^1.0.9" + "@walletconnect/relay-auth": "npm:^1.0.4" + "@walletconnect/safe-json": "npm:^1.0.2" + "@walletconnect/time": "npm:^1.0.2" + "@walletconnect/types": "npm:2.8.4" + "@walletconnect/utils": "npm:2.8.4" + events: "npm:^3.3.0" + lodash.isequal: "npm:4.5.0" + uint8arrays: "npm:^3.1.0" + checksum: 4b8089b526f83578ba5e004417e005d79ad33b7a08079e177b6e389e6c03588581a95f1b5c92819a6cc3330f2a8543b404a2a5a6524cb2d47405d1cc5b95f825 + languageName: node + linkType: hard + +"@walletconnect/crypto@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/crypto@npm:1.0.3" + dependencies: + "@walletconnect/encoding": "npm:^1.0.2" + "@walletconnect/environment": "npm:^1.0.1" + "@walletconnect/randombytes": "npm:^1.0.3" + aes-js: "npm:^3.1.2" + hash.js: "npm:^1.1.7" + tslib: "npm:1.14.1" + checksum: 6749da7f6b1e03a8aa2aa750bff0827ff59c70be6d58f7170e287d18507744fee507cba0f2a67b7ec3e50a4843420dc1f58a01f73735f90a4e75e47c7d39d5ab + languageName: node + linkType: hard + +"@walletconnect/encoding@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/encoding@npm:1.0.2" + dependencies: + is-typedarray: "npm:1.0.0" + tslib: "npm:1.14.1" + typedarray-to-buffer: "npm:3.1.5" + checksum: 046a7725864aba319a284fe5e8cebb45bb9d3cb81f15dd6a82f12c4a01aafaadf6b8b0239172948eacbbee87bfde4f47c22148a0f760f15f0161a39534e41e41 + languageName: node + linkType: hard + +"@walletconnect/environment@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/environment@npm:1.0.1" + dependencies: + tslib: "npm:1.14.1" + checksum: f6a1e3456e50cc7cfa58d99fd513ecac75573d0b8bcbbedcb1d7ec04ca9108df16b471afd40761b2a5cb4f66d8e33b7ba25f02c62c8365d68b1bd1ef52c1813e + languageName: node + linkType: hard + +"@walletconnect/ethereum-provider@npm:2.8.4": + version: 2.8.4 + resolution: "@walletconnect/ethereum-provider@npm:2.8.4" + dependencies: + "@walletconnect/jsonrpc-http-connection": "npm:^1.0.7" + "@walletconnect/jsonrpc-provider": "npm:^1.0.13" + "@walletconnect/jsonrpc-types": "npm:^1.0.3" + "@walletconnect/jsonrpc-utils": "npm:^1.0.8" + "@walletconnect/sign-client": "npm:2.8.4" + "@walletconnect/types": "npm:2.8.4" + "@walletconnect/universal-provider": "npm:2.8.4" + "@walletconnect/utils": "npm:2.8.4" + events: "npm:^3.3.0" + peerDependencies: + "@walletconnect/modal": ">=2" + peerDependenciesMeta: + "@walletconnect/modal": + optional: true + checksum: 5aee30c31c16016d5240f215bbae03b276b7cb783371d22d03ae2b7359cbcbcf9d9bce78b70dc035268d7a220c5e032e556477b16fb840c4e8406e6b04b1316b + languageName: node + linkType: hard + +"@walletconnect/events@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/events@npm:1.0.1" + dependencies: + keyvaluestorage-interface: "npm:^1.0.0" + tslib: "npm:1.14.1" + checksum: b5a105e9ac4d7d0a500085afd77b71e71a8ab78fd38b033e4ce91f8626fd8c254b1ba49a59c8c0ed8a00a7e8b93995163f414eda73c58694f8f830e453a902b6 + languageName: node + linkType: hard + +"@walletconnect/heartbeat@npm:1.2.1": + version: 1.2.1 + resolution: "@walletconnect/heartbeat@npm:1.2.1" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + tslib: "npm:1.14.1" + checksum: a68d7efe4e69c9749dd7c3a9e351dd22adccbb925447dd7f2b2978a4cd730695cc0b4e717a08bad0d0c60e0177b77618a53f3bfb4347659f3ccfe72d412c27fb + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-http-connection@npm:^1.0.4, @walletconnect/jsonrpc-http-connection@npm:^1.0.7": + version: 1.0.7 + resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.7" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.6" + "@walletconnect/safe-json": "npm:^1.0.1" + cross-fetch: "npm:^3.1.4" + tslib: "npm:1.14.1" + checksum: 2d915df34e37592bdc69712244fd4e19da68eab42a8c576dd94cbca66ccdf30d4bf223c093042c0c5b9c8acb0e0af5cd682e8d9916098bd6cdea9593b9474971 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-provider@npm:1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.6": + version: 1.0.13 + resolution: "@walletconnect/jsonrpc-provider@npm:1.0.13" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.8" + "@walletconnect/safe-json": "npm:^1.0.2" + tslib: "npm:1.14.1" + checksum: 27c7dfa898896ffd7250aecaf92b889663abe64ea605dae1b638743a9f1609f0e27b2bca761b3bbc2ed722bde1b012d901bba4de4067424905bfce514cc5e909 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.3, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" + dependencies: + keyvaluestorage-interface: "npm:^1.0.0" + tslib: "npm:1.14.1" + checksum: 7b1209c2e6ff476e45b0d828bd4d7773873c4cff41e5ed235ff8014b4e8ff09ec704817347702fe3b8ca1c1b7920abfd0af94e0cdf582a92d8a0192d8c42dce8 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.4, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.7, @walletconnect/jsonrpc-utils@npm:^1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" + dependencies: + "@walletconnect/environment": "npm:^1.0.1" + "@walletconnect/jsonrpc-types": "npm:^1.0.3" + tslib: "npm:1.14.1" + checksum: 4687b4582a5c33883d94e87ca8bb22d129a2a47b6e1d9e2c3210b74f02d9677723b3bf2283d2f0fa69866b0a66a80cdfada9a2f1c204d485fbd10d2baed1f0a6 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-ws-connection@npm:^1.0.11": + version: 1.0.14 + resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.14" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.6" + "@walletconnect/safe-json": "npm:^1.0.2" + events: "npm:^3.3.0" + ws: "npm:^7.5.1" + checksum: 2ad66217b62fb57a43c8edd33c27da0c9ba09cfec79f4d43e5d30bcb8224a48c1d1f0d6273be0371f2c7e33d8138a6fe03afa499b429ab7829d719677cd48f4d + languageName: node + linkType: hard + +"@walletconnect/keyvaluestorage@npm:^1.0.2": + version: 1.1.1 + resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" + dependencies: + "@walletconnect/safe-json": "npm:^1.0.1" + idb-keyval: "npm:^6.2.1" + unstorage: "npm:^1.9.0" + peerDependencies: + "@react-native-async-storage/async-storage": 1.x + peerDependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + checksum: fd9c275b3249d8e9f722866703b5c040eb35d0670c92a297428ffb700ac36c6b9978242beac5d2cfe97eb522ae01307cacd9c79ecf95640878804fce0f13c5e7 + languageName: node + linkType: hard + +"@walletconnect/legacy-client@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-client@npm:2.0.0" + dependencies: + "@walletconnect/crypto": "npm:^1.0.3" + "@walletconnect/encoding": "npm:^1.0.2" + "@walletconnect/jsonrpc-utils": "npm:^1.0.4" + "@walletconnect/legacy-types": "npm:^2.0.0" + "@walletconnect/legacy-utils": "npm:^2.0.0" + "@walletconnect/safe-json": "npm:^1.0.1" + "@walletconnect/window-getters": "npm:^1.0.1" + "@walletconnect/window-metadata": "npm:^1.0.1" + detect-browser: "npm:^5.3.0" + query-string: "npm:^6.13.5" + checksum: ae70c9f8a251a4f2eee97a4c6cd24ed64f30fbd38cfc9b4ed9e329e3817a2439bdc2b460515677511c551c2cbbaf23aafff512eb427b77ee61843eb4754430eb + languageName: node + linkType: hard + +"@walletconnect/legacy-modal@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-modal@npm:2.0.0" + dependencies: + "@walletconnect/legacy-types": "npm:^2.0.0" + "@walletconnect/legacy-utils": "npm:^2.0.0" + copy-to-clipboard: "npm:^3.3.3" + preact: "npm:^10.12.0" + qrcode: "npm:^1.5.1" + checksum: 3b9c741b781c2bff9c104134f1a17585c8c879ee8c1c2218a06f7a5f5f385a9b0f039d57df55bdc28f9f7d45b8a02e221ce7df025c9182001dad33f5efca18b5 + languageName: node + linkType: hard + +"@walletconnect/legacy-provider@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-provider@npm:2.0.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": "npm:^1.0.4" + "@walletconnect/jsonrpc-provider": "npm:^1.0.6" + "@walletconnect/legacy-client": "npm:^2.0.0" + "@walletconnect/legacy-modal": "npm:^2.0.0" + "@walletconnect/legacy-types": "npm:^2.0.0" + "@walletconnect/legacy-utils": "npm:^2.0.0" + checksum: 49b18d2ef7652d71a66ace75957e49b8a38e80cd5af43b8786276b8179cf1281d7158716f0605b6c15189e0c48736bd3779ec23fd46ebbb83d7b770f85d53eab + languageName: node + linkType: hard + +"@walletconnect/legacy-types@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-types@npm:2.0.0" + dependencies: + "@walletconnect/jsonrpc-types": "npm:^1.0.2" + checksum: 6d89021d1735a4a3f182aee78421bd8e783fdb1c51c93059f7b4727d66072afdc889b07be8e791919e7c1f52b93735f57b72fc1bfd5b890e17d9037fbb06fec7 + languageName: node + linkType: hard + +"@walletconnect/legacy-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-utils@npm:2.0.0" + dependencies: + "@walletconnect/encoding": "npm:^1.0.2" + "@walletconnect/jsonrpc-utils": "npm:^1.0.4" + "@walletconnect/legacy-types": "npm:^2.0.0" + "@walletconnect/safe-json": "npm:^1.0.1" + "@walletconnect/window-getters": "npm:^1.0.1" + "@walletconnect/window-metadata": "npm:^1.0.1" + detect-browser: "npm:^5.3.0" + query-string: "npm:^6.13.5" + checksum: 6dd7738b0b7c11eb8f06f639a37527759440453f350d616e7116e89dbec03f381a462102be2c2175ed02b886f1b420a80a144b623f1a63cf9e02cebe82bcdefe + languageName: node + linkType: hard + +"@walletconnect/logger@npm:^2.0.1": + version: 2.0.1 + resolution: "@walletconnect/logger@npm:2.0.1" + dependencies: + pino: "npm:7.11.0" + tslib: "npm:1.14.1" + checksum: 93ad8fd59a07a512ffb0f250dba83b15ea0b4ba7c5d676241c98238b78910e1c26d86a270b85a8c2809833bfd9e87325c37f55c88255102ad199d73da537bf42 + languageName: node + linkType: hard + +"@walletconnect/modal-core@npm:2.6.2": + version: 2.6.2 + resolution: "@walletconnect/modal-core@npm:2.6.2" + dependencies: + valtio: "npm:1.11.2" + checksum: 671184da341eebb6b7a3ad7c334851113683d71e6118f7203a377e493b61eb94bc0571484e497e577b9f4d7221a8a7034ad4b52af722c89fa4105627bed638ba + languageName: node + linkType: hard + +"@walletconnect/modal-ui@npm:2.6.2": + version: 2.6.2 + resolution: "@walletconnect/modal-ui@npm:2.6.2" + dependencies: + "@walletconnect/modal-core": "npm:2.6.2" + lit: "npm:2.8.0" + motion: "npm:10.16.2" + qrcode: "npm:1.5.3" + checksum: 5460ad7f4591c016b723b3f707ac0020e185b60744cf7132b4b4f48d71c87c1c55826f6e11005860f96bd11e0ed3f88da7cda4c0a1c35a0e5b7d6e53bc14cf15 + languageName: node + linkType: hard + +"@walletconnect/modal@npm:^2.5.4": + version: 2.6.2 + resolution: "@walletconnect/modal@npm:2.6.2" + dependencies: + "@walletconnect/modal-core": "npm:2.6.2" + "@walletconnect/modal-ui": "npm:2.6.2" + checksum: f8f132c89d1d7f44f2fa564c8d5122163610be4afb0cadc9576c77083471297c37ff62aae3a25492c0ddb480240a2a6ffefe3eba1fd48f1664160c6bac01466d + languageName: node + linkType: hard + +"@walletconnect/randombytes@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/randombytes@npm:1.0.3" + dependencies: + "@walletconnect/encoding": "npm:^1.0.2" + "@walletconnect/environment": "npm:^1.0.1" + randombytes: "npm:^2.1.0" + tslib: "npm:1.14.1" + checksum: 3069e58d3735af15895cade98665a50339275cbf98b20e638ae9266556183b01b8cb286739de6adfd733a86c51fd6322aff034c05dc464d7581f35c33eacb25b + languageName: node + linkType: hard + +"@walletconnect/relay-api@npm:^1.0.9": + version: 1.0.9 + resolution: "@walletconnect/relay-api@npm:1.0.9" + dependencies: + "@walletconnect/jsonrpc-types": "npm:^1.0.2" + tslib: "npm:1.14.1" + checksum: 037781d51427fbaf866848a3f0a0260bd97cfb077c4ebe6db3024b56895ba977633ca8b3e0e37b48673ba04f1abf6e40e9ef46da10ff0a3e1cf5722f0c5ec32a + languageName: node + linkType: hard + +"@walletconnect/relay-auth@npm:^1.0.4": + version: 1.0.4 + resolution: "@walletconnect/relay-auth@npm:1.0.4" + dependencies: + "@stablelib/ed25519": "npm:^1.0.2" + "@stablelib/random": "npm:^1.0.1" + "@walletconnect/safe-json": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + tslib: "npm:1.14.1" + uint8arrays: "npm:^3.0.0" + checksum: d9128b2a25f38ebf2f49f8c184dad5c997ad6343513bddd7941459c2f2757e6acfbcdd36dc9c12d0491f55723d5e2c5c0ee2e9cf381b3247274b920e95d4db0e + languageName: node + linkType: hard + +"@walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/safe-json@npm:1.0.2" + dependencies: + tslib: "npm:1.14.1" + checksum: b9d031dab3916d20fa5241d7ad2be425368ae489995ba3ba18d6ad88e81ad3ed093b8e867b8a4fc44759099896aeb5afee5635858cb80c4819ebc7ebb71ed5a6 + languageName: node + linkType: hard + +"@walletconnect/sign-client@npm:2.8.4": + version: 2.8.4 + resolution: "@walletconnect/sign-client@npm:2.8.4" + dependencies: + "@walletconnect/core": "npm:2.8.4" + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/heartbeat": "npm:1.2.1" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/logger": "npm:^2.0.1" + "@walletconnect/time": "npm:^1.0.2" + "@walletconnect/types": "npm:2.8.4" + "@walletconnect/utils": "npm:2.8.4" + events: "npm:^3.3.0" + checksum: a4c91d45925b7786df3f9a3028bf7adb34aaa55349707d6524e72c6b7f7370fe72b18cb019d92b574eaf86799a736f7ac1670f95a697ba52fcb4ac0a1b43968a + languageName: node + linkType: hard + +"@walletconnect/time@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/time@npm:1.0.2" + dependencies: + tslib: "npm:1.14.1" + checksum: ea84d0850e63306837f98a228e08a59f6945da38ba5553b1f158abeaa8ec4dc8a0025a0f0cfc843ddf05ce2947da95c02ac1e8cedce7092bbe1c2d46ca816dd9 + languageName: node + linkType: hard + +"@walletconnect/types@npm:2.8.4": + version: 2.8.4 + resolution: "@walletconnect/types@npm:2.8.4" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/heartbeat": "npm:1.2.1" + "@walletconnect/jsonrpc-types": "npm:1.0.3" + "@walletconnect/keyvaluestorage": "npm:^1.0.2" + "@walletconnect/logger": "npm:^2.0.1" + events: "npm:^3.3.0" + checksum: ac6dde3acaa324fadf593a7c6d8325428434d21c8b2efa64632245d9a0d1e8e6f19325abc28dfc31cdfe88122da49b727bf6fe5e5f217c0b92b272ef65f39873 + languageName: node + linkType: hard + +"@walletconnect/universal-provider@npm:2.8.4": + version: 2.8.4 + resolution: "@walletconnect/universal-provider@npm:2.8.4" + dependencies: + "@walletconnect/jsonrpc-http-connection": "npm:^1.0.7" + "@walletconnect/jsonrpc-provider": "npm:1.0.13" + "@walletconnect/jsonrpc-types": "npm:^1.0.2" + "@walletconnect/jsonrpc-utils": "npm:^1.0.7" + "@walletconnect/logger": "npm:^2.0.1" + "@walletconnect/sign-client": "npm:2.8.4" + "@walletconnect/types": "npm:2.8.4" + "@walletconnect/utils": "npm:2.8.4" + events: "npm:^3.3.0" + checksum: 5c72ca7fff90e96de5a939dfafaddbba74cddc1da1b76f6d04ce36691b3b8a72e107e90b2acaea53684397bd89da6f27219413da7388b6c8a29141004957288c + languageName: node + linkType: hard + +"@walletconnect/utils@npm:2.8.4": + version: 2.8.4 + resolution: "@walletconnect/utils@npm:2.8.4" + dependencies: + "@stablelib/chacha20poly1305": "npm:1.0.1" + "@stablelib/hkdf": "npm:1.0.1" + "@stablelib/random": "npm:^1.0.2" + "@stablelib/sha256": "npm:1.0.1" + "@stablelib/x25519": "npm:^1.0.3" + "@walletconnect/relay-api": "npm:^1.0.9" + "@walletconnect/safe-json": "npm:^1.0.2" + "@walletconnect/time": "npm:^1.0.2" + "@walletconnect/types": "npm:2.8.4" + "@walletconnect/window-getters": "npm:^1.0.1" + "@walletconnect/window-metadata": "npm:^1.0.1" + detect-browser: "npm:5.3.0" + query-string: "npm:7.1.3" + uint8arrays: "npm:^3.1.0" + checksum: c6947246eea36ce316e2d48922b2c0fe1238a3e83171b9c237bd300e0bc36119c6372c352ad015927f64d860e54b318b0d924972672da52b67c87732af2a6ac0 + languageName: node + linkType: hard + +"@walletconnect/window-getters@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-getters@npm:1.0.1" + dependencies: + tslib: "npm:1.14.1" + checksum: 8d3fcb134fbbe903ba4a63f1fa5a7849fd443874bf45488260afc2fe3b1cbe211f86da1d76ee844be7c0e8618ae67402f94c213432fd80b04715eaf72e2e00e3 + languageName: node + linkType: hard + +"@walletconnect/window-metadata@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-metadata@npm:1.0.1" + dependencies: + "@walletconnect/window-getters": "npm:^1.0.1" + tslib: "npm:1.14.1" + checksum: cf322e0860c4448cefcd81f34bc6d49d1a235a81e74a6146baefb74e47cf6c3c8050b65e534a3dc13f8d2aed3fc59732ccf48d5a01b5b23e08e1847fcffa950c + languageName: node + linkType: hard + "JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -6498,7 +8719,20 @@ __metadata: optional: true zod: optional: true - checksum: 90940804839b1b65cb5b427d934db9c1cc899157d6091f281b1ce94d9c0c08b1ae946ab43e984e70c031e94c49355f6677475a7242ec60cae5457c074dcd40f9 + checksum: 90940804839b1b65cb5b427d934db9c1cc899157d6091f281b1ce94d9c0c08b1ae946ab43e984e70c031e94c49355f6677475a7242ec60cae5457c074dcd40f9 + languageName: node + linkType: hard + +"abitype@npm:^0.3.0": + version: 0.3.0 + resolution: "abitype@npm:0.3.0" + peerDependencies: + typescript: ">=4.9.4" + zod: ">=3.19.1" + peerDependenciesMeta: + zod: + optional: true + checksum: 5da1f1fa953b77fbe13586419ef5d2908e585a53907dab658b1e87dd7744ec636d990eb09902c9bf216d5976d0ea1b45644de61434971ae94410ae40483b59dd languageName: node linkType: hard @@ -6590,6 +8824,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.11.3": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: b688e7e3c64d9bfb17b596e1b35e4da9d50553713b3b3630cf5690f2b023a84eac90c56851e6912b483fe60e8b4ea28b254c07e92f17ef83d72d78745a8352dd + languageName: node + linkType: hard + "acorn@npm:^8.4.1": version: 8.7.1 resolution: "acorn@npm:8.7.1" @@ -6629,6 +8872,13 @@ __metadata: languageName: node linkType: hard +"aes-js@npm:^3.1.2": + version: 3.1.2 + resolution: "aes-js@npm:3.1.2" + checksum: b65916767034a51375a3ac5aad62af452d89a386c1ae7b607bb9145d0bb8b8823bf2f3eba85bdfa52d61c65d5aed90ba90f677b8c826bfa1a8b7ae2fa3b54d91 + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -6668,6 +8918,13 @@ __metadata: languageName: node linkType: hard +"ahocorasick@npm:1.0.2": + version: 1.0.2 + resolution: "ahocorasick@npm:1.0.2" + checksum: b2da9f3a7e6faae9975ffdb15a0d7a6c6590f8cf902fe8dc08ba972b59b61a25276923d7776fbd1844685a15600c24353dee3ee5a1cb27244fd64f1522b2c04a + languageName: node + linkType: hard + "ajv@npm:^6.10.0, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -6720,7 +8977,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -6791,6 +9048,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + "ansi-styles@npm:^6.0.0": version: 6.1.0 resolution: "ansi-styles@npm:6.1.0" @@ -6814,6 +9078,16 @@ __metadata: languageName: node linkType: hard +"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + "anymatch@npm:~3.1.1, anymatch@npm:~3.1.2": version: 3.1.2 resolution: "anymatch@npm:3.1.2" @@ -7056,6 +9330,15 @@ __metadata: languageName: node linkType: hard +"async-mutex@npm:^0.2.6": + version: 0.2.6 + resolution: "async-mutex@npm:0.2.6" + dependencies: + tslib: "npm:^2.0.0" + checksum: 3cf676fc48b4686abf534cc02d4784bab3f35d7836a0a7476c96e57c3f6607dd3d94cc0989b29d33ce5ae5cde8be8e1a96f3e769ba3b0e1ba4a244f873aa5623 + languageName: node + linkType: hard + "async@npm:^2.6.4": version: 2.6.4 resolution: "async@npm:2.6.4" @@ -7079,6 +9362,13 @@ __metadata: languageName: node linkType: hard +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: 3ab6d2cf46b31394b4607e935ec5c1c3c4f60f3e30f0913d35ea74b51b3585e84f590d09e58067f11762eec71c87d25314ce859030983dc0e4397eed21daa12e + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -7142,6 +9432,82 @@ __metadata: languageName: node linkType: hard +"babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": "npm:^29.7.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.6.3" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 8a0953bd813b3a8926008f7351611055548869e9a53dd36d6e7e96679001f71e65fd7dbfe253265c3ba6a4e630dc7c845cf3e78b17d758ef1880313ce8fba258 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: ffd436bb2a77bbe1942a33245d770506ab2262d9c1b3c1f1da7f0592f78ee7445a95bc2efafe619dd9c1b6ee52c10033d6c7d29ddefe6f5383568e60f31dfe8d + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" + dependencies: + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 9bfa86ec4170bd805ab8ca5001ae50d8afcb30554d236ba4a7ffc156c1a92452e220e4acbd98daefc12bf0216fccd092d0a2efed49e7e384ec59e0597a926d65 + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.0.1 + resolution: "babel-preset-current-node-syntax@npm:1.0.1" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.8.3" + "@babel/plugin-syntax-import-meta": "npm:^7.8.3" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 94561959cb12bfa80867c9eeeace7c3d48d61707d33e55b4c3fdbe82fc745913eb2dbfafca62aef297421b38aadcb58550e5943f50fbcebbeefd70ce2bed4b74 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -7230,6 +9596,13 @@ __metadata: languageName: node linkType: hard +"bignumber.js@npm:^9.1.2": + version: 9.1.2 + resolution: "bignumber.js@npm:9.1.2" + checksum: d89b8800a987225d2c00dcbf8a69dc08e92aa0880157c851c287b307d31ceb2fc2acb0c62c3e3a3d42b6c5fcae9b004035f13eb4386e56d529d7edac18d5c9d8 + languageName: node + linkType: hard + "binary-extensions@npm:^2.0.0": version: 2.2.0 resolution: "binary-extensions@npm:2.2.0" @@ -7331,6 +9704,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.1": + version: 1.20.1 + resolution: "body-parser@npm:1.20.1" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.4" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.11.0" + raw-body: "npm:2.5.1" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 5f8d128022a2fb8b6e7990d30878a0182f300b70e46b3f9d358a9433ad6275f0de46add6d63206da3637c01c3b38b6111a7480f7e7ac2e9f7b989f6133fe5510 + languageName: node + linkType: hard + "borsh@npm:^0.7.0": version: 0.7.0 resolution: "borsh@npm:0.7.0" @@ -7426,6 +9819,29 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.22.2": + version: 4.23.0 + resolution: "browserslist@npm:4.23.0" + dependencies: + caniuse-lite: "npm:^1.0.30001587" + electron-to-chromium: "npm:^1.4.668" + node-releases: "npm:^2.0.14" + update-browserslist-db: "npm:^1.0.13" + bin: + browserslist: cli.js + checksum: 496c3862df74565dd942b4ae65f502c575cbeba1fa4a3894dad7aa3b16130dc3033bc502d8848147f7b625154a284708253d9598bcdbef5a1e34cf11dc7bad8e + languageName: node + linkType: hard + +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: "npm:2.x" + checksum: e6d3ff82698bb3f20ce64fb85355c5716a3cf267f3977abe93bf9c32a2e46186b253f48a028ae5b96ab42bacd2c826766d9ae8cf6892f9b944656be9113cf212 + languageName: node + linkType: hard + "bs58@npm:^4.0.0, bs58@npm:^4.0.1": version: 4.0.1 resolution: "bs58@npm:4.0.1" @@ -7446,6 +9862,15 @@ __metadata: languageName: node linkType: hard +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: edba1b65bae682450be4117b695997972bd9a3c4dfee029cab5bcb72ae5393a79a8f909b8bc77957eb0deec1c7168670f18f4d5c556f46cdd3bca5f3b3a8d020 + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -7530,7 +9955,7 @@ __metadata: languageName: node linkType: hard -"busboy@npm:^1.6.0": +"busboy@npm:1.6.0, busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" dependencies: @@ -7662,13 +10087,27 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.0.0": +"camelcase@npm:^6.0.0, camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001406": + version: 1.0.30001589 + resolution: "caniuse-lite@npm:1.0.30001589" + checksum: 5e1d2eb7c32d48c52204227bc1377f0f4c758ef889c53b9b479e28470e7f82eb1db5853e7754be9600ee662ae32a1d58e8bef0fde6edab06322ddbabfd9d212f + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001587": + version: 1.0.30001587 + resolution: "caniuse-lite@npm:1.0.30001587" + checksum: 960e26927ad876971021186337df1df2d37d7ed4fc7907098c060f56ae8de737d471791e51387ca55bea07f56b0a76553a90125f88a2f958ca1f4f715013cf71 + languageName: node + linkType: hard + "case@npm:^1.6.3": version: 1.6.3 resolution: "case@npm:1.6.3" @@ -7741,7 +10180,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -7758,6 +10197,13 @@ __metadata: languageName: node linkType: hard +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 1ec5c2906adb9f84e7f6732a40baef05d7c85401b82ffcbc44b85fbd0f7a2b0c2a96f2eb9cf55cae3235dc12d4023003b88f09bcae8be9ae894f52ed746f4d48 + languageName: node + linkType: hard + "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -7826,6 +10272,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df + languageName: node + linkType: hard + "chownr@npm:^1.1.1, chownr@npm:^1.1.4": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -7877,6 +10342,22 @@ __metadata: languageName: node linkType: hard +"citty@npm:^0.1.5": + version: 0.1.6 + resolution: "citty@npm:0.1.6" + dependencies: + consola: "npm:^3.2.3" + checksum: 3208947e73abb699a12578ee2bfee254bf8dd1ce0d5698e8a298411cabf16bd3620d63433aef5bd88cdb2b9da71aef18adefa3b4ffd18273bb62dd1d28c344f5 + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.2.3 + resolution: "cjs-module-lexer@npm:1.2.3" + checksum: f96a5118b0a012627a2b1c13bd2fcb92509778422aaa825c5da72300d6dcadfb47134dd2e9d97dfa31acd674891dd91642742772d19a09a8adc3e56bd2f5928c + languageName: node + linkType: hard + "class-is@npm:^1.1.0": version: 1.1.0 resolution: "class-is@npm:1.1.0" @@ -7962,6 +10443,24 @@ __metadata: languageName: node linkType: hard +"client-only@npm:0.0.1, client-only@npm:^0.0.1": + version: 0.0.1 + resolution: "client-only@npm:0.0.1" + checksum: 0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 + languageName: node + linkType: hard + +"clipboardy@npm:^4.0.0": + version: 4.0.0 + resolution: "clipboardy@npm:4.0.0" + dependencies: + execa: "npm:^8.0.1" + is-wsl: "npm:^3.1.0" + is64bit: "npm:^2.0.0" + checksum: ec4ebe7e5c81d9c9cb994637e7b0e068c1c8fc272167ecd5519f967427271ec66e0e64da7268a2630b860eff42933aeabe25ba5e42bb80dbf1fae6362df059ed + languageName: node + linkType: hard + "cliui@npm:^5.0.0": version: 5.0.0 resolution: "cliui@npm:5.0.0" @@ -8022,6 +10521,34 @@ __metadata: languageName: node linkType: hard +"clsx@npm:1.1.1": + version: 1.1.1 + resolution: "clsx@npm:1.1.1" + checksum: ff052650329773b9b245177305fc4c4dc3129f7b2be84af4f58dc5defa99538c61d4207be7419405a5f8f3d92007c954f4daba5a7b74e563d5de71c28c830063 + languageName: node + linkType: hard + +"clsx@npm:^1.1.1, clsx@npm:^1.2.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 5ded6f61f15f1fa0350e691ccec43a28b12fb8e64c8e94715f2a937bc3722d4c3ed41d6e945c971fc4dcc2a7213a43323beaf2e1c28654af63ba70c9968a8643 + languageName: node + linkType: hard + +"cluster-key-slot@npm:^1.1.0": + version: 1.1.2 + resolution: "cluster-key-slot@npm:1.1.2" + checksum: 516ed8b5e1a14d9c3a9c96c72ef6de2d70dfcdbaa0ec3a90bc7b9216c5457e39c09a5775750c272369070308542e671146120153062ab5f2f481bed5de2c925f + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: a5d9f37091c70398a269e625cedff5622f200ed0aa0cff22ee7b55ed74a123834b58711776eb0f1dc58eb6ebbc1185aa7567b57bd5979a948c6e4f85073e2c05 + languageName: node + linkType: hard + "code-point-at@npm:^1.0.0": version: 1.1.0 resolution: "code-point-at@npm:1.1.0" @@ -8036,6 +10563,13 @@ __metadata: languageName: node linkType: hard +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: 30ea7d5c9ee51f2fdba4901d4186c5b7114a088ef98fd53eda3979da77eed96758a2cae81cc6d97e239aaea6065868cf908b24980663f7b7e96aa291b3e12fa4 + languageName: node + linkType: hard + "color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -8195,6 +10729,13 @@ __metadata: languageName: node linkType: hard +"consola@npm:^3.2.3": + version: 3.2.3 + resolution: "consola@npm:3.2.3" + checksum: 02972dcb048c337357a3628438e5976b8e45bcec22fdcfbe9cd17622992953c4d695d5152f141464a02deac769b1d23028e8ac87f56483838df7a6bbf8e0f5a2 + languageName: node + linkType: hard + "console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0, console-control-strings@npm:~1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" @@ -8229,6 +10770,20 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 + languageName: node + linkType: hard + +"cookie-es@npm:^1.0.0": + version: 1.0.0 + resolution: "cookie-es@npm:1.0.0" + checksum: 7654e65c3a0b6b6e5d695aa05da72e5e77235a0a8bc3ac94afb3be250db82bea721aa18fb879d6ebc9627ea39c3efc8211ef76bf24bc534e600ac575929f2f1b + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -8250,6 +10805,15 @@ __metadata: languageName: node linkType: hard +"copy-to-clipboard@npm:^3.3.3": + version: 3.3.3 + resolution: "copy-to-clipboard@npm:3.3.3" + dependencies: + toggle-selection: "npm:^1.0.6" + checksum: e0a325e39b7615108e6c1c8ac110ae7b829cdc4ee3278b1df6a0e4228c490442cc86444cd643e2da344fbc424b3aab8909e2fec82f8bc75e7e5b190b7c24eecf + languageName: node + linkType: hard + "core-js-pure@npm:^3.0.1": version: 3.22.8 resolution: "core-js-pure@npm:3.22.8" @@ -8271,7 +10835,7 @@ __metadata: languageName: node linkType: hard -"cors@npm:^2.8.1": +"cors@npm:^2.8.1, cors@npm:^2.8.5": version: 2.8.5 resolution: "cors@npm:2.8.5" dependencies: @@ -8351,6 +10915,23 @@ __metadata: languageName: node linkType: hard +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 847b4764451672b4174be4d5c6d7d63442ec3aa5f3de52af924e4d996d87d7801c18e125504f25232fc75840f6625b3ac85860fac6ce799b5efae7bdcaf4a2b7 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -8389,6 +10970,13 @@ __metadata: languageName: node linkType: hard +"crossws@npm:^0.1.0": + version: 0.1.1 + resolution: "crossws@npm:0.1.1" + checksum: 2029638e059f4bb62c10fe420e24d7fff97bcf9f93e380e0d90f117cf055deb7f07dae16df65a0aaeeb8ecd7b71fedd735deca7dde56351ea7b377915c37b68b + languageName: node + linkType: hard + "crypt@npm:>= 0.0.1": version: 0.0.2 resolution: "crypt@npm:0.0.2" @@ -8403,6 +10991,29 @@ __metadata: languageName: node linkType: hard +"css-what@npm:^5.0.1": + version: 5.1.0 + resolution: "css-what@npm:5.1.0" + checksum: 3b1f0abdf104a2e887be45c5b710b063d3fa7468d1d1eea071fbd6e5b3e2e7d4c0cb001edec07ea5a360c06425f351e0356539155b70ea461382c9c7bcaba4d7 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 0e161912c1306861d8f46e1883be1cbc8b1b2879f0f509287c0db71796e4ddfb97ac96bdfca38f77f452e2c10554e1bb5678c99b07a5cf947a12778f73e47e12 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2, csstype@npm:^3.0.7": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: f593cce41ff5ade23f44e77521e3a1bcc2c64107041e1bf6c3c32adc5187d0d60983292fda326154d20b01079e24931aa5b08e4467cc488b60bb1e7f6d478ade + languageName: node + linkType: hard + "csv-generate@npm:^3.4.3": version: 3.4.3 resolution: "csv-generate@npm:3.4.3" @@ -8480,7 +11091,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -8532,6 +11143,13 @@ __metadata: languageName: node linkType: hard +"decode-uri-component@npm:^0.2.2": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 17a0e5fa400bf9ea84432226e252aa7b5e72793e16bf80b907c99b46a799aeacc139ec20ea57121e50c7bd875a1a4365928f884e92abf02e21a5a13790a0f33e + languageName: node + linkType: hard + "decompress-response@npm:^3.2.0, decompress-response@npm:^3.3.0": version: 3.3.0 resolution: "decompress-response@npm:3.3.0" @@ -8559,6 +11177,18 @@ __metadata: languageName: node linkType: hard +"dedent@npm:^1.0.0": + version: 1.5.1 + resolution: "dedent@npm:1.5.1" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: fc00a8bc3dfb7c413a778dc40ee8151b6c6ff35159d641f36ecd839c1df5c6e0ec5f4992e658c82624a1a62aaecaffc23b9c965ceb0bbf4d698bfc16469ac27d + languageName: node + linkType: hard + "deep-eql@npm:^3.0.1": version: 3.0.1 resolution: "deep-eql@npm:3.0.1" @@ -8591,6 +11221,27 @@ __metadata: languageName: node linkType: hard +"deep-object-diff@npm:^1.1.0": + version: 1.1.9 + resolution: "deep-object-diff@npm:1.1.9" + checksum: b9771cc1ca08a34e408309eaab967bd2ab697684abdfa1262f4283ced8230a9ace966322f356364ff71a785c6e9cc356b7596582e900da5726e6b87d4b2a1463 + languageName: node + linkType: hard + +"deepmerge@npm:^2.1.1": + version: 2.2.1 + resolution: "deepmerge@npm:2.2.1" + checksum: a3da411cd3d471a8ae86ff7fd5e19abb648377b3f8c42a9e4c822406c2960a391cb829e4cca53819b73715e68f56b06f53c643ca7bba21cab569fecc9a723de1 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529 + languageName: node + linkType: hard + "defaults@npm:^1.0.3": version: 1.0.4 resolution: "defaults@npm:1.0.4" @@ -8649,6 +11300,13 @@ __metadata: languageName: node linkType: hard +"defu@npm:^6.1.3, defu@npm:^6.1.4": + version: 6.1.4 + resolution: "defu@npm:6.1.4" + checksum: aeffdb47300f45b4fdef1c5bd3880ac18ea7a1fd5b8a8faf8df29350ff03bf16dd34f9800205cab513d476e4c0a3783aa0cff0a433aff0ac84a67ddc4c8a2d64 + languageName: node + linkType: hard + "delay@npm:^5.0.0": version: 5.0.0 resolution: "delay@npm:5.0.0" @@ -8670,6 +11328,13 @@ __metadata: languageName: node linkType: hard +"denque@npm:^2.1.0": + version: 2.1.0 + resolution: "denque@npm:2.1.0" + checksum: 8ea05321576624b90acfc1ee9208b8d1d04b425cf7573b9b4fa40a2c3ed4d4b0af5190567858f532f677ed2003d4d2b73c8130b34e3c7b8d5e88cdcfbfaa1fe7 + languageName: node + linkType: hard + "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -8684,6 +11349,13 @@ __metadata: languageName: node linkType: hard +"destr@npm:^2.0.1, destr@npm:^2.0.2": + version: 2.0.3 + resolution: "destr@npm:2.0.3" + checksum: dbb756baa876810ec0ca4bcb702d86cc3b480ed14f36bf5747718ed211f96bca5520b63a4109eb181ad940ee2a645677d9a63d4a0ed11a7510619dae97317201 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -8691,6 +11363,13 @@ __metadata: languageName: node linkType: hard +"detect-browser@npm:5.3.0, detect-browser@npm:^5.3.0": + version: 5.3.0 + resolution: "detect-browser@npm:5.3.0" + checksum: 4a8551e1f5170633c9aa976f16c57f81f1044d071b2eb853c572bd817bf9cd0cc90c9c520d950edb5accd31b1b0c8ddb7a96e82040b0b5579f9f09c77446a117 + languageName: node + linkType: hard + "detect-indent@npm:^6.0.0": version: 6.1.0 resolution: "detect-indent@npm:6.1.0" @@ -8707,6 +11386,20 @@ __metadata: languageName: node linkType: hard +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 + languageName: node + linkType: hard + +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449 + languageName: node + linkType: hard + "detect-port@npm:^1.3.0": version: 1.3.0 resolution: "detect-port@npm:1.3.0" @@ -8720,6 +11413,13 @@ __metadata: languageName: node linkType: hard +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 179daf9d2f9af5c57ad66d97cb902a538bcf8ed64963fa7aa0c329b3de3665ce2eb6ffdc2f69f29d445fa4af2517e5e55e5b6e00c00a9ae4f43645f97f7078cb + languageName: node + linkType: hard + "diff@npm:3.5.0": version: 3.5.0 resolution: "diff@npm:3.5.0" @@ -8757,6 +11457,13 @@ __metadata: languageName: node linkType: hard +"dijkstrajs@npm:^1.0.1": + version: 1.0.3 + resolution: "dijkstrajs@npm:1.0.3" + checksum: 0d8429699a6d5897ed371de494ef3c7072e8052b42abbd978e686a9b8689e70af005fa3e93e93263ee3653673ff5f89c36db830a57ae7c2e088cb9c496307507 + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -8782,6 +11489,15 @@ __metadata: languageName: node linkType: hard +"dotenv-flow@npm:^4.1.0": + version: 4.1.0 + resolution: "dotenv-flow@npm:4.1.0" + dependencies: + dotenv: "npm:^16.0.0" + checksum: 75c36fefbc25e8c4f2cd6cff0a161444c7f2e992ea24662c63887aa57950007355df5bf153a6acc7e20c05ff3e5b783150e255ce543464a748de32bb9c6e222c + languageName: node + linkType: hard + "dotenv@npm:^10.0.0": version: 10.0.0 resolution: "dotenv@npm:10.0.0" @@ -8789,6 +11505,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^16.0.0": + version: 16.4.4 + resolution: "dotenv@npm:16.4.4" + checksum: ddf43ede209d5f54c9da688e93326162eb0fc367ad1869909568cb15571ab8c87a0fab4e1d4af9860be0571c707a8b4aefa060a4f1b0bb14298a81e0ccf0017d + languageName: node + linkType: hard + "duplexer3@npm:^0.1.4": version: 0.1.4 resolution: "duplexer3@npm:0.1.4" @@ -8796,6 +11519,18 @@ __metadata: languageName: node linkType: hard +"duplexify@npm:^4.1.2": + version: 4.1.2 + resolution: "duplexify@npm:4.1.2" + dependencies: + end-of-stream: "npm:^1.4.1" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + stream-shift: "npm:^1.0.0" + checksum: eeb4f362defa4da0b2474d853bc4edfa446faeb1bde76819a68035632c118de91f6a58e6fe05c84f6e6de2548f8323ec8473aa9fe37332c99e4d77539747193e + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -8820,6 +11555,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.668": + version: 1.4.671 + resolution: "electron-to-chromium@npm:1.4.671" + checksum: 2b3d85feb86800020bb249ace65dec428452a2e035145718c08023de788873ca3d35915845824cbe6773ee40dc35ecd596b45fc9e2c16de58ecdda6f551cba90 + languageName: node + linkType: hard + "elliptic@npm:6.5.4, elliptic@npm:^6.4.0, elliptic@npm:^6.5.2, elliptic@npm:^6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" @@ -8842,6 +11584,13 @@ __metadata: languageName: node linkType: hard +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: fbe214171d878b924eedf1757badf58a5dce071cd1fa7f620fa841a0901a80d6da47ff05929d53163105e621ce11a71b9d8acb1148ffe1745e045145f6e69521 + languageName: node + linkType: hard + "emoji-regex@npm:^7.0.1": version: 7.0.3 resolution: "emoji-regex@npm:7.0.3" @@ -8863,6 +11612,13 @@ __metadata: languageName: node linkType: hard +"encode-utf8@npm:^1.0.3": + version: 1.0.3 + resolution: "encode-utf8@npm:1.0.3" + checksum: 0204c37cda21bf19bb8f87f7ec6c89a23d43488c2ef1e5cfa40b64ee9568e63e15dc323fa7f50a491e2c6d33843a6b409f6de09afbf6cf371cb8da596cc64b44 + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -9142,6 +11898,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + "escodegen@npm:1.8.x": version: 1.8.1 resolution: "escodegen@npm:1.8.1" @@ -9339,6 +12102,19 @@ __metadata: languageName: node linkType: hard +"eth-block-tracker@npm:^7.1.0": + version: 7.1.0 + resolution: "eth-block-tracker@npm:7.1.0" + dependencies: + "@metamask/eth-json-rpc-provider": "npm:^1.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" + json-rpc-random-id: "npm:^1.0.1" + pify: "npm:^3.0.0" + checksum: b001ecb126e949a9ff19950596d5180b2f1bc5504e3dec0c01b3417e8ad190f4a53dfc61be901b72ab6dd558d1d711b73eca560bc8a605d0348eef9f501defab + languageName: node + linkType: hard + "eth-ens-namehash@npm:2.0.8": version: 2.0.8 resolution: "eth-ens-namehash@npm:2.0.8" @@ -9377,6 +12153,19 @@ __metadata: languageName: node linkType: hard +"eth-json-rpc-filters@npm:^6.0.0": + version: 6.0.1 + resolution: "eth-json-rpc-filters@npm:6.0.1" + dependencies: + "@metamask/safe-event-emitter": "npm:^3.0.0" + async-mutex: "npm:^0.2.6" + eth-query: "npm:^2.1.2" + json-rpc-engine: "npm:^6.1.0" + pify: "npm:^5.0.0" + checksum: d1fa8bb21da07c2f5d37c1e6053d499b272b4f49542077efc6b05eebe49affa9df7221c8c2439c4e33caa3f4ccb35240a6105abc83b83375dae03c0de53113a7 + languageName: node + linkType: hard + "eth-lib@npm:0.2.8": version: 0.2.8 resolution: "eth-lib@npm:0.2.8" @@ -9402,6 +12191,25 @@ __metadata: languageName: node linkType: hard +"eth-query@npm:^2.1.2": + version: 2.1.2 + resolution: "eth-query@npm:2.1.2" + dependencies: + json-rpc-random-id: "npm:^1.0.0" + xtend: "npm:^4.0.1" + checksum: af4f3575b8315f8156a83a24e850881053748aca97e4aee12dd6645ab56f0985c7000a5c45ccf315702f3e532f0c6464e03f4aba294c658dee89f5e5d1b86702 + languageName: node + linkType: hard + +"eth-rpc-errors@npm:^4.0.2": + version: 4.0.3 + resolution: "eth-rpc-errors@npm:4.0.3" + dependencies: + fast-safe-stringify: "npm:^2.0.6" + checksum: 47ce14170eabaee51ab1cc7e643bb3ef96ee6b15c6404806aedcd51750e00ae0b1a12c37785b180679b8d452b6dd44a0240bb018d01fa73efc85fcfa808b35a7 + languageName: node + linkType: hard + "ethereum-bloom-filters@npm:^1.0.6": version: 1.0.10 resolution: "ethereum-bloom-filters@npm:1.0.10" @@ -9446,6 +12254,18 @@ __metadata: languageName: node linkType: hard +"ethereum-cryptography@npm:^2.0.0": + version: 2.1.3 + resolution: "ethereum-cryptography@npm:2.1.3" + dependencies: + "@noble/curves": "npm:1.3.0" + "@noble/hashes": "npm:1.3.3" + "@scure/bip32": "npm:1.3.3" + "@scure/bip39": "npm:1.2.2" + checksum: cc5aa9a4368dc1dd7680ba921957c098ced7b3d7dbb1666334013ab2f8d4cd25a785ad84e66fd9f5c5a9b6de337930ea24ff8c722938f36a9c00cec597ca16b5 + languageName: node + linkType: hard + "ethereum-waffle@npm:^4.0.10": version: 4.0.10 resolution: "ethereum-waffle@npm:4.0.10" @@ -9515,24 +12335,7 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^4.0.40": - version: 4.0.49 - resolution: "ethers@npm:4.0.49" - dependencies: - aes-js: "npm:3.0.0" - bn.js: "npm:^4.11.9" - elliptic: "npm:6.5.4" - hash.js: "npm:1.1.3" - js-sha3: "npm:0.5.7" - scrypt-js: "npm:2.0.4" - setimmediate: "npm:1.0.4" - uuid: "npm:2.0.1" - xmlhttprequest: "npm:1.8.0" - checksum: a4cec0254f940a0fb118317d23676faa46eb5540fc0a3b9177b8aef71318f509ed19b8264f102b1a2a32d0256274ecc526fd926bd22a4a4ac25cd8e0e6560f12 - languageName: node - linkType: hard - -"ethers@npm:^5.1.0, ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2": +"ethers@npm:5.7.2, ethers@npm:^5.1.0, ethers@npm:^5.3.1, ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2": version: 5.7.2 resolution: "ethers@npm:5.7.2" dependencies: @@ -9570,6 +12373,23 @@ __metadata: languageName: node linkType: hard +"ethers@npm:^4.0.40": + version: 4.0.49 + resolution: "ethers@npm:4.0.49" + dependencies: + aes-js: "npm:3.0.0" + bn.js: "npm:^4.11.9" + elliptic: "npm:6.5.4" + hash.js: "npm:1.1.3" + js-sha3: "npm:0.5.7" + scrypt-js: "npm:2.0.4" + setimmediate: "npm:1.0.4" + uuid: "npm:2.0.1" + xmlhttprequest: "npm:1.8.0" + checksum: a4cec0254f940a0fb118317d23676faa46eb5540fc0a3b9177b8aef71318f509ed19b8264f102b1a2a32d0256274ecc526fd926bd22a4a4ac25cd8e0e6560f12 + languageName: node + linkType: hard + "ethjs-unit@npm:0.1.6": version: 0.1.6 resolution: "ethjs-unit@npm:0.1.6" @@ -9604,6 +12424,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 + languageName: node + linkType: hard + "events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -9622,7 +12449,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.1.1": +"execa@npm:^5.0.0, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -9639,6 +12466,30 @@ __metadata: languageName: node linkType: hard +"execa@npm:^8.0.1": + version: 8.0.1 + resolution: "execa@npm:8.0.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^8.0.1" + human-signals: "npm:^5.0.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^3.0.0" + checksum: d2ab5fe1e2bb92b9788864d0713f1fce9a07c4594e272c0c97bc18c90569897ab262e4ea58d27a694d288227a2e24f16f5e2575b44224ad9983b799dc7f1098d + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 387555050c5b3c10e7a9e8df5f43194e95d7737c74532c409910e585d5554eaff34960c166643f5e23d042196529daad059c292dcf1fb61b8ca878d3677f4b87 + languageName: node + linkType: hard + "expand-template@npm:^2.0.3": version: 2.0.3 resolution: "expand-template@npm:2.0.3" @@ -9646,6 +12497,19 @@ __metadata: languageName: node linkType: hard +"expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 63f97bc51f56a491950fb525f9ad94f1916e8a014947f8d8445d3847a665b5471b768522d659f5e865db20b6c2033d2ac10f35fcbd881a4d26407a4f6f18451a + languageName: node + linkType: hard + "express@npm:^4.14.0": version: 4.18.1 resolution: "express@npm:4.18.1" @@ -9685,6 +12549,45 @@ __metadata: languageName: node linkType: hard +"express@npm:^4.17.1": + version: 4.18.2 + resolution: "express@npm:4.18.2" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.1" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.5.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.2.0" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.11.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.18.0" + serve-static: "npm:1.15.0" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 869ae89ed6ff4bed7b373079dc58e5dddcf2915a2669b36037ff78c99d675ae930e5fe052b35c24f56557d28a023bb1cbe3e2f2fb87eaab96a1cedd7e597809d + languageName: node + linkType: hard + "ext@npm:^1.1.2": version: 1.6.0 resolution: "ext@npm:1.6.0" @@ -9774,7 +12677,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0": +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: 2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e @@ -9788,6 +12691,20 @@ __metadata: languageName: node linkType: hard +"fast-redact@npm:^3.0.0": + version: 3.3.0 + resolution: "fast-redact@npm:3.3.0" + checksum: a69c5cb52396eafc4f466f46864406cbd4a6ead6782caf74750ce817794829048baaa933ad98543e744dd54ffb4cddff71f3e75e465a86e3d887894e281ec154 + languageName: node + linkType: hard + +"fast-safe-stringify@npm:^2.0.6": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: dc1f063c2c6ac9533aee14d406441f86783a8984b2ca09b19c2fe281f9ff59d315298bc7bc22fd1f83d26fe19ef2f20e2ddb68e96b15040292e555c5ced0c1e4 + languageName: node + linkType: hard + "fast-stable-stringify@npm:^1.0.0": version: 1.0.0 resolution: "fast-stable-stringify@npm:1.0.0" @@ -9813,6 +12730,15 @@ __metadata: languageName: node linkType: hard +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: 4f95d336fb805786759e383fd7fff342ceb7680f53efcc0ef82f502eb479ce35b98e8b207b6dfdfeea0eba845862107dc73813775fc6b56b3098c6e90a2dad77 + languageName: node + linkType: hard + "figures@npm:^3.2.0": version: 3.2.0 resolution: "figures@npm:3.2.0" @@ -9847,6 +12773,13 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: 9d681939eec2b4b129cb4f307b7e93d954a0657421d4e5357d86093b26d3f4f570909ed43717dcfd62428b3cf8cddd9841b35f9d40d12ac62cfabaa677942593 + languageName: node + linkType: hard + "finalhandler@npm:1.2.0": version: 1.2.0 resolution: "finalhandler@npm:1.2.0" @@ -10028,6 +12961,24 @@ __metadata: languageName: node linkType: hard +"formik@npm:^2.2.9": + version: 2.4.5 + resolution: "formik@npm:2.4.5" + dependencies: + "@types/hoist-non-react-statics": "npm:^3.3.1" + deepmerge: "npm:^2.1.1" + hoist-non-react-statics: "npm:^3.3.0" + lodash: "npm:^4.17.21" + lodash-es: "npm:^4.17.21" + react-fast-compare: "npm:^2.0.1" + tiny-warning: "npm:^1.0.2" + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + checksum: 223fb3e6b0a7803221c030364a015b9adb01b61f7aed7c64e28ef8341a3e7c94c7a70aef7ed9f65d03ac44e4e19972c1247fb0e39538e4e084833fd1fa3b11c4 + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -10153,6 +13104,16 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:^2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@npm:~2.1.1": version: 2.1.3 resolution: "fsevents@npm:2.1.3" @@ -10173,6 +13134,15 @@ __metadata: languageName: node linkType: hard +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@patch:fsevents@npm%3A~2.1.1#optional!builtin": version: 2.1.3 resolution: "fsevents@patch:fsevents@npm%3A2.1.3#optional!builtin::version=2.1.3&hash=31d12a" @@ -10301,6 +13271,13 @@ __metadata: languageName: node linkType: hard +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 17d8333460204fbf1f9160d067e1e77f908a5447febb49424b8ab043026049835c9ef3974445c57dbd39161f4d2b04356d7de12b2eecaa27a7a7ea7d871cbedd + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -10345,6 +13322,27 @@ __metadata: languageName: node linkType: hard +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: ad5104871d114a694ecc506a2d406e2331beccb961fe1e110dc25556b38bcdbf399a823a8a375976cd8889668156a9561e12ebe3fa6a4c6ba169c8466c2ff868 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 + languageName: node + linkType: hard + +"get-port-please@npm:^3.1.2": + version: 3.1.2 + resolution: "get-port-please@npm:3.1.2" + checksum: ec8b8da9f816edde114b76742ec29695730094904bb0e94309081e4adf3f797b483b9d648abcf5e0511c4e21a7bf68334672b9575f8b23bccf93bf97eb517f0e + languageName: node + linkType: hard + "get-port@npm:^3.1.0": version: 3.2.0 resolution: "get-port@npm:3.2.0" @@ -10375,6 +13373,13 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^8.0.1": + version: 8.0.1 + resolution: "get-stream@npm:8.0.1" + checksum: dde5511e2e65a48e9af80fea64aff11b4921b14b6e874c6f8294c50975095af08f41bfb0b680c887f28b566dd6ec2cb2f960f9d36a323359be324ce98b766e9e + languageName: node + linkType: hard + "get-symbol-description@npm:^1.0.0": version: 1.0.0 resolution: "get-symbol-description@npm:1.0.0" @@ -10431,6 +13436,13 @@ __metadata: languageName: node linkType: hard +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 9009529195a955c40d7b9690794aeff5ba665cc38f1519e111c58bb54366fd0c106bde80acf97ba4e533208eb53422c83b136611a54c5fefb1edd8dc267cb62e + languageName: node + linkType: hard + "glob@npm:7.1.3": version: 7.1.3 resolution: "glob@npm:7.1.3" @@ -10708,7 +13720,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.5": +"graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -10729,6 +13741,13 @@ __metadata: languageName: node linkType: hard +"graphql@npm:^16.6.0": + version: 16.8.1 + resolution: "graphql@npm:16.8.1" + checksum: 7a09d3ec5f75061afe2bd2421a2d53cf37273d2ecaad8f34febea1f1ac205dfec2834aec3419fa0a10fcc9fb345863b2f893562fb07ea825da2ae82f6392893c + languageName: node + linkType: hard + "growl@npm:1.10.5": version: 1.10.5 resolution: "growl@npm:1.10.5" @@ -10736,6 +13755,23 @@ __metadata: languageName: node linkType: hard +"h3@npm:^1.10.1, h3@npm:^1.8.2": + version: 1.10.2 + resolution: "h3@npm:1.10.2" + dependencies: + cookie-es: "npm:^1.0.0" + defu: "npm:^6.1.4" + destr: "npm:^2.0.2" + iron-webcrypto: "npm:^1.0.0" + ohash: "npm:^1.1.3" + radix3: "npm:^1.1.0" + ufo: "npm:^1.3.2" + uncrypto: "npm:^0.1.3" + unenv: "npm:^1.9.0" + checksum: 7dbf129fe2d7eb9d4f306a3fb79e381842500476de49a124cfbc5cf94aff95cffa8b6e5e88b523b252abe3f20688de05fff837e8a4197eb3acec27b664427be2 + languageName: node + linkType: hard + "handlebars@npm:^4.0.1": version: 4.7.7 resolution: "handlebars@npm:4.7.7" @@ -11005,6 +14041,13 @@ __metadata: languageName: node linkType: hard +"hey-listen@npm:^1.0.8": + version: 1.0.8 + resolution: "hey-listen@npm:1.0.8" + checksum: 744b5f4c18c7cfb82b22bd22e1d300a9ac4eafe05a22e58fb87e48addfca8be00604d9aa006434ea02f9530990eb4b393ddb28659e2ab7f833ce873e32eb809c + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -11016,6 +14059,15 @@ __metadata: languageName: node linkType: hard +"hoist-non-react-statics@npm:^3.3.0": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: "npm:^16.7.0" + checksum: 1acbe85f33e5a39f90c822ad4d28b24daeb60f71c545279431dc98c312cd28a54f8d64788e477fe21dc502b0e3cf58589ebe5c1ad22af27245370391c2d24ea6 + languageName: node + linkType: hard + "hosted-git-info@npm:^2.1.4, hosted-git-info@npm:^2.6.0": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" @@ -11023,6 +14075,13 @@ __metadata: languageName: node linkType: hard +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 034d74029dcca544a34fb6135e98d427acd73019796ffc17383eaa3ec2fe1c0471dcbbc8f8ed39e46e86d43ccd753a160631615e4048285e313569609b66d5b7 + languageName: node + linkType: hard + "http-basic@npm:^8.1.1": version: 8.1.3 resolution: "http-basic@npm:8.1.3" @@ -11089,6 +14148,13 @@ __metadata: languageName: node linkType: hard +"http-shutdown@npm:^1.2.2": + version: 1.2.2 + resolution: "http-shutdown@npm:1.2.2" + checksum: 1c99b575b1a7ebd749950e7f59410348723638808336063321d89588b7f7b548d61c8e3566af0f1f4f961d941c758677d062d2289bc63356ead143da4d8f3daf + languageName: node + linkType: hard + "http-signature@npm:~1.2.0": version: 1.2.0 resolution: "http-signature@npm:1.2.0" @@ -11134,6 +14200,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^5.0.0": + version: 5.0.0 + resolution: "human-signals@npm:5.0.0" + checksum: 30f8870d831cdcd2d6ec0486a7d35d49384996742052cee792854273fa9dd9e7d5db06bb7985d4953e337e10714e994e0302e90dc6848069171b05ec836d65b0 + languageName: node + linkType: hard + "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -11152,6 +14225,35 @@ __metadata: languageName: node linkType: hard +"hyperlane-explorer@https://github.com/hyperlane-xyz/hyperlane-explorer.git": + version: 3.7.0 + resolution: "hyperlane-explorer@https://github.com/hyperlane-xyz/hyperlane-explorer.git#commit=72243333c4883b0dd3480af66a939f224ed64cd7" + dependencies: + "@headlessui/react": "npm:^1.7.17" + "@hyperlane-xyz/sdk": "npm:3.7.0" + "@hyperlane-xyz/utils": "npm:3.7.0" + "@hyperlane-xyz/widgets": "npm:3.7.0" + "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6" + "@rainbow-me/rainbowkit": "npm:0.12.16" + "@tanstack/react-query": "npm:^4.24.10" + bignumber.js: "npm:^9.1.2" + buffer: "npm:^6.0.3" + ethers: "npm:^5.7.2" + formik: "npm:^2.2.9" + graphql: "npm:^16.6.0" + next: "npm:^13.4.19" + nextjs-cors: "npm:^2.1.2" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + react-toastify: "npm:^9.1.1" + urql: "npm:^3.0.3" + wagmi: "npm:0.12.18" + zod: "npm:^3.21.2" + zustand: "npm:4.3.8" + checksum: 8caec09863f13297b7af12fde0c7df373eb0665e6302914ffdd9df939e6fd24a5aff563ada554014ff58e967f8710df4fa08d81414a93ee5266d569d9cb7b89e + languageName: node + linkType: hard + "iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -11170,6 +14272,13 @@ __metadata: languageName: node linkType: hard +"idb-keyval@npm:^6.2.1": + version: 6.2.1 + resolution: "idb-keyval@npm:6.2.1" + checksum: 9a1416ff5e2ceff3832f5645518f438833a5ff6ee316fe3ec111d580db120425991d64d8098a847be7541bbbb7cc941984b4d0d62d541c39f7a0f415594837c2 + languageName: node + linkType: hard + "idna-uts46-hx@npm:^2.3.1": version: 2.3.1 resolution: "idna-uts46-hx@npm:2.3.1" @@ -11186,6 +14295,13 @@ __metadata: languageName: node linkType: hard +"ignore-by-default@npm:^1.0.1": + version: 1.0.1 + resolution: "ignore-by-default@npm:1.0.1" + checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a + languageName: node + linkType: hard + "ignore@npm:^5.1.1, ignore@npm:^5.2.0": version: 5.2.0 resolution: "ignore@npm:5.2.0" @@ -11231,6 +14347,18 @@ __metadata: languageName: node linkType: hard +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -11305,7 +14433,7 @@ __metadata: languageName: node linkType: hard -"invariant@npm:2": +"invariant@npm:2, invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" dependencies: @@ -11323,6 +14451,23 @@ __metadata: languageName: node linkType: hard +"ioredis@npm:^5.3.2": + version: 5.3.2 + resolution: "ioredis@npm:5.3.2" + dependencies: + "@ioredis/commands": "npm:^1.1.1" + cluster-key-slot: "npm:^1.1.0" + debug: "npm:^4.3.4" + denque: "npm:^2.1.0" + lodash.defaults: "npm:^4.2.0" + lodash.isarguments: "npm:^3.1.0" + redis-errors: "npm:^1.2.0" + redis-parser: "npm:^3.0.0" + standard-as-callback: "npm:^2.1.0" + checksum: 0140f055ef81d28e16ca8400b99dabb9ce82009f54afd83cba952c7d0c5d736841e43247765b8ee1af1f02843531c5b8df240af18bd3d7e2ca3d60b36e76213f + languageName: node + linkType: hard + "ip@npm:^1.1.5": version: 1.1.8 resolution: "ip@npm:1.1.8" @@ -11337,6 +14482,13 @@ __metadata: languageName: node linkType: hard +"iron-webcrypto@npm:^1.0.0": + version: 1.0.0 + resolution: "iron-webcrypto@npm:1.0.0" + checksum: 1af9fc319c21d44023e08b7019b4c5d0b58f32c6fccab6e4885522b3efa2f6c17491f9caccba74d816f04b4af3148f5bd91a9b506b6d84c2db6ac0a678fbd88a + languageName: node + linkType: hard + "is-arguments@npm:^1.0.4": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" @@ -11452,6 +14604,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -11496,6 +14657,13 @@ __metadata: languageName: node linkType: hard +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 + languageName: node + linkType: hard + "is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" @@ -11521,6 +14689,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -11619,6 +14798,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 + languageName: node + linkType: hard + "is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" @@ -11668,7 +14854,7 @@ __metadata: languageName: node linkType: hard -"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": +"is-typedarray@npm:1.0.0, is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" checksum: 4b433bfb0f9026f079f4eb3fbaa4ed2de17c9995c3a0b5c800bec40799b4b2a8b4e051b1ada77749deb9ded4ae52fe2096973f3a93ff83df1a5a7184a669478c @@ -11705,6 +14891,24 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: "npm:^1.0.0" + checksum: f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + languageName: node + linkType: hard + +"is64bit@npm:^2.0.0": + version: 2.0.0 + resolution: "is64bit@npm:2.0.0" + dependencies: + system-architecture: "npm:^0.1.0" + checksum: 94dafd5f29bfb96c542e89ef8c33e811159ca7d07a2890ab83026fa87706612af4101308d9392e9ee68e046e8604a6b59a8f41091f8556f6235efbcfd9c5574c + languageName: node + linkType: hard + "isarray@npm:0.0.1": version: 0.0.1 resolution: "isarray@npm:0.0.1" @@ -11733,67 +14937,580 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:^4.0.1": - version: 4.0.1 - resolution: "isomorphic-ws@npm:4.0.1" - peerDependencies: - ws: "*" - checksum: d7190eadefdc28bdb93d67b5f0c603385aaf87724fa2974abb382ac1ec9756ed2cfb27065cbe76122879c2d452e2982bc4314317f3d6c737ddda6c047328771a +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: d7190eadefdc28bdb93d67b5f0c603385aaf87724fa2974abb382ac1ec9756ed2cfb27065cbe76122879c2d452e2982bc4314317f3d6c737ddda6c047328771a + languageName: node + linkType: hard + +"isows@npm:1.0.3": + version: 1.0.3 + resolution: "isows@npm:1.0.3" + peerDependencies: + ws: "*" + checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 + languageName: node + linkType: hard + +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: 22d9c181015226d4534a227539256897bbbcb7edd1066ca4fc4d3a06dbd976325dfdd16b3983c7d236a89f256805c1a685a772e0364e98873d3819b064ad35a1 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: bbc4496c2f304d799f8ec22202ab38c010ac265c441947f075c0f7d46bd440b45c00e46017cf9053453d42182d768b1d6ed0e70a142c95ab00df9843aa5ab80e + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.1 + resolution: "istanbul-lib-instrument@npm:6.0.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 95fd8c66e586840989cb3c7819c6da66c4742a6fedbf16b51a5c7f1898941ad07b79ddff020f479d3a1d76743ecdbf255d93c35221875687477d4b118026e7e7 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 86a83421ca1cf2109a9f6d193c06c31ef04a45e72a74579b11060b1e7bb9b6337a4e6f04abfb8857e2d569c271273c65e855ee429376a0d7c91ad91db42accd1 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 5526983462799aced011d776af166e350191b816821ea7bcf71cab3e5272657b062c47dc30697a22a43656e3ced78893a42de677f9ccf276a28c913190953b82 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.6 + resolution: "istanbul-reports@npm:3.1.6" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 135c178e509b21af5c446a6951fc01c331331bb0fdb1ed1dd7f68a8c875603c2e2ee5c82801db5feb868e5cc35e9babe2d972d322afc50f6de6cce6431b9b2ff + languageName: node + linkType: hard + +"isurl@npm:^1.0.0-alpha5": + version: 1.0.0 + resolution: "isurl@npm:1.0.0" + dependencies: + has-to-string-tag-x: "npm:^1.2.0" + is-object: "npm:^1.0.1" + checksum: 28a96e019269d57015fa5869f19dda5a3ed1f7b21e3e0c4ff695419bd0541547db352aa32ee4a3659e811a177b0e37a5bc1a036731e71939dd16b59808ab92bd + languageName: node + linkType: hard + +"javascript-natural-sort@npm:0.7.1": + version: 0.7.1 + resolution: "javascript-natural-sort@npm:0.7.1" + checksum: 7bf6eab67871865d347f09a95aa770f9206c1ab0226bcda6fdd9edec340bf41111a7f82abac30556aa16a21cfa3b2b1ca4a362c8b73dd5ce15220e5d31f49d79 + languageName: node + linkType: hard + +"jayson@npm:^4.1.0": + version: 4.1.0 + resolution: "jayson@npm:4.1.0" + dependencies: + "@types/connect": "npm:^3.4.33" + "@types/node": "npm:^12.12.54" + "@types/ws": "npm:^7.4.4" + JSONStream: "npm:^1.3.5" + commander: "npm:^2.20.3" + delay: "npm:^5.0.0" + es6-promisify: "npm:^5.0.0" + eyes: "npm:^0.1.8" + isomorphic-ws: "npm:^4.0.1" + json-stringify-safe: "npm:^5.0.1" + uuid: "npm:^8.3.2" + ws: "npm:^7.4.5" + bin: + jayson: bin/jayson.js + checksum: d76b3f220e14388007958b8f79e793009d6bc572b6e5ea65848a0f027b324d1950d836468986d7e38ddfb30b660e8b048b459c8bc8456e9b38dbbebc60a563b4 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" + dependencies: + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 3d93742e56b1a73a145d55b66e96711fbf87ef89b96c2fab7cfdfba8ec06612591a982111ca2b712bb853dbc16831ec8b43585a2a96b83862d6767de59cbf83d + languageName: node + linkType: hard + +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 716a8e3f40572fd0213bcfc1da90274bf30d856e5133af58089a6ce45089b63f4d679bd44e6be9d320e8390483ebc3ae9921981993986d21639d9019b523123d + languageName: node + linkType: hard + +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 6cc62b34d002c034203065a31e5e9a19e7c76d9e8ef447a6f70f759c0714cb212c6245f75e270ba458620f9c7b26063cd8cf6cd1f7e3afd659a7cc08add17307 + languageName: node + linkType: hard + +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 6bdf570e9592e7d7dd5124fc0e21f5fe92bd15033513632431b211797e3ab57eaa312f83cc6481b3094b72324e369e876f163579d60016677c117ec4853cf02b + languageName: node + linkType: hard + +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 6f3a7eb9cd9de5ea9e5aa94aed535631fa6f80221832952839b3cb59dd419b91c20b73887deb0b62230d06d02d6b6cf34ebb810b88d904bb4fe1e2e4f0905c98 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 8d48818055bc96c9e4ec2e217a5a375623c0d0bfae8d22c26e011074940c202aa2534a3362294c81d981046885c05d304376afba9f2874143025981148f3e96d + languageName: node + linkType: hard + +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: bd1a077654bdaa013b590deb5f7e7ade68f2e3289180a8c8f53bc8a49f3b40740c0ec2d3a3c1aee906f682775be2bebbac37491d80b634d15276b0aa0f2e3fda + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 9cf7045adf2307cc93aed2f8488942e39388bff47ec1df149a997c6f714bfc66b2056768973770d3f8b1bf47396c19aa564877eb10ec978b952c6018ed1bd637 + languageName: node + linkType: hard + +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 8531b42003581cb18a69a2774e68c456fb5a5c3280b1b9b77475af9e346b6a457250f9d756bfeeae2fe6cbc9ef28434c205edab9390ee970a919baddfa08bb85 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 981904a494299cf1e3baed352f8a3bd8b50a8c13a662c509b6a53c31461f94ea3bfeffa9d5efcfeb248e384e318c87de7e3baa6af0f79674e987482aa189af40 + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 31d53c6ed22095d86bab9d14c0fa70c4a92c749ea6ceece82cf30c22c9c0e26407acdfbdb0231435dc85a98d6d65ca0d9cbcd25cd1abb377fe945e843fb770b9 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: ae51d1b4f898724be5e0e52b2268a68fcd876d9b20633c864a6dd6b1994cbc48d62402b0f40f3a1b669b30ebd648821f086c26c08ffde192ced951ff4670d51c + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" + dependencies: + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 1e206f94a660d81e977bcfb1baae6450cb4a81c92e06fad376cc5ea16b8e8c6ea78c383f39e95591a9eb7f925b6a1021086c38941aa7c1b8a6a813c2f6e93675 + languageName: node + linkType: hard + +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: faa466fd9bc69ea6c37a545a7c6e808e073c66f46ab7d3d8a6ef084f8708f201b85d5fe1799789578b8b47fa1de47b9ee47b414d1863bc117a49e032ba77b7c7 + languageName: node + linkType: hard + +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 9d8748a494bd90f5c82acea99be9e99f21358263ce6feae44d3f1b0cd90991b5df5d18d607e73c07be95861ee86d1cbab2a3fc6ca4b21805f07ac29d47c1da1e + languageName: node + linkType: hard + +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 59eb58eb7e150e0834a2d0c0d94f2a0b963ae7182cfa6c63f2b49b9c6ef794e5193ef1634e01db41420c36a94cefc512cdd67a055cd3e6fa2f41eaf0f82f5a20 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: cb19a3948256de5f922d52f251821f99657339969bf86843bd26cf3332eae94883e8260e3d2fba46129a27c3971c1aa522490e460e16c7fad516e82d10bbf9f8 + languageName: node + linkType: hard + +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 30d58af6967e7d42bd903ccc098f3b4d3859ed46238fbc88d4add6a3f10bea00c226b93660285f058bc7a65f6f9529cf4eb80f8d4707f79f9e3a23686b4ab8f3 languageName: node linkType: hard -"isows@npm:1.0.3": - version: 1.0.3 - resolution: "isows@npm:1.0.3" - peerDependencies: - ws: "*" - checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + checksum: 8ee1163666d8eaa16d90a989edba2b4a3c8ab0ffaa95ad91b08ca42b015bfb70e164b247a5b17f9de32d096987cada63ed8491ab82761bfb9a28bc34b27ae161 languageName: node linkType: hard -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 22d9c181015226d4534a227539256897bbbcb7edd1066ca4fc4d3a06dbd976325dfdd16b3983c7d236a89f256805c1a685a772e0364e98873d3819b064ad35a1 +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 4f616e0345676631a7034b1d94971aaa719f0cd4a6041be2aa299be437ea047afd4fe05c48873b7963f5687a2f6c7cbf51244be8b14e313b97bfe32b1e127e55 languageName: node linkType: hard -"isurl@npm:^1.0.0-alpha5": - version: 1.0.0 - resolution: "isurl@npm:1.0.0" +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" dependencies: - has-to-string-tag-x: "npm:^1.2.0" - is-object: "npm:^1.0.1" - checksum: 28a96e019269d57015fa5869f19dda5a3ed1f7b21e3e0c4ff695419bd0541547db352aa32ee4a3659e811a177b0e37a5bc1a036731e71939dd16b59808ab92bd + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 364cbaef00d8a2729fc760227ad34b5e60829e0869bd84976bdfbd8c0d0f9c2f22677b3e6dd8afa76ed174765351cd12bae3d4530c62eefb3791055127ca9745 languageName: node linkType: hard -"javascript-natural-sort@npm:0.7.1": - version: 0.7.1 - resolution: "javascript-natural-sort@npm:0.7.1" - checksum: 7bf6eab67871865d347f09a95aa770f9206c1ab0226bcda6fdd9edec340bf41111a7f82abac30556aa16a21cfa3b2b1ca4a362c8b73dd5ce15220e5d31f49d79 +"jest@npm:^29.7.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 97023d78446098c586faaa467fbf2c6b07ff06e2c85a19e3926adb5b0effe9ac60c4913ae03e2719f9c01ae8ffd8d92f6b262cedb9555ceeb5d19263d8c6362a languageName: node linkType: hard -"jayson@npm:^4.1.0": - version: 4.1.0 - resolution: "jayson@npm:4.1.0" - dependencies: - "@types/connect": "npm:^3.4.33" - "@types/node": "npm:^12.12.54" - "@types/ws": "npm:^7.4.4" - JSONStream: "npm:^1.3.5" - commander: "npm:^2.20.3" - delay: "npm:^5.0.0" - es6-promisify: "npm:^5.0.0" - eyes: "npm:^0.1.8" - isomorphic-ws: "npm:^4.0.1" - json-stringify-safe: "npm:^5.0.1" - uuid: "npm:^8.3.2" - ws: "npm:^7.4.5" +"jiti@npm:^1.21.0": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" bin: - jayson: bin/jayson.js - checksum: d76b3f220e14388007958b8f79e793009d6bc572b6e5ea65848a0f027b324d1950d836468986d7e38ddfb30b660e8b048b459c8bc8456e9b38dbbebc60a563b4 + jiti: bin/jiti.js + checksum: 005a0239e50381b5c9919f59dbab86128367bd64872f3376dbbde54b6523f41bd134bf22909e2a509e38fd87e1c22125ca255b9b6b53e7df0fedd23f737334cc languageName: node linkType: hard @@ -11899,6 +15616,23 @@ __metadata: languageName: node linkType: hard +"json-rpc-engine@npm:^6.1.0": + version: 6.1.0 + resolution: "json-rpc-engine@npm:6.1.0" + dependencies: + "@metamask/safe-event-emitter": "npm:^2.0.0" + eth-rpc-errors: "npm:^4.0.2" + checksum: 00d5b5228e90f126dd52176598db6e5611d295d3a3f7be21254c30c1b6555811260ef2ec2df035cd8e583e4b12096259da721e29f4ea2affb615f7dfc960a6a6 + languageName: node + linkType: hard + +"json-rpc-random-id@npm:^1.0.0, json-rpc-random-id@npm:^1.0.1": + version: 1.0.1 + resolution: "json-rpc-random-id@npm:1.0.1" + checksum: fcd2e884193a129ace4002bd65a86e9cdb206733b4693baea77bd8b372cf8de3043fbea27716a2c9a716581a908ca8d978d9dfec4847eb2cf77edb4cf4b2252c + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -11946,6 +15680,22 @@ __metadata: languageName: node linkType: hard +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 1db67b853ff0de3534085d630691d3247de53a2ed1390ba0ddff681ea43e9b3e30ecbdb65c5e9aab49435e44059c23dbd6fee8ee619419ba37465bb0dd7135da + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.2.0": + version: 3.2.1 + resolution: "jsonc-parser@npm:3.2.1" + checksum: fe2df6f39e21653781d52cae20c5b9e0ab62461918d97f9430b216cea9b6500efc1d8b42c6584cc0a7548b4c996055e9cdc39f09b9782fa6957af2f45306c530 + languageName: node + linkType: hard + "jsonfile@npm:^2.1.0": version: 2.4.0 resolution: "jsonfile@npm:2.4.0" @@ -12046,6 +15796,18 @@ __metadata: languageName: node linkType: hard +"keccak@npm:^3.0.3": + version: 3.0.4 + resolution: "keccak@npm:3.0.4" + dependencies: + node-addon-api: "npm:^2.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.0" + readable-stream: "npm:^3.6.0" + checksum: 45478bb0a57e44d0108646499b8360914b0fbc8b0e088f1076659cb34faaa9eb829c40f6dd9dadb3460bb86cc33153c41fed37fe5ce09465a60e71e78c23fa55 + languageName: node + linkType: hard + "keyv@npm:^4.0.0": version: 4.5.2 resolution: "keyv@npm:4.5.2" @@ -12064,6 +15826,13 @@ __metadata: languageName: node linkType: hard +"keyvaluestorage-interface@npm:^1.0.0": + version: 1.0.0 + resolution: "keyvaluestorage-interface@npm:1.0.0" + checksum: e652448bc915f9c21b9916678ed58f5314c831f0a284d190a340c0370296c71918e0cdc1156a17b12d1993941b302f0881e23fb9c395079e2065a7d2f33d0199 + languageName: node + linkType: hard + "kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -12259,6 +16028,13 @@ __metadata: languageName: node linkType: hard +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 + languageName: node + linkType: hard + "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -12333,6 +16109,35 @@ __metadata: languageName: node linkType: hard +"listhen@npm:^1.5.5": + version: 1.6.0 + resolution: "listhen@npm:1.6.0" + dependencies: + "@parcel/watcher": "npm:^2.4.0" + "@parcel/watcher-wasm": "npm:2.4.0" + citty: "npm:^0.1.5" + clipboardy: "npm:^4.0.0" + consola: "npm:^3.2.3" + crossws: "npm:^0.1.0" + defu: "npm:^6.1.4" + get-port-please: "npm:^3.1.2" + h3: "npm:^1.10.1" + http-shutdown: "npm:^1.2.2" + jiti: "npm:^1.21.0" + mlly: "npm:^1.5.0" + node-forge: "npm:^1.3.1" + pathe: "npm:^1.1.2" + std-env: "npm:^3.7.0" + ufo: "npm:^1.3.2" + untun: "npm:^0.1.3" + uqr: "npm:^0.1.2" + bin: + listen: bin/listhen.mjs + listhen: bin/listhen.mjs + checksum: 85fc2a6733e18e5d8071debd4a60b17c365210f46abd93f06d4f405be3f00a3e7bd3d1d7439340b3d6b90bc8aa49891fa1baa733418fdd4aff303c67d619f24a + languageName: node + linkType: hard + "listr2@npm:^4.0.5": version: 4.0.5 resolution: "listr2@npm:4.0.5" @@ -12354,6 +16159,37 @@ __metadata: languageName: node linkType: hard +"lit-element@npm:^3.3.0": + version: 3.3.3 + resolution: "lit-element@npm:3.3.3" + dependencies: + "@lit-labs/ssr-dom-shim": "npm:^1.1.0" + "@lit/reactive-element": "npm:^1.3.0" + lit-html: "npm:^2.8.0" + checksum: 7968e7f3ce3994911f27c4c54acc956488c91d8af81677cce3d6f0c2eaea45cceb79b064077159392238d6e43d46015a950269db9914fea8913566aacb17eaa1 + languageName: node + linkType: hard + +"lit-html@npm:^2.8.0": + version: 2.8.0 + resolution: "lit-html@npm:2.8.0" + dependencies: + "@types/trusted-types": "npm:^2.0.2" + checksum: 3503e55e2927c2ff94773cf041fc4128f92291869c9192f36eacb7f95132d11f6b329e5b910ab60a4456349cd2e6d23b33d83291b24d557bcd6b904d6314ac1a + languageName: node + linkType: hard + +"lit@npm:2.8.0": + version: 2.8.0 + resolution: "lit@npm:2.8.0" + dependencies: + "@lit/reactive-element": "npm:^1.6.0" + lit-element: "npm:^3.3.0" + lit-html: "npm:^2.8.0" + checksum: aa64c1136b855ba328d41157dba67657d480345aeec3c1dd829abeb67719d759c9ff2ade9903f9cfb4f9d012b16087034aaa5b33f1182e70c615765562e3251b + languageName: node + linkType: hard + "load-yaml-file@npm:^0.2.0": version: 0.2.0 resolution: "load-yaml-file@npm:0.2.0" @@ -12404,6 +16240,13 @@ __metadata: languageName: node linkType: hard +"lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: 03f39878ea1e42b3199bd3f478150ab723f93cc8730ad86fec1f2804f4a07c6e30deaac73cad53a88e9c3db33348bb8ceeb274552390e7a75d7849021c02df43 + languageName: node + linkType: hard + "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -12411,6 +16254,13 @@ __metadata: languageName: node linkType: hard +"lodash.defaults@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.defaults@npm:4.2.0" + checksum: 6a2a9ea5ad7585aff8d76836c9e1db4528e5f5fa50fc4ad81183152ba8717d83aef8aec4fa88bf3417ed946fd4b4358f145ee08fbc77fb82736788714d3e12db + languageName: node + linkType: hard + "lodash.get@npm:^4.4.2": version: 4.4.2 resolution: "lodash.get@npm:4.4.2" @@ -12418,6 +16268,27 @@ __metadata: languageName: node linkType: hard +"lodash.isarguments@npm:^3.1.0": + version: 3.1.0 + resolution: "lodash.isarguments@npm:3.1.0" + checksum: e5186d5fe0384dcb0652501d9d04ebb984863ebc9c9faa2d4b9d5dfd81baef9ffe8e2887b9dc471d62ed092bc0788e5f1d42e45c72457a2884bbb54ac132ed92 + languageName: node + linkType: hard + +"lodash.isequal@npm:4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: 82fc58a83a1555f8df34ca9a2cd300995ff94018ac12cc47c349655f0ae1d4d92ba346db4c19bbfc90510764e0c00ddcc985a358bdcd4b3b965abf8f2a48a214 + languageName: node + linkType: hard + +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 192b2168f310c86f303580b53acf81ab029761b9bd9caa9506a019ffea5f3363ea98d7e39e7e11e6b9917066c9d36a09a11f6fe16f812326390d8f3a54a1a6da + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -12484,7 +16355,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0": +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -12534,6 +16405,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.2": + version: 10.2.0 + resolution: "lru-cache@npm:10.2.0" + checksum: 502ec42c3309c0eae1ce41afca471f831c278566d45a5273a0c51102dee31e0e250a62fa9029c3370988df33a14188a38e682c16143b794de78668de3643e302 + languageName: node + linkType: hard + "lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -12583,7 +16461,16 @@ __metadata: languageName: node linkType: hard -"make-error@npm:^1.1.1": +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a + languageName: node + linkType: hard + +"make-error@npm:1.x, make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -12614,6 +16501,15 @@ __metadata: languageName: node linkType: hard +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: "npm:1.0.5" + checksum: 4c66ddfc654537333da952c084f507fa4c30c707b1635344eb35be894d797ba44c901a9cebe914aa29a7f61357543ba09b09dddbd7f65b4aee756b450f169f40 + languageName: node + linkType: hard + "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" @@ -12653,6 +16549,15 @@ __metadata: languageName: node linkType: hard +"media-query-parser@npm:^2.0.2": + version: 2.0.2 + resolution: "media-query-parser@npm:2.0.2" + dependencies: + "@babel/runtime": "npm:^7.12.5" + checksum: 9dff3ed135149944717a8687567f4fda1d39d28637f265c6ce7efe5ed55cd88ed49136c912ee0c7f3a6e5debc50b1ff969db609d862318f1af97f48752b08b0b + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -12759,6 +16664,13 @@ __metadata: languageName: node linkType: hard +"mersenne-twister@npm:^1.1.0": + version: 1.1.0 + resolution: "mersenne-twister@npm:1.1.0" + checksum: 1123526199091097102f2f91639ad7d5b3df4b098de9a4a72c835920e11ef0ce08e25737d5af1d363325a60da8804365eae8a41e03b7a46a1acc22e18fa8f261 + languageName: node + linkType: hard + "methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" @@ -12766,6 +16678,13 @@ __metadata: languageName: node linkType: hard +"micro-ftch@npm:^0.3.1": + version: 0.3.1 + resolution: "micro-ftch@npm:0.3.1" + checksum: a7ab07d25e28ec4ae492ce4542ea9b06eee85538742b3b1263b247366ee8872f2c5ce9c8651138b2f1d22c8212f691a7b8b5384fe86ead5aff1852e211f1c035 + languageName: node + linkType: hard + "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -12813,6 +16732,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:^3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: b2d31580deb58be89adaa1877cbbf152b7604b980fd7ef8f08b9e96bfedf7d605d9c23a8ba62aa12c8580b910cd7c1d27b7331d0f40f7a14e17d5a0bbec3b49f + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -12820,6 +16748,13 @@ __metadata: languageName: node linkType: hard +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + languageName: node + linkType: hard + "mimic-response@npm:^1.0.0": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -13075,6 +17010,18 @@ __metadata: languageName: node linkType: hard +"mlly@npm:^1.2.0, mlly@npm:^1.5.0": + version: 1.6.0 + resolution: "mlly@npm:1.6.0" + dependencies: + acorn: "npm:^8.11.3" + pathe: "npm:^1.1.2" + pkg-types: "npm:^1.0.3" + ufo: "npm:^1.3.2" + checksum: 49549b115cb18b5cdc8a0974016d4097f8be272ad7b7a78ab2962f4fdd307bfab85f89e6a797fb905a85bb0adebd1bcc72e7ba557d0117b95bb5837929aee385 + languageName: node + linkType: hard + "mnemonist@npm:^0.38.0": version: 0.38.5 resolution: "mnemonist@npm:0.38.5" @@ -13200,6 +17147,27 @@ __metadata: languageName: node linkType: hard +"motion@npm:10.16.2": + version: 10.16.2 + resolution: "motion@npm:10.16.2" + dependencies: + "@motionone/animation": "npm:^10.15.1" + "@motionone/dom": "npm:^10.16.2" + "@motionone/svelte": "npm:^10.16.2" + "@motionone/types": "npm:^10.15.1" + "@motionone/utils": "npm:^10.15.1" + "@motionone/vue": "npm:^10.16.2" + checksum: 2470f12b97371eb876337b355ad158c545622b2cc7c83b0ba540d2c02afedb49990e78898e520b8f74cccc9ecf11d366ae005a35c60e92178fadd7434860a966 + languageName: node + linkType: hard + +"mri@npm:^1.2.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: 6775a1d2228bb9d191ead4efc220bd6be64f943ad3afd4dcb3b3ac8fc7b87034443f666e38805df38e8d047b29f910c3cc7810da0109af83e42c82c73bd3f6bc + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -13267,6 +17235,13 @@ __metadata: languageName: node linkType: hard +"multiformats@npm:^9.4.2": + version: 9.9.0 + resolution: "multiformats@npm:9.9.0" + checksum: ad55c7d480d22f4258a68fd88aa2aab744fe0cb1e68d732fc886f67d858b37e3aa6c2cec12b2960ead7730d43be690931485238569952d8a3d7f90fdc726c652 + languageName: node + linkType: hard + "multihashes@npm:^0.4.15, multihashes@npm:~0.4.15": version: 0.4.21 resolution: "multihashes@npm:0.4.21" @@ -13310,6 +17285,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.6": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: ac1eb60f615b272bccb0e2b9cd933720dad30bf9708424f691b8113826bb91aca7e9d14ef5d9415a6ba15c266b37817256f58d8ce980c82b0ba3185352565679 + languageName: node + linkType: hard + "napi-build-utils@npm:^1.0.1": version: 1.0.2 resolution: "napi-build-utils@npm:1.0.2" @@ -13324,6 +17308,13 @@ __metadata: languageName: node linkType: hard +"napi-wasm@npm:^1.1.0": + version: 1.1.0 + resolution: "napi-wasm@npm:1.1.0" + checksum: 767781f07ccaca846a6036a2df7686c9decc1b4fd6ad30ba782c94829476ec5610acc41e4caf7df94ebf0bed4abd4d34539979d0d85b025127c8a41be6259375 + languageName: node + linkType: hard + "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -13359,6 +17350,72 @@ __metadata: languageName: node linkType: hard +"next@npm:^13.4.19": + version: 13.5.6 + resolution: "next@npm:13.5.6" + dependencies: + "@next/env": "npm:13.5.6" + "@next/swc-darwin-arm64": "npm:13.5.6" + "@next/swc-darwin-x64": "npm:13.5.6" + "@next/swc-linux-arm64-gnu": "npm:13.5.6" + "@next/swc-linux-arm64-musl": "npm:13.5.6" + "@next/swc-linux-x64-gnu": "npm:13.5.6" + "@next/swc-linux-x64-musl": "npm:13.5.6" + "@next/swc-win32-arm64-msvc": "npm:13.5.6" + "@next/swc-win32-ia32-msvc": "npm:13.5.6" + "@next/swc-win32-x64-msvc": "npm:13.5.6" + "@swc/helpers": "npm:0.5.2" + busboy: "npm:1.6.0" + caniuse-lite: "npm:^1.0.30001406" + postcss: "npm:8.4.31" + styled-jsx: "npm:5.1.1" + watchpack: "npm:2.4.0" + peerDependencies: + "@opentelemetry/api": ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + dependenciesMeta: + "@next/swc-darwin-arm64": + optional: true + "@next/swc-darwin-x64": + optional: true + "@next/swc-linux-arm64-gnu": + optional: true + "@next/swc-linux-arm64-musl": + optional: true + "@next/swc-linux-x64-gnu": + optional: true + "@next/swc-linux-x64-musl": + optional: true + "@next/swc-win32-arm64-msvc": + optional: true + "@next/swc-win32-ia32-msvc": + optional: true + "@next/swc-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@opentelemetry/api": + optional: true + sass: + optional: true + bin: + next: dist/bin/next + checksum: ec6defc7958b575d93306a2dcb05b7b14e27474e226ec350f412d03832407a5ae7139c21f7c7437b93cca2c8a79d7197c468308d82a903b2a86d579f84ccac9f + languageName: node + linkType: hard + +"nextjs-cors@npm:^2.1.2": + version: 2.2.0 + resolution: "nextjs-cors@npm:2.2.0" + dependencies: + cors: "npm:^2.8.5" + peerDependencies: + next: ^8.1.1-canary.54 || ^9.0.0 || ^10.0.0-0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 + checksum: 9e5f1cd5d737634600259028d5ad6ee58b7d621b656f6b064bf574acb347133fcf8503bb94c5cb3e9d05fb81dd88ba6b07511cca3eadf5cd7cbe4661a207c1b4 + languageName: node + linkType: hard + "nise@npm:^5.1.1": version: 5.1.1 resolution: "nise@npm:5.1.1" @@ -13408,6 +17465,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^7.0.0": + version: 7.1.0 + resolution: "node-addon-api@npm:7.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: e20487e98c76660f4957e81e85c45dfb667140d9be0bf872a3b3dfd86b4ea19c0275939116c90efebc0da7fc6af2c7b7b060512ceebe6417b1ed145a26910453 + languageName: node + linkType: hard + "node-emoji@npm:^1.10.0": version: 1.11.0 resolution: "node-emoji@npm:1.11.0" @@ -13427,6 +17493,13 @@ __metadata: languageName: node linkType: hard +"node-fetch-native@npm:^1.4.0, node-fetch-native@npm:^1.4.1, node-fetch-native@npm:^1.6.1": + version: 1.6.2 + resolution: "node-fetch-native@npm:1.6.2" + checksum: 85a3c8fb853d2abbd7e4235742ee0ff5d8ac15f982209989f7150407203dc65ad45e0c11a0f7416c3685e3cdd3d3f9ee2922e7558f201dd6a7e9c9dde3b612fd + languageName: node + linkType: hard + "node-fetch@npm:2.6.7, node-fetch@npm:^2.6.6, node-fetch@npm:^2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -13469,6 +17542,13 @@ __metadata: languageName: node linkType: hard +"node-forge@npm:^1.3.1": + version: 1.3.1 + resolution: "node-forge@npm:1.3.1" + checksum: 05bab6868633bf9ad4c3b1dd50ec501c22ffd69f556cdf169a00998ca1d03e8107a6032ba013852f202035372021b845603aeccd7dfcb58cdb7430013b3daa8d + languageName: node + linkType: hard + "node-gyp-build@npm:4.3.0": version: 4.3.0 resolution: "node-gyp-build@npm:4.3.0" @@ -13526,17 +17606,51 @@ __metadata: languageName: node linkType: hard -"node-hid@npm:2.1.1": - version: 2.1.1 - resolution: "node-hid@npm:2.1.1" +"node-hid@npm:2.1.1": + version: 2.1.1 + resolution: "node-hid@npm:2.1.1" + dependencies: + bindings: "npm:^1.5.0" + node-addon-api: "npm:^3.0.2" + node-gyp: "npm:latest" + prebuild-install: "npm:^6.0.0" + bin: + hid-showdevices: src/show-devices.js + checksum: 97a9b623eb185f34c63816b4540cd1b30793e4929cf342b794a19a9abcda1635ef6a07d341736a0025e3b7b0bb17a82a9430ee1d7499bef37fd5ead93ed5c743 + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: b7afc2b65e56f7035b1a2eec57ae0fbdee7d742b1cdcd0f4387562b6527a011ab1cbe9f64cc8b3cca61e3297c9637c8bf61cec2e6b8d3a711d4b5267dfafbe02 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.14": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 0f7607ec7db5ef1dc616899a5f24ae90c869b6a54c2d4f36ff6d84a282ab9343c7ff3ca3670fe4669171bb1e8a9b3e286e1ef1c131f09a83d70554f855d54f24 + languageName: node + linkType: hard + +"nodemon@npm:^3.0.3": + version: 3.0.3 + resolution: "nodemon@npm:3.0.3" dependencies: - bindings: "npm:^1.5.0" - node-addon-api: "npm:^3.0.2" - node-gyp: "npm:latest" - prebuild-install: "npm:^6.0.0" + chokidar: "npm:^3.5.2" + debug: "npm:^4" + ignore-by-default: "npm:^1.0.1" + minimatch: "npm:^3.1.2" + pstree.remy: "npm:^1.1.8" + semver: "npm:^7.5.3" + simple-update-notifier: "npm:^2.0.0" + supports-color: "npm:^5.5.0" + touch: "npm:^3.1.0" + undefsafe: "npm:^2.0.5" bin: - hid-showdevices: src/show-devices.js - checksum: 97a9b623eb185f34c63816b4540cd1b30793e4929cf342b794a19a9abcda1635ef6a07d341736a0025e3b7b0bb17a82a9430ee1d7499bef37fd5ead93ed5c743 + nodemon: bin/nodemon.js + checksum: 689f260e1c63b7dfdc1f8acb491c01fe1a03dbd93505b9e5dc94c6c683f9b8e0cf7d136a1274fb8f038f82b25ea59042db740e61014b8fed2f13ff441ba4b36c languageName: node linkType: hard @@ -13576,6 +17690,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:~1.0.10": + version: 1.0.10 + resolution: "nopt@npm:1.0.10" + dependencies: + abbrev: "npm:1" + bin: + nopt: ./bin/nopt.js + checksum: 4f01ad1e144883a190d70bd6003f26e2f3a899230fe1b0f3310e43779c61cab5ae0063a9209912cd52fc4c552b266b38173853aa9abe27ecb04acbdfdca2e9fc + languageName: node + linkType: hard + "normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" @@ -13618,6 +17743,15 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^5.1.0": + version: 5.2.0 + resolution: "npm-run-path@npm:5.2.0" + dependencies: + path-key: "npm:^4.0.0" + checksum: c5325e016014e715689c4014f7e0be16cc4cbf529f32a1723e511bc4689b5f823b704d2bca61ac152ce2bda65e0205dc8b3ba0ec0f5e4c3e162d302f6f5b9efb + languageName: node + linkType: hard + "npmlog@npm:^4.0.1": version: 4.1.2 resolution: "npmlog@npm:4.1.2" @@ -13758,6 +17892,31 @@ __metadata: languageName: node linkType: hard +"ofetch@npm:^1.3.3": + version: 1.3.3 + resolution: "ofetch@npm:1.3.3" + dependencies: + destr: "npm:^2.0.1" + node-fetch-native: "npm:^1.4.0" + ufo: "npm:^1.3.0" + checksum: d4ba1f374f3b9f3b4bd47fdca3cda47a16367e6f727545aa3ba93e9be89e615c6731dfd21158b2ef78c1788def15d2d045c233a446354099d6a17fee66e60c98 + languageName: node + linkType: hard + +"ohash@npm:^1.1.3": + version: 1.1.3 + resolution: "ohash@npm:1.1.3" + checksum: 80a3528285f61588600c8c4f091a67f55fbc141f4eec4b3c30182468053042eef5a9684780e963f98a71ec068f3de56d42920c6417bf8f79ab14aeb75ac0bb39 + languageName: node + linkType: hard + +"on-exit-leak-free@npm:^0.2.0": + version: 0.2.0 + resolution: "on-exit-leak-free@npm:0.2.0" + checksum: 36a3a1baea964dc01088884e9d87824cc1a3304ae702e7c688bdb5deec61fbb79325977dd6cba5988f60ad40fedc6ef31ec705adf65b4b042bc0d2686186c0dd + languageName: node + linkType: hard + "on-finished@npm:2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -13785,6 +17944,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: "npm:^4.0.0" + checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 + languageName: node + linkType: hard + "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3" @@ -13827,6 +17995,13 @@ __metadata: languageName: node linkType: hard +"outdent@npm:^0.8.0": + version: 0.8.0 + resolution: "outdent@npm:0.8.0" + checksum: a556c5c308705ad4e3441be435f2b2cf014cb5f9753a24cbd080eadc473b988c77d0d529a6a9a57c3931fb4178e5a81d668cc4bc49892b668191a5d0ba3df76e + languageName: node + linkType: hard + "p-cancelable@npm:^0.3.0": version: 0.3.0 resolution: "p-cancelable@npm:0.3.0" @@ -13875,7 +18050,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2": +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -14067,6 +18242,13 @@ __metadata: languageName: node linkType: hard +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + "path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -14097,6 +18279,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.0, pathe@npm:^1.1.1, pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: f201d796351bf7433d147b92c20eb154a4e0ea83512017bf4ec4e492a5d6e738fb45798be4259a61aa81270179fce11026f6ff0d3fa04173041de044defe9d80 + languageName: node + linkType: hard + "pathval@npm:^1.1.1": version: 1.1.1 resolution: "pathval@npm:1.1.1" @@ -14124,7 +18313,14 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc @@ -14140,6 +18336,13 @@ __metadata: languageName: node linkType: hard +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 668c1dc8d9fc1b34b9ce3b16ba59deb39d4dc743527bf2ed908d2b914cb8ba40aa5ba6960b27c417c241531c5aafd0598feeac2d50cb15278cf9863fa6b02a77 + languageName: node + linkType: hard + "pify@npm:^4.0.1": version: 4.0.1 resolution: "pify@npm:4.0.1" @@ -14147,6 +18350,58 @@ __metadata: languageName: node linkType: hard +"pify@npm:^5.0.0": + version: 5.0.0 + resolution: "pify@npm:5.0.0" + checksum: 443e3e198ad6bfa8c0c533764cf75c9d5bc976387a163792fb553ffe6ce923887cf14eebf5aea9b7caa8eab930da8c33612990ae85bd8c2bc18bedb9eae94ecb + languageName: node + linkType: hard + +"pino-abstract-transport@npm:v0.5.0": + version: 0.5.0 + resolution: "pino-abstract-transport@npm:0.5.0" + dependencies: + duplexify: "npm:^4.1.2" + split2: "npm:^4.0.0" + checksum: d304a104e5cb0c3fef62ea544a4a39bf2472a602cdd7ddb136b0671b9c324ad93fa7888825c4cf33e624802436e897081ba92440f40518b9f2dbdbc0c889e409 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^4.0.0": + version: 4.0.0 + resolution: "pino-std-serializers@npm:4.0.0" + checksum: cec586f9634ef0e6582f62bc8fc5ca5b6e5e11ab88fe3950c66fb0fd5d6690f66bc39cd3f27216b925d2963ad5c3bba415718819ac20ebe0390c7d056cbfea1b + languageName: node + linkType: hard + +"pino@npm:7.11.0": + version: 7.11.0 + resolution: "pino@npm:7.11.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + fast-redact: "npm:^3.0.0" + on-exit-leak-free: "npm:^0.2.0" + pino-abstract-transport: "npm:v0.5.0" + pino-std-serializers: "npm:^4.0.0" + process-warning: "npm:^1.0.0" + quick-format-unescaped: "npm:^4.0.3" + real-require: "npm:^0.1.0" + safe-stable-stringify: "npm:^2.1.0" + sonic-boom: "npm:^2.2.1" + thread-stream: "npm:^0.15.1" + bin: + pino: bin.js + checksum: 1c7b4b52fea76e0bc5d8b1190a0fee24279cb16d76fdb5833b32b64256fd8a94d641574b850faba5be72514f04045206b6d902a9a3f5ceae2a4296687088e073 + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: d02dda76f4fec1cbdf395c36c11cf26f76a644f9f9a1bfa84d3167d0d3154d5289aacc72677aa20d599bb4a6937a471de1b65c995e2aea2d8687cbcd7e43ea5f + languageName: node + linkType: hard + "pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -14156,6 +18411,17 @@ __metadata: languageName: node linkType: hard +"pkg-types@npm:^1.0.3": + version: 1.0.3 + resolution: "pkg-types@npm:1.0.3" + dependencies: + jsonc-parser: "npm:^3.2.0" + mlly: "npm:^1.2.0" + pathe: "npm:^1.1.0" + checksum: e17e1819ce579c9ea390e4c41a9ed9701d8cff14b463f9577cc4f94688da8917c66dabc40feacd47a21eb3de9b532756a78becd882b76add97053af307c1240a + languageName: node + linkType: hard + "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" @@ -14163,6 +18429,38 @@ __metadata: languageName: node linkType: hard +"pngjs@npm:^5.0.0": + version: 5.0.0 + resolution: "pngjs@npm:5.0.0" + checksum: 345781644740779752505af2fea3e9043f6c7cc349b18e1fb8842796360d1624791f0c24d33c0f27b05658373f90ffaa177a849e932e5fea1f540cef3975f3c9 + languageName: node + linkType: hard + +"pony-cause@npm:^2.1.10": + version: 2.1.10 + resolution: "pony-cause@npm:2.1.10" + checksum: 906563565030996d0c40ba79a584e2f298391931acc59c98510f9fd583d72cd9e9c58b0fb5a25bbae19daf16840f94cb9c1ee72c7ed5ef249ecba147cee40495 + languageName: node + linkType: hard + +"postcss@npm:8.4.31": + version: 8.4.31 + resolution: "postcss@npm:8.4.31" + dependencies: + nanoid: "npm:^3.3.6" + picocolors: "npm:^1.0.0" + source-map-js: "npm:^1.0.2" + checksum: 1a6653e72105907377f9d4f2cd341d8d90e3fde823a5ddea1e2237aaa56933ea07853f0f2758c28892a1d70c53bbaca200eb8b80f8ed55f13093003dbec5afa0 + languageName: node + linkType: hard + +"preact@npm:^10.12.0, preact@npm:^10.16.0": + version: 10.19.6 + resolution: "preact@npm:10.19.6" + checksum: 851c7d91e6899a40fdeae0ef9a792bf3217ed8365ce96f4c5630048c82b44c637fd4c0d8a4b0c3e1c8e74e243600dd9c5787520da07552d33a06c957779b4167 + languageName: node + linkType: hard + "prebuild-install@npm:^5.3.4": version: 5.3.6 resolution: "prebuild-install@npm:5.3.6" @@ -14284,6 +18582,17 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: dea96bc83c83cd91b2bfc55757b6b2747edcaac45b568e46de29deee80742f17bc76fe8898135a70d904f4928eafd8bb693cd1da4896e8bdd3c5e82cadf1d2bb + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -14291,6 +18600,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^1.0.0": + version: 1.0.0 + resolution: "process-warning@npm:1.0.0" + checksum: 8736d11d8d71c349d176e210305e84d74b13af06efb3c779377b056bfd608257d1e4e32b8fbbf90637c900f0313e40f7c9f583140884f667a21fc10a869b840c + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -14333,7 +18649,7 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.4.2": +"prompts@npm:^2.0.1, prompts@npm:^2.4.2": version: 2.4.2 resolution: "prompts@npm:2.4.2" dependencies: @@ -14384,6 +18700,13 @@ __metadata: languageName: node linkType: hard +"proxy-compare@npm:2.5.1": + version: 2.5.1 + resolution: "proxy-compare@npm:2.5.1" + checksum: 64b6277d08d89f0b2c468a84decf43f82a4e88da7075651e6adebc69d1b87fadc17cfeb43c024c00b65faa3f0908f7ac1e61f5f6849a404a547a742e6aa527a6 + languageName: node + linkType: hard + "prr@npm:~1.0.1": version: 1.0.1 resolution: "prr@npm:1.0.1" @@ -14405,6 +18728,13 @@ __metadata: languageName: node linkType: hard +"pstree.remy@npm:^1.1.8": + version: 1.1.8 + resolution: "pstree.remy@npm:1.1.8" + checksum: ef13b1b5896b35f67dbd4fb7ba54bb2a5da1a5c317276cbad4bcad4159bf8f7b5e1748dc244bf36865f3d560d2fc952521581280a91468c9c2df166cc760c8c1 + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -14436,6 +18766,13 @@ __metadata: languageName: node linkType: hard +"pure-rand@npm:^6.0.0": + version: 6.0.4 + resolution: "pure-rand@npm:6.0.4" + checksum: 34fed0abe99d3db7ddc459c12e1eda6bff05db6a17f2017a1ae12202271ccf276fb223b442653518c719671c1b339bbf97f27ba9276dba0997c89e45c4e6a3bf + languageName: node + linkType: hard + "pvtsutils@npm:^1.3.2": version: 1.3.2 resolution: "pvtsutils@npm:1.3.2" @@ -14452,6 +18789,34 @@ __metadata: languageName: node linkType: hard +"qrcode@npm:1.5.0": + version: 1.5.0 + resolution: "qrcode@npm:1.5.0" + dependencies: + dijkstrajs: "npm:^1.0.1" + encode-utf8: "npm:^1.0.3" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: b8d942a5fbd45c3517c095095e84566c43a5ef8654eee34957ff96957adf63467a65a3d90177013a2cc2de83932da105aa8beb62a5bc7886fe7e9920ccf02c4d + languageName: node + linkType: hard + +"qrcode@npm:1.5.3, qrcode@npm:^1.5.1": + version: 1.5.3 + resolution: "qrcode@npm:1.5.3" + dependencies: + dijkstrajs: "npm:^1.0.1" + encode-utf8: "npm:^1.0.3" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 823642d59a81ba5f406a1e78415fee37fd53856038f49a85c4ca7aa32ba6b8505ab059a832718ac16612bed75aa2a18584faae38cf3c25e2c90fb19b8c55fe46 + languageName: node + linkType: hard + "qs@npm:6.10.3": version: 6.10.3 resolution: "qs@npm:6.10.3" @@ -14461,6 +18826,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.11.0": + version: 6.11.0 + resolution: "qs@npm:6.11.0" + dependencies: + side-channel: "npm:^1.0.4" + checksum: 5a3bfea3e2f359ede1bfa5d2f0dbe54001aa55e40e27dc3e60fab814362d83a9b30758db057c2011b6f53a2d4e4e5150194b5bac45372652aecb3e3c0d4b256e + languageName: node + linkType: hard + "qs@npm:^6.4.0": version: 6.10.5 resolution: "qs@npm:6.10.5" @@ -14477,6 +18851,18 @@ __metadata: languageName: node linkType: hard +"query-string@npm:7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" + dependencies: + decode-uri-component: "npm:^0.2.2" + filter-obj: "npm:^1.1.0" + split-on-first: "npm:^1.0.0" + strict-uri-encode: "npm:^2.0.0" + checksum: 3b6f2c167e76ca4094c5f1a9eb276efcbb9ebfd8b1a28c413f3c4e4e7d6428c8187bf46c8cbc9f92a229369dd0015de10a7fd712c8cee98d5d84c2ac6140357e + languageName: node + linkType: hard + "query-string@npm:^5.0.1": version: 5.1.1 resolution: "query-string@npm:5.1.1" @@ -14488,6 +18874,18 @@ __metadata: languageName: node linkType: hard +"query-string@npm:^6.13.5": + version: 6.14.1 + resolution: "query-string@npm:6.14.1" + dependencies: + decode-uri-component: "npm:^0.2.0" + filter-obj: "npm:^1.1.0" + split-on-first: "npm:^1.0.0" + strict-uri-encode: "npm:^2.0.0" + checksum: 95f5a372f777b4fb5bdae5a2d85961cf3894d466cfc3a0cc799320d5ed633af935c0d96ee5d2b1652c02888e749831409ca5dd5eb388ce1014a9074024a22840 + languageName: node + linkType: hard + "querystring@npm:0.2.0": version: 0.2.0 resolution: "querystring@npm:0.2.0" @@ -14502,6 +18900,13 @@ __metadata: languageName: node linkType: hard +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 591eca457509a99368b623db05248c1193aa3cedafc9a077d7acab09495db1231017ba3ad1b5386e5633271edd0a03b312d8640a59ee585b8516a42e15438aa7 + languageName: node + linkType: hard + "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -14516,6 +18921,13 @@ __metadata: languageName: node linkType: hard +"radix3@npm:^1.1.0": + version: 1.1.0 + resolution: "radix3@npm:1.1.0" + checksum: 311258ec9e8cc17613fd31aaf3138bfb2ab1ea015738e91591920961f74a1914491338554e8530f7902f1629b6c2ea2dfd66a5c068f14b76cf6535b68b5292c4 + languageName: node + linkType: hard + "randombytes@npm:^2.0.1, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -14558,6 +18970,112 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:^18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" + dependencies: + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.0" + peerDependencies: + react: ^18.2.0 + checksum: ca5e7762ec8c17a472a3605b6f111895c9f87ac7d43a610ab7024f68cd833d08eda0625ce02ec7178cc1f3c957cf0b9273cdc17aa2cd02da87544331c43b1d21 + languageName: node + linkType: hard + +"react-fast-compare@npm:^2.0.1": + version: 2.0.4 + resolution: "react-fast-compare@npm:2.0.4" + checksum: e4e3218c0f5c29b88e9f184a12adb77b0a93a803dbd45cb98bbb754c8310dc74e6266c53dd70b90ba4d0939e0e1b8a182cb05d081bcab22507a0390fbcd768ac + languageName: node + linkType: hard + +"react-is@npm:^16.7.0": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: 200cd65bf2e0be7ba6055f647091b725a45dd2a6abef03bf2380ce701fd5edccee40b49b9d15edab7ac08a762bf83cb4081e31ec2673a5bfb549a36ba21570df + languageName: node + linkType: hard + +"react-remove-scroll-bar@npm:^2.3.3": + version: 2.3.5 + resolution: "react-remove-scroll-bar@npm:2.3.5" + dependencies: + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 6d05e74ee8049b322ba0aeb398e092ae284a5b04013bc07f0c1f283824b088fd5c1b1f1514a0e0e501c063a9c3b5899373039329d0266a21121222c814052053 + languageName: node + linkType: hard + +"react-remove-scroll@npm:2.5.4": + version: 2.5.4 + resolution: "react-remove-scroll@npm:2.5.4" + dependencies: + react-remove-scroll-bar: "npm:^2.3.3" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 330e3b816c1479f74701ff04a90ffff3e2ae8a996ce9d6978eb899a771eed6b9150dc4889d283053f2e4d84f66ad5550e2522d9df35f3394d211ab79d1c54fde + languageName: node + linkType: hard + +"react-style-singleton@npm:^2.2.1": + version: 2.2.1 + resolution: "react-style-singleton@npm:2.2.1" + dependencies: + get-nonce: "npm:^1.0.0" + invariant: "npm:^2.2.4" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 80c58fd6aac3594e351e2e7b048d8a5b09508adb21031a38b3c40911fe58295572eddc640d4b20a7be364842c8ed1120fe30097e22ea055316b375b88d4ff02a + languageName: node + linkType: hard + +"react-toastify@npm:^9.1.1": + version: 9.1.3 + resolution: "react-toastify@npm:9.1.3" + dependencies: + clsx: "npm:^1.1.1" + peerDependencies: + react: ">=16" + react-dom: ">=16" + checksum: 12667aa10e6cf3f74be2e3c704c2d5570dd7de66fff89ae38fbfab1122e9a9f632de1cb712fe44a9a60b8ecca7590578157cb4ca6c4e8105a8cf80936a94e181 + languageName: node + linkType: hard + +"react@npm:^18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: b9214a9bd79e99d08de55f8bef2b7fc8c39630be97c4e29d7be173d14a9a10670b5325e94485f74cd8bff4966ef3c78ee53c79a7b0b9b70cba20aa8973acc694 + languageName: node + linkType: hard + "read-pkg-up@npm:^7.0.1": version: 7.0.1 resolution: "read-pkg-up@npm:7.0.1" @@ -14655,6 +19173,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.1.0": + version: 0.1.0 + resolution: "real-require@npm:0.1.0" + checksum: 0ba1c440dc9b7777d35a97f755312bf236be0847249f76cc9789c5c08d141f5d80b8564888e6a94ed0253fabf597b6892f8502c4e5658fb98f88642633a39723 + languageName: node + linkType: hard + "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -14683,6 +19208,22 @@ __metadata: languageName: node linkType: hard +"redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": + version: 1.2.0 + resolution: "redis-errors@npm:1.2.0" + checksum: 001c11f63ddd52d7c80eb4f4ede3a9433d29a458a7eea06b9154cb37c9802a218d93b7988247aa8c958d4b5d274b18354e8853c148f1096fda87c6e675cfd3ee + languageName: node + linkType: hard + +"redis-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "redis-parser@npm:3.0.0" + dependencies: + redis-errors: "npm:^1.0.0" + checksum: b10846844b4267f19ce1a6529465819c3d78c3e89db7eb0c3bb4eb19f83784797ec411274d15a77dbe08038b48f95f76014b83ca366dc955a016a3a0a0234650 + languageName: node + linkType: hard + "reduce-flatten@npm:^2.0.0": version: 2.0.0 resolution: "reduce-flatten@npm:2.0.0" @@ -14842,6 +19383,15 @@ __metadata: languageName: node linkType: hard +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + "resolve-from@npm:^3.0.0": version: 3.0.0 resolution: "resolve-from@npm:3.0.0" @@ -14863,6 +19413,13 @@ __metadata: languageName: node linkType: hard +"resolve.exports@npm:^2.0.0": + version: 2.0.2 + resolution: "resolve.exports@npm:2.0.2" + checksum: f1cc0b6680f9a7e0345d783e0547f2a5110d8336b3c2a4227231dd007271ffd331fd722df934f017af90bae0373920ca0d4005da6f76cb3176c8ae426370f893 + languageName: node + linkType: hard + "resolve@npm:1.1.x": version: 1.1.7 resolution: "resolve@npm:1.1.7" @@ -14892,7 +19449,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0": +"resolve@npm:^1.10.0, resolve@npm:^1.20.0": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -14934,7 +19491,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin": +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -15156,6 +19713,13 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^2.1.0": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: a6c192bbefe47770a11072b51b500ed29be7b1c15095371c1ee1dc13e45ce48ee3c80330214c56764d006c485b88bd0b24940d868948170dddc16eed312582d8 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -15187,6 +19751,15 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.23.0": + version: 0.23.0 + resolution: "scheduler@npm:0.23.0" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 0c4557aa37bafca44ff21dc0ea7c92e2dbcb298bc62eae92b29a39b029134f02fb23917d6ebc8b1fa536b4184934314c20d8864d156a9f6357f3398aaf7bfda8 + languageName: node + linkType: hard + "scrypt-js@npm:2.0.4": version: 2.0.4 resolution: "scrypt-js@npm:2.0.4" @@ -15254,6 +19827,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 1ef3a85bd02a760c6ef76a45b8c1ce18226de40831e02a00bad78485390b98b6ccaa31046245fc63bba4a47a6a592b6c7eedc65cc47126e60489f9cc1ce3ed7e + languageName: node + linkType: hard + "semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": version: 7.3.7 resolution: "semver@npm:7.3.7" @@ -15265,6 +19847,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.3.8": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 1b41018df2d8aca5a1db4729985e8e20428c650daea60fcd16e926e9383217d00f574fab92d79612771884a98d2ee2a1973f49d630829a8d54d6570defe62535 + languageName: node + linkType: hard + "semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" @@ -15382,7 +19975,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": version: 2.4.11 resolution: "sha.js@npm:2.4.11" dependencies: @@ -15467,6 +20060,13 @@ __metadata: languageName: node linkType: hard +"signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f + languageName: node + linkType: hard + "simple-concat@npm:^1.0.0": version: 1.0.1 resolution: "simple-concat@npm:1.0.1" @@ -15496,6 +20096,15 @@ __metadata: languageName: node linkType: hard +"simple-update-notifier@npm:^2.0.0": + version: 2.0.0 + resolution: "simple-update-notifier@npm:2.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 40bd4f96aa89aedbf717ae9f4ab8fca70e8f7511e8b766feb15471cca3f6fe4fe673743309b08b4ba8abfe0965c9cd927e1de46550a757b819b70fc7430cc85d + languageName: node + linkType: hard + "sinon@npm:^13.0.2": version: 13.0.2 resolution: "sinon@npm:13.0.2" @@ -15719,6 +20328,32 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^2.2.1": + version: 2.8.0 + resolution: "sonic-boom@npm:2.8.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + checksum: 05351d9f44bac59b2a4ab42ee22bf81b8c3bbd22db20183d78d5f2067557eb623e0eaf93b2bc0f8417bee92ca372bc26e0d83e3bdb0ffebcc33738ac1c191876 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: 38e2d2dd18d2e331522001fc51b54127ef4a5d473f53b1349c5cca2123562400e0986648b52e9407e348eaaed53bce49248b6e2641e6d793ca57cb2c360d6d51 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: d1514a922ac9c7e4786037eeff6c3322f461cd25da34bb9fefb15387b3490531774e6e31d95ab6d5b84a3e139af9c3a570ccaee6b47bd7ea262691ed3a8bc34e + languageName: node + linkType: hard + "source-map-support@npm:^0.5.13, source-map-support@npm:^0.5.16": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -15796,6 +20431,20 @@ __metadata: languageName: node linkType: hard +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 + languageName: node + linkType: hard + +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 09bbefc11bcf03f044584c9764cd31a252d8e52cea29130950b26161287c11f519807c5e54bd9e5804c713b79c02cefe6a98f4688630993386be353e03f534ab + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -15833,6 +20482,15 @@ __metadata: languageName: node linkType: hard +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: cdc988acbc99075b4b036ac6014e5f1e9afa7e564482b687da6384eee6a1909d7eaffde85b0a17ffbe186c5247faf6c2b7544e802109f63b72c7be69b13151bb + languageName: node + linkType: hard + "stacktrace-parser@npm:^0.1.10": version: 0.1.10 resolution: "stacktrace-parser@npm:0.1.10" @@ -15842,6 +20500,13 @@ __metadata: languageName: node linkType: hard +"standard-as-callback@npm:^2.1.0": + version: 2.1.0 + resolution: "standard-as-callback@npm:2.1.0" + checksum: 88bec83ee220687c72d94fd86a98d5272c91d37ec64b66d830dbc0d79b62bfa6e47f53b71646011835fc9ce7fae62739545d13124262b53be4fbb3e2ebad551c + languageName: node + linkType: hard + "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -15849,6 +20514,13 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.7.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 + languageName: node + linkType: hard + "stealthy-require@npm:^1.1.1": version: 1.1.1 resolution: "stealthy-require@npm:1.1.1" @@ -15856,6 +20528,13 @@ __metadata: languageName: node linkType: hard +"stream-shift@npm:^1.0.0": + version: 1.0.3 + resolution: "stream-shift@npm:1.0.3" + checksum: a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 + languageName: node + linkType: hard + "stream-transform@npm:^2.1.3": version: 2.1.3 resolution: "stream-transform@npm:2.1.3" @@ -15879,6 +20558,13 @@ __metadata: languageName: node linkType: hard +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 + languageName: node + linkType: hard + "string-argv@npm:^0.3.1": version: 0.3.1 resolution: "string-argv@npm:0.3.1" @@ -15893,6 +20579,16 @@ __metadata: languageName: node linkType: hard +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 + languageName: node + linkType: hard + "string-width@npm:^1.0.1": version: 1.0.2 resolution: "string-width@npm:1.0.2" @@ -16072,6 +20768,13 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 + languageName: node + linkType: hard + "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -16079,6 +20782,13 @@ __metadata: languageName: node linkType: hard +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 + languageName: node + linkType: hard + "strip-hex-prefix@npm:1.0.0": version: 1.0.0 resolution: "strip-hex-prefix@npm:1.0.0" @@ -16111,6 +20821,22 @@ __metadata: languageName: node linkType: hard +"styled-jsx@npm:5.1.1": + version: 5.1.1 + resolution: "styled-jsx@npm:5.1.1" + dependencies: + client-only: "npm:0.0.1" + peerDependencies: + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0" + peerDependenciesMeta: + "@babel/core": + optional: true + babel-plugin-macros: + optional: true + checksum: 4f6a5d0010770fdeea1183d919d528fd46c484e23c0535ef3e1dd49488116f639c594f3bd4440e3bc8a8686c9f8d53c5761599870ff039ede11a5c3bfe08a4be + languageName: node + linkType: hard + "superstruct@npm:^0.14.2": version: 0.14.2 resolution: "superstruct@npm:0.14.2" @@ -16118,6 +20844,13 @@ __metadata: languageName: node linkType: hard +"superstruct@npm:^1.0.3": + version: 1.0.3 + resolution: "superstruct@npm:1.0.3" + checksum: 632b6171ac136b6750e62a55f806cc949b3dbf2b4a7dc70cc85f54adcdf19d21eab9711f04e8a643b7dd622bbd8658366ead924f467adaccb2c8005c133b7976 + languageName: node + linkType: hard + "supports-color@npm:6.0.0": version: 6.0.0 resolution: "supports-color@npm:6.0.0" @@ -16127,7 +20860,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:8.1.1": +"supports-color@npm:8.1.1, supports-color@npm:^8.0.0": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -16145,7 +20878,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": +"supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" dependencies: @@ -16233,6 +20966,13 @@ __metadata: languageName: node linkType: hard +"system-architecture@npm:^0.1.0": + version: 0.1.0 + resolution: "system-architecture@npm:0.1.0" + checksum: ca0dd793c45c354ab57dd7fc8ce7dc9923a6e07382bd3b22eb5b08f55ddb0217c390d00767549c5155fd4ce7ef23ffdd8cfb33dd4344cbbd37837d085a50f6f0 + languageName: node + linkType: hard + "table-layout@npm:^1.0.2": version: 1.0.2 resolution: "table-layout@npm:1.0.2" @@ -16351,6 +21091,17 @@ __metadata: languageName: node linkType: hard +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 8fccb2cb6c8fcb6bb4115394feb833f8b6cf4b9503ec2485c2c90febf435cac62abe882a0c5c51a37b9bbe70640cdd05acf5f45e486ac4583389f4b0855f69e5 + languageName: node + linkType: hard + "text-encoding-utf-8@npm:^1.0.2": version: 1.0.2 resolution: "text-encoding-utf-8@npm:1.0.2" @@ -16384,6 +21135,15 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^0.15.1": + version: 0.15.2 + resolution: "thread-stream@npm:0.15.2" + dependencies: + real-require: "npm:^0.1.0" + checksum: ca0a4f5bf45db88b48b41af0299455eaa8f01dd3ef8279e7ba6909c295b3ab79ddf576b595cbbceb4dbdf4012b17c6449805092926163fcbf30ac1604cb595b1 + languageName: node + linkType: hard + "through@npm:>=2.2.7 <3, through@npm:^2.3.8": version: 2.3.8 resolution: "through@npm:2.3.8" @@ -16398,6 +21158,13 @@ __metadata: languageName: node linkType: hard +"tiny-warning@npm:^1.0.2": + version: 1.0.3 + resolution: "tiny-warning@npm:1.0.3" + checksum: da62c4acac565902f0624b123eed6dd3509bc9a8d30c06e017104bedcf5d35810da8ff72864400ad19c5c7806fc0a8323c68baf3e326af7cb7d969f846100d71 + languageName: node + linkType: hard + "tmp@npm:0.0.33, tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -16407,6 +21174,13 @@ __metadata: languageName: node linkType: hard +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 + languageName: node + linkType: hard + "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -16423,6 +21197,13 @@ __metadata: languageName: node linkType: hard +"toggle-selection@npm:^1.0.6": + version: 1.0.6 + resolution: "toggle-selection@npm:1.0.6" + checksum: 9a0ed0ecbaac72b4944888dacd79fe0a55eeea76120a4c7e46b3bb3d85b24f086e90560bb22f5a965654a25ab43d79ec47dfdb3f1850ba740b14c5a50abc7040 + languageName: node + linkType: hard + "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -16430,6 +21211,17 @@ __metadata: languageName: node linkType: hard +"touch@npm:^3.1.0": + version: 3.1.0 + resolution: "touch@npm:3.1.0" + dependencies: + nopt: "npm:~1.0.10" + bin: + nodetouch: ./bin/nodetouch.js + checksum: ece1d9693fbc9b73d8a6d902537b787b5685ac1aeab7562857c50e6671415a73c985055393442b518f4ac37b85c3e7a3e6c36af71142fed13b8bb04fb6664936 + languageName: node + linkType: hard + "tough-cookie@npm:^2.3.3, tough-cookie@npm:~2.5.0": version: 2.5.0 resolution: "tough-cookie@npm:2.5.0" @@ -16510,6 +21302,39 @@ __metadata: languageName: node linkType: hard +"ts-jest@npm:^29.1.2": + version: 29.1.2 + resolution: "ts-jest@npm:29.1.2" + dependencies: + bs-logger: "npm:0.x" + fast-json-stable-stringify: "npm:2.x" + jest-util: "npm:^29.0.0" + json5: "npm:^2.2.3" + lodash.memoize: "npm:4.x" + make-error: "npm:1.x" + semver: "npm:^7.5.3" + yargs-parser: "npm:^21.0.1" + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: 5e40e7b933a1f3aa0d304d3c53913d1a7125fc79cd44e22b332f6e25dfe13008ddc7ac647066bb4f914d76083f7e8949f0bc156d793c30f3419f4ffd8180968b + languageName: node + linkType: hard + "ts-node@npm:^10.8.0": version: 10.9.1 resolution: "ts-node@npm:10.9.1" @@ -16548,13 +21373,20 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.11.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": +"tslib@npm:1.14.1, tslib@npm:^1.11.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb languageName: node linkType: hard +"tslib@npm:^2.0.0": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca + languageName: node + linkType: hard + "tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.4.0 resolution: "tslib@npm:2.4.0" @@ -16794,7 +21626,7 @@ __metadata: languageName: node linkType: hard -"typedarray-to-buffer@npm:^3.1.5": +"typedarray-to-buffer@npm:3.1.5, typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" dependencies: @@ -16871,6 +21703,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.3.0, ufo@npm:^1.3.1, ufo@npm:^1.3.2": + version: 1.4.0 + resolution: "ufo@npm:1.4.0" + checksum: b7aea8503878dc5ad797d8fc6fe39fec64d9cc7e89fb147ef86ec676e37bb462d99d67c6aad20b15f7d3e6d275d66666b29214422e268f1d98f6eaf707a207a6 + languageName: node + linkType: hard + "uglify-js@npm:^3.1.4": version: 3.16.0 resolution: "uglify-js@npm:3.16.0" @@ -16880,6 +21719,15 @@ __metadata: languageName: node linkType: hard +"uint8arrays@npm:^3.0.0, uint8arrays@npm:^3.1.0": + version: 3.1.1 + resolution: "uint8arrays@npm:3.1.1" + dependencies: + multiformats: "npm:^9.4.2" + checksum: 536e70273c040484aa7d522031a9dbca1fe8c06eb58a3ace1064ba68825b4e2764d4a0b604a1c451e7b8be0986dc94f23a419cfe9334bd116716074a2d29b33d + languageName: node + linkType: hard + "ultron@npm:~1.1.0": version: 1.1.1 resolution: "ultron@npm:1.1.1" @@ -16899,6 +21747,20 @@ __metadata: languageName: node linkType: hard +"uncrypto@npm:^0.1.3": + version: 0.1.3 + resolution: "uncrypto@npm:0.1.3" + checksum: 0020f74b0ce34723196d8982a73bb7f40cff455a41b8f88ae146b86885f4e66e41a1241fe80a887505c3bd2c7f07ed362b6ed041968370073c40a98496e6a737 + languageName: node + linkType: hard + +"undefsafe@npm:^2.0.5": + version: 2.0.5 + resolution: "undefsafe@npm:2.0.5" + checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc + languageName: node + linkType: hard + "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -16915,6 +21777,19 @@ __metadata: languageName: node linkType: hard +"unenv@npm:^1.9.0": + version: 1.9.0 + resolution: "unenv@npm:1.9.0" + dependencies: + consola: "npm:^3.2.3" + defu: "npm:^6.1.3" + mime: "npm:^3.0.0" + node-fetch-native: "npm:^1.6.1" + pathe: "npm:^1.1.1" + checksum: 7b5e0f139f69ebb9d2822abc84903eccb5655bacc00a26cc3be260f25b3d84b5e19418503e038c7bf4bcc67c4f8ebcab7d55736f7eddf7a3948a311176b1d000 + languageName: node + linkType: hard + "unique-filename@npm:^1.1.1": version: 1.1.1 resolution: "unique-filename@npm:1.1.1" @@ -16954,6 +21829,97 @@ __metadata: languageName: node linkType: hard +"unstorage@npm:^1.9.0": + version: 1.10.1 + resolution: "unstorage@npm:1.10.1" + dependencies: + anymatch: "npm:^3.1.3" + chokidar: "npm:^3.5.3" + destr: "npm:^2.0.2" + h3: "npm:^1.8.2" + ioredis: "npm:^5.3.2" + listhen: "npm:^1.5.5" + lru-cache: "npm:^10.0.2" + mri: "npm:^1.2.0" + node-fetch-native: "npm:^1.4.1" + ofetch: "npm:^1.3.3" + ufo: "npm:^1.3.1" + peerDependencies: + "@azure/app-configuration": ^1.4.1 + "@azure/cosmos": ^4.0.0 + "@azure/data-tables": ^13.2.2 + "@azure/identity": ^3.3.2 + "@azure/keyvault-secrets": ^4.7.0 + "@azure/storage-blob": ^12.16.0 + "@capacitor/preferences": ^5.0.6 + "@netlify/blobs": ^6.2.0 + "@planetscale/database": ^1.11.0 + "@upstash/redis": ^1.23.4 + "@vercel/kv": ^0.2.3 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/kv": + optional: true + idb-keyval: + optional: true + checksum: 1b99782efd7f22826731da0b9fe4af18227e006c6b3f057d7cd0da5590d93a1ff3eb192d8b037bcc883a9c76de96560a2e975a0f574eb4b8f5e7207bae3de149 + languageName: node + linkType: hard + +"untun@npm:^0.1.3": + version: 0.1.3 + resolution: "untun@npm:0.1.3" + dependencies: + citty: "npm:^0.1.5" + consola: "npm:^3.2.3" + pathe: "npm:^1.1.1" + bin: + untun: bin/untun.mjs + checksum: 6a096002ca13b8442ad1d40840088888cfaa28626eefdd132cd0fd3d3b956af121a9733b7bda32647608e278fb13332d2b72e2c319a27dc55dbc8e709a2f61d4 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" + dependencies: + escalade: "npm:^3.1.1" + picocolors: "npm:^1.0.0" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 9074b4ef34d2ed931f27d390aafdd391ee7c45ad83c508e8fed6aaae1eb68f81999a768ed8525c6f88d4001a4fbf1b8c0268f099d0e8e72088ec5945ac796acf + languageName: node + linkType: hard + +"uqr@npm:^0.1.2": + version: 0.1.2 + resolution: "uqr@npm:0.1.2" + checksum: 31f1fe7d7a8121a2670712234524763160985b053e7eb8af7925a131bcde0df11641e15129d988358032da603185456d08dd72b26b507897272eb9640273bfa6 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -16996,6 +21962,19 @@ __metadata: languageName: node linkType: hard +"urql@npm:^3.0.3": + version: 3.0.4 + resolution: "urql@npm:3.0.4" + dependencies: + "@urql/core": "npm:^3.2.0" + wonka: "npm:^6.0.0" + peerDependencies: + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + react: ">= 16.8.0" + checksum: b157585cfa21d3d1fd60ff4612ffdfb1af0803e71b9a90381e20fea355671c944a478eb92d0ecb1b20967b4b42bdb099cb141f233a97684b09dd24ac619a26a5 + languageName: node + linkType: hard + "usb@npm:^1.6.3": version: 1.9.2 resolution: "usb@npm:1.9.2" @@ -17007,6 +21986,46 @@ __metadata: languageName: node linkType: hard +"use-callback-ref@npm:^1.3.0": + version: 1.3.1 + resolution: "use-callback-ref@npm:1.3.1" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 7cc68dbd8bb9890e21366f153938988967f0a17168a215bf31e24519f826a2de7de596e981f016603a363362f736f2cffad05091c3857fcafbc9c3b20a3eef1e + languageName: node + linkType: hard + +"use-sidecar@npm:^1.1.2": + version: 1.1.2 + resolution: "use-sidecar@npm:1.1.2" + dependencies: + detect-node-es: "npm:^1.1.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: ec99e31aefeb880f6dc4d02cb19a01d123364954f857811470ece32872f70d6c3eadbe4d073770706a9b7db6136f2a9fbf1bb803e07fbb21e936a47479281690 + languageName: node + linkType: hard + +"use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: a676216affc203876bd47981103f201f28c2731361bb186367e12d287a7566763213a8816910c6eb88265eccd4c230426eb783d64c373c4a180905be8820ed8e + languageName: node + linkType: hard + "utf-8-validate@npm:5.0.7": version: 5.0.7 resolution: "utf-8-validate@npm:5.0.7" @@ -17116,6 +22135,17 @@ __metadata: languageName: node linkType: hard +"v8-to-istanbul@npm:^9.0.1": + version: 9.2.0 + resolution: "v8-to-istanbul@npm:9.2.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 18dd8cebfb6790f27f4e41e7cff77c7ab1c8904085f354dd7875e2eb65f4261c4cf40939132502875779d92304bfea46b8336346ecb40b6f33c3a3979e6f5729 + languageName: node + linkType: hard + "validate-npm-package-license@npm:^3.0.1": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -17126,6 +22156,24 @@ __metadata: languageName: node linkType: hard +"valtio@npm:1.11.2": + version: 1.11.2 + resolution: "valtio@npm:1.11.2" + dependencies: + proxy-compare: "npm:2.5.1" + use-sync-external-store: "npm:1.2.0" + peerDependencies: + "@types/react": ">=16.8" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + checksum: a259f5af204b801668e019855813a8f702c9558961395bb5847f583119428b997efb9b0e6feb5d6e48a76a9b541173a10fdfdb1527a7bd14477a0e0c5beba914 + languageName: node + linkType: hard + "varint@npm:^5.0.0": version: 5.0.2 resolution: "varint@npm:5.0.2" @@ -17172,6 +22220,46 @@ __metadata: languageName: node linkType: hard +"wagmi@npm:0.12.18": + version: 0.12.18 + resolution: "wagmi@npm:0.12.18" + dependencies: + "@tanstack/query-sync-storage-persister": "npm:^4.27.1" + "@tanstack/react-query": "npm:^4.28.0" + "@tanstack/react-query-persist-client": "npm:^4.28.0" + "@wagmi/core": "npm:0.10.16" + abitype: "npm:^0.3.0" + use-sync-external-store: "npm:^1.2.0" + peerDependencies: + ethers: ">=5.5.1 <6" + react: ">=17.0.0" + typescript: ">=4.9.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 1f32350b77b8614f878e8f3594dfa0dedde7d6d951898b2d066d527e0c91e7f2d210afe576d2d88a4245e4182050d377964ba11e3dbeecfeecefef37abc2af1d + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: "npm:1.0.12" + checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + languageName: node + linkType: hard + +"watchpack@npm:2.4.0": + version: 2.4.0 + resolution: "watchpack@npm:2.4.0" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 4280b45bc4b5d45d5579113f2a4af93b67ae1b9607cc3d86ae41cdd53ead10db5d9dc3237f24256d05ef88b28c69a02712f78e434cb7ecc8edaca134a56e8cab + languageName: node + linkType: hard + "wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" @@ -17715,6 +22803,13 @@ __metadata: languageName: node linkType: hard +"wonka@npm:^6.0.0, wonka@npm:^6.1.2": + version: 6.3.4 + resolution: "wonka@npm:6.3.4" + checksum: 0f102630182828268b57b54102003449b97abbc2483392239baf856a2fca7b72ae9be67c208415124a3d26a320674ed64387e9bf07a8d0badedb5f607d2ccfdc + languageName: node + linkType: hard + "word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" @@ -17786,6 +22881,16 @@ __metadata: languageName: node linkType: hard +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 3be1f5508a46c190619d5386b1ac8f3af3dbe951ed0f7b0b4a0961eed6fc626bd84b50cf4be768dabc0a05b672f5d0c5ee7f42daa557b14415d18c3a13c7d246 + languageName: node + linkType: hard + "ws@npm:7.4.6": version: 7.4.6 resolution: "ws@npm:7.4.6" @@ -17827,7 +22932,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7, ws@npm:^7.4.5": +"ws@npm:^7, ws@npm:^7.4.5, ws@npm:^7.5.1": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -18007,7 +23112,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.1.1": +"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: 9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e @@ -18070,7 +23175,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^15.1.0": +"yargs@npm:^15.1.0, yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" dependencies: @@ -18089,7 +23194,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.7.1, yargs@npm:^17.7.2": +"yargs@npm:^17.3.1, yargs@npm:^17.7.1, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -18124,3 +23229,40 @@ __metadata: checksum: 1c67216871808c3beaeaf2439adfc589055502665e8fc4267abf36dc4f673018cd15575e8f38a3eb9b8edb43356d91a809fc6ded3fab4b7f5d6a3982d0b97c77 languageName: node linkType: hard + +"zustand@npm:4.3.8": + version: 4.3.8 + resolution: "zustand@npm:4.3.8" + dependencies: + use-sync-external-store: "npm:1.2.0" + peerDependencies: + immer: ">=9.0" + react: ">=16.8" + peerDependenciesMeta: + immer: + optional: true + react: + optional: true + checksum: 95a5335716414c8bef3a48165226ef099ca232931ab6cd1497515ee4241e8d5a8100edf5c3cc7d7131b72a07eb0484501405aa2c3222b4b93ba690cfa2b5593d + languageName: node + linkType: hard + +"zustand@npm:^4.3.1": + version: 4.5.1 + resolution: "zustand@npm:4.5.1" + dependencies: + use-sync-external-store: "npm:1.2.0" + peerDependencies: + "@types/react": ">=16.8" + immer: ">=9.0.6" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + checksum: c5dcd734ddcc393bc1febcf1811d606222c6d40cb4cf0e4d605be6cfa1855c8b09b6725ab6b73a395f1e020f8f617b605c800c1f19301b240c45d5042e1b2a10 + languageName: node + linkType: hard From dd8ac43c9776050d81735afb1ef06bf94dbae047 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:29:55 +0000 Subject: [PATCH 06/19] Validator task retries (#3361) ### Description - Makes validator tasks infallible by adding retries - This fixes a bug where certain tasks would return an error an shut down, affecting liveness. This was desired in the relayer since we don't want individual chain failures to affect the liveness of other chains. Now validator tasks either terminate or panic, and panicking will be propagated by `try_join_all`, causing the agent to shut down. - A thing to keep in mind in general is that agents will only terminate if a task panics. If it returns an `Err` but doesn't panic, the task won't be respawned. We should consider the implications of this in the scraper too. If this isn't desired, should consider using `select_all!` ### Drive-by changes - retry logic is moved from `rust/chains/hyperlane-cosmos/src/providers/rpc.rs` into `rust/hyperlane-core/src/rpc_clients/retry.rs`, so we're even closer to turning it into a retrying provider - changes several fn signatures within the validator to now return `ChainCommunicationError`s instead of `eyre::Report`s, for compatibility with the retry logic. Also makes `DbError` convertible to `ChainCommunicationError`, for the same reason. This achieves some progress on https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/2878 - allows the backfill checkpoint submitter task to terminate, since `try_join_all` is tolerant of this (as described above) ### Related issues - Fixes https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/3349 ### Backward compatibility ### Testing --- rust/Cargo.lock | 1 + rust/agents/validator/src/submit.rs | 68 +++++++++++-------- rust/agents/validator/src/validator.rs | 9 +-- rust/chains/hyperlane-cosmos/src/error.rs | 3 - .../hyperlane-cosmos/src/providers/rpc.rs | 49 +++---------- rust/hyperlane-base/src/agent.rs | 4 +- rust/hyperlane-base/src/db/rocks/mod.rs | 8 ++- rust/hyperlane-core/Cargo.toml | 3 +- rust/hyperlane-core/src/error.rs | 12 +++- rust/hyperlane-core/src/rpc_clients/mod.rs | 6 ++ rust/hyperlane-core/src/rpc_clients/retry.rs | 51 ++++++++++++++ 11 files changed, 133 insertions(+), 81 deletions(-) create mode 100644 rust/hyperlane-core/src/rpc_clients/retry.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index c40386c2b0..43350301df 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4180,6 +4180,7 @@ dependencies = [ "ethers-providers", "eyre", "fixed-hash 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures", "getrandom 0.2.12", "hex 0.4.3", "itertools 0.12.0", diff --git a/rust/agents/validator/src/submit.rs b/rust/agents/validator/src/submit.rs index 3de0a798af..bc040ed56c 100644 --- a/rust/agents/validator/src/submit.rs +++ b/rust/agents/validator/src/submit.rs @@ -3,12 +3,11 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use std::vec; -use eyre::{bail, Result}; -use hyperlane_core::MerkleTreeHook; +use hyperlane_core::rpc_clients::call_and_retry_indefinitely; +use hyperlane_core::{ChainCommunicationError, ChainResult, MerkleTreeHook}; use prometheus::IntGauge; use tokio::time::sleep; -use tracing::{debug, info}; -use tracing::{error, instrument}; +use tracing::{debug, error, info}; use hyperlane_base::{db::HyperlaneRocksDB, CheckpointSyncer, CoreMetrics}; use hyperlane_core::{ @@ -60,29 +59,28 @@ impl ValidatorSubmitter { /// Submits signed checkpoints from index 0 until the target checkpoint (inclusive). /// Runs idly forever once the target checkpoint is reached to avoid exiting the task. - #[instrument(err, skip(self), fields(domain=%self.merkle_tree_hook.domain()))] - pub(crate) async fn backfill_checkpoint_submitter( - self, - target_checkpoint: Checkpoint, - ) -> Result<()> { + pub(crate) async fn backfill_checkpoint_submitter(self, target_checkpoint: Checkpoint) { let mut tree = IncrementalMerkle::default(); - self.submit_checkpoints_until_correctness_checkpoint(&mut tree, &target_checkpoint) - .await?; + call_and_retry_indefinitely(|| { + let target_checkpoint = target_checkpoint; + let self_clone = self.clone(); + Box::pin(async move { + self_clone + .submit_checkpoints_until_correctness_checkpoint(&mut tree, &target_checkpoint) + .await?; + Ok(()) + }) + }) + .await; info!( ?target_checkpoint, "Backfill checkpoint submitter successfully reached target checkpoint" ); - - // TODO: remove this once validator is tolerant of tasks exiting. - loop { - sleep(Duration::from_secs(u64::MAX)).await; - } } /// Submits signed checkpoints indefinitely, starting from the `tree`. - #[instrument(err, skip(self, tree), fields(domain=%self.merkle_tree_hook.domain()))] - pub(crate) async fn checkpoint_submitter(self, mut tree: IncrementalMerkle) -> Result<()> { + pub(crate) async fn checkpoint_submitter(self, mut tree: IncrementalMerkle) { // How often to log checkpoint info - once every minute let checkpoint_info_log_period = Duration::from_secs(60); // The instant in which we last logged checkpoint info, if at all @@ -102,10 +100,12 @@ impl ValidatorSubmitter { loop { // Lag by reorg period because this is our correctness checkpoint. - let latest_checkpoint = self - .merkle_tree_hook - .latest_checkpoint(self.reorg_period) - .await?; + let latest_checkpoint = call_and_retry_indefinitely(|| { + let merkle_tree_hook = self.merkle_tree_hook.clone(); + Box::pin(async move { merkle_tree_hook.latest_checkpoint(self.reorg_period).await }) + }) + .await; + self.metrics .latest_checkpoint_observed .set(latest_checkpoint.index as i64); @@ -133,8 +133,20 @@ impl ValidatorSubmitter { continue; } - self.submit_checkpoints_until_correctness_checkpoint(&mut tree, &latest_checkpoint) - .await?; + tree = call_and_retry_indefinitely(|| { + let mut tree = tree; + let self_clone = self.clone(); + Box::pin(async move { + self_clone + .submit_checkpoints_until_correctness_checkpoint( + &mut tree, + &latest_checkpoint, + ) + .await?; + Ok(tree) + }) + }) + .await; self.metrics .latest_checkpoint_processed @@ -150,7 +162,7 @@ impl ValidatorSubmitter { &self, tree: &mut IncrementalMerkle, correctness_checkpoint: &Checkpoint, - ) -> Result<()> { + ) -> ChainResult<()> { // This should never be called with a tree that is ahead of the correctness checkpoint. assert!( !tree_exceeds_checkpoint(correctness_checkpoint, tree), @@ -213,7 +225,9 @@ impl ValidatorSubmitter { ?correctness_checkpoint, "Incorrect tree root, something went wrong" ); - bail!("Incorrect tree root, something went wrong"); + return Err(ChainCommunicationError::CustomError( + "Incorrect tree root, something went wrong".to_string(), + )); } if !checkpoint_queue.is_empty() { @@ -238,7 +252,7 @@ impl ValidatorSubmitter { async fn sign_and_submit_checkpoints( &self, checkpoints: Vec, - ) -> Result<()> { + ) -> ChainResult<()> { let last_checkpoint = checkpoints.as_slice()[checkpoints.len() - 1]; for queued_checkpoint in checkpoints { diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index 19c1ccf02c..1f9b86effa 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -141,7 +141,6 @@ impl BaseAgent for Validator { .expect("Failed to create server"); let server_task = tokio::spawn(async move { server.run(routes); - Ok(()) }) .instrument(info_span!("Validator server")); tasks.push(server_task); @@ -150,7 +149,6 @@ impl BaseAgent for Validator { tasks.push( tokio::spawn(async move { signer_instance.run().await; - Ok(()) }) .instrument(info_span!("SingletonSigner")), ); @@ -168,7 +166,6 @@ impl BaseAgent for Validator { tasks.push( tokio::spawn(async move { metrics_updater.spawn().await.unwrap(); - Ok(()) }) .instrument(info_span!("MetricsUpdater")), ); @@ -200,6 +197,7 @@ impl BaseAgent for Validator { } } + // Note that this only returns an error if one of the tasks panics if let Err(err) = try_join_all(tasks).await { error!(?err, "One of the validator tasks returned an error"); } @@ -207,7 +205,7 @@ impl BaseAgent for Validator { } impl Validator { - async fn run_merkle_tree_hook_sync(&self) -> Instrumented>> { + async fn run_merkle_tree_hook_sync(&self) -> Instrumented> { let index_settings = self.as_ref().settings.chains[self.origin_chain.name()].index_settings(); let contract_sync = self.merkle_tree_hook_sync.clone(); @@ -216,12 +214,11 @@ impl Validator { .await; tokio::spawn(async move { contract_sync.clone().sync("merkle_tree_hook", cursor).await; - Ok(()) }) .instrument(info_span!("MerkleTreeHookSyncer")) } - async fn run_checkpoint_submitters(&self) -> Vec>>> { + async fn run_checkpoint_submitters(&self) -> Vec>> { let submitter = ValidatorSubmitter::new( self.interval, self.reorg_period, diff --git a/rust/chains/hyperlane-cosmos/src/error.rs b/rust/chains/hyperlane-cosmos/src/error.rs index cb8ff28cd9..d266d317c4 100644 --- a/rust/chains/hyperlane-cosmos/src/error.rs +++ b/rust/chains/hyperlane-cosmos/src/error.rs @@ -47,9 +47,6 @@ pub enum HyperlaneCosmosError { /// Fallback providers failed #[error("Fallback providers failed. (Errors: {0:?})")] FallbackProvidersFailed(Vec), - /// Custom error - #[error("{0}")] - CustomError(String), } impl From for ChainCommunicationError { diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index df4b4f686d..9a1efd385c 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,25 +1,19 @@ use async_trait::async_trait; use cosmrs::rpc::client::Client; -use futures::Future; +use hyperlane_core::rpc_clients::call_with_retry; use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, LogMeta, H256, U256}; use sha256::digest; -use std::pin::Pin; -use std::time::Duration; use tendermint::abci::{Event, EventAttribute}; use tendermint::hash::Algorithm; use tendermint::Hash; use tendermint_rpc::endpoint::block::Response as BlockResponse; use tendermint_rpc::endpoint::block_results::Response as BlockResultsResponse; use tendermint_rpc::HttpClient; -use tokio::time::sleep; use tracing::{debug, instrument, trace}; use crate::address::CosmosAddress; use crate::{ConnectionConf, CosmosProvider, HyperlaneCosmosError}; -const MAX_RPC_RETRIES: usize = 10; -const RPC_RETRY_SLEEP_DURATION: Duration = Duration::from_secs(2); - #[async_trait] /// Trait for wasm indexer. Use rpc provider pub trait WasmIndexer: Send + Sync { @@ -118,28 +112,6 @@ impl CosmosWasmIndexer { .await .map_err(Into::::into)?) } - - // TODO: Refactor this function into a retrying provider. Once the watermark cursor is refactored, retrying should no longer - // be required here if the error is propagated. - #[instrument(err, skip(f))] - async fn call_with_retry( - mut f: impl FnMut() -> Pin> + Send>>, - ) -> ChainResult { - for retry_number in 1..MAX_RPC_RETRIES { - match f().await { - Ok(res) => return Ok(res), - Err(err) => { - debug!(retries=retry_number, error=?err, "Retrying call"); - sleep(RPC_RETRY_SLEEP_DURATION).await; - } - } - } - - // TODO: Return the last error, or a vec of all the error instead of this string error - Err(ChainCommunicationError::from_other( - HyperlaneCosmosError::CustomError("Retrying call failed".to_string()), - )) - } } impl CosmosWasmIndexer { @@ -241,10 +213,9 @@ impl CosmosWasmIndexer { impl WasmIndexer for CosmosWasmIndexer { #[instrument(err, skip(self))] async fn get_finalized_block_number(&self) -> ChainResult { - let latest_block = Self::call_with_retry(move || { - Box::pin(Self::get_latest_block(self.provider.rpc().clone())) - }) - .await?; + let latest_block = + call_with_retry(move || Box::pin(Self::get_latest_block(self.provider.rpc().clone()))) + .await?; let latest_height: u32 = latest_block .block .header @@ -266,15 +237,11 @@ impl WasmIndexer for CosmosWasmIndexer { { let client = self.provider.rpc().clone(); - let (block_res, block_results_res) = tokio::join!( - Self::call_with_retry(|| { Box::pin(Self::get_block(client.clone(), block_number)) }), - Self::call_with_retry(|| { - Box::pin(Self::get_block_results(client.clone(), block_number)) - }), + let (block, block_results) = tokio::join!( + call_with_retry(|| { Box::pin(Self::get_block(client.clone(), block_number)) }), + call_with_retry(|| { Box::pin(Self::get_block_results(client.clone(), block_number)) }), ); - let block = block_res.map_err(ChainCommunicationError::from_other)?; - let block_results = block_results_res.map_err(ChainCommunicationError::from_other)?; - Ok(self.handle_txs(block, block_results, parser)) + Ok(self.handle_txs(block?, block_results?, parser)) } } diff --git a/rust/hyperlane-base/src/agent.rs b/rust/hyperlane-base/src/agent.rs index b11a2a00f5..5f6b504e9a 100644 --- a/rust/hyperlane-base/src/agent.rs +++ b/rust/hyperlane-base/src/agent.rs @@ -3,6 +3,7 @@ use std::{env, fmt::Debug, sync::Arc}; use async_trait::async_trait; use eyre::Result; use hyperlane_core::config::*; +use tracing::info; use crate::{ create_chain_metrics, @@ -79,7 +80,8 @@ pub async fn agent_main() -> Result<()> { let chain_metrics = create_chain_metrics(&metrics)?; let agent = A::from_settings(settings, metrics.clone(), agent_metrics, chain_metrics).await?; - // This await will never end unless a panic occurs + // This await will only end if a panic happens. We won't crash, but instead gracefully shut down agent.run().await; + info!(agent = A::AGENT_NAME, "Shutting down agent..."); Ok(()) } diff --git a/rust/hyperlane-base/src/db/rocks/mod.rs b/rust/hyperlane-base/src/db/rocks/mod.rs index 1cec492dec..e9a626a157 100644 --- a/rust/hyperlane-base/src/db/rocks/mod.rs +++ b/rust/hyperlane-base/src/db/rocks/mod.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use std::{io, path::Path, sync::Arc}; -use hyperlane_core::HyperlaneProtocolError; +use hyperlane_core::{ChainCommunicationError, HyperlaneProtocolError}; use rocksdb::{Options, DB as Rocks}; use tracing::info; @@ -58,6 +58,12 @@ pub enum DbError { HyperlaneError(#[from] HyperlaneProtocolError), } +impl From for ChainCommunicationError { + fn from(value: DbError) -> Self { + ChainCommunicationError::from_other(value) + } +} + type Result = std::result::Result; impl DB { diff --git a/rust/hyperlane-core/Cargo.toml b/rust/hyperlane-core/Cargo.toml index d9bffe576e..5f34bc2091 100644 --- a/rust/hyperlane-core/Cargo.toml +++ b/rust/hyperlane-core/Cargo.toml @@ -26,6 +26,7 @@ ethers-core = { workspace = true, optional = true } ethers-providers = { workspace = true, optional = true } eyre.workspace = true fixed-hash.workspace = true +futures = { workspace = true, optional = true } getrandom.workspace = true hex.workspace = true itertools.workspace = true @@ -55,4 +56,4 @@ agent = ["ethers", "strum"] strum = ["dep:strum"] ethers = ["dep:ethers-core", "dep:ethers-contract", "dep:ethers-providers", "dep:primitive-types"] solana = ["dep:solana-sdk"] -async = ["tokio"] +async = ["tokio", "futures"] diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index 12d51a4653..3eb1ea5b58 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -10,7 +10,8 @@ use crate::config::StrOrIntParseError; use crate::rpc_clients::RpcClientError; use std::string::FromUtf8Error; -use crate::{Error as PrimitiveTypeError, HyperlaneProviderError, H256, U256}; +use crate::HyperlaneProviderError; +use crate::{Error as PrimitiveTypeError, HyperlaneSignerError, H256, U256}; /// The result of interacting with a chain. pub type ChainResult = Result; @@ -141,6 +142,15 @@ pub enum ChainCommunicationError { #[cfg(feature = "async")] #[error(transparent)] TokioJoinError(#[from] tokio::task::JoinError), + /// Custom error + #[error("{0}")] + CustomError(String), + /// Eyre error + #[error("{0}")] + EyreError(#[from] eyre::Report), + /// Hyperlane signer error + #[error("{0}")] + HyperlaneSignerError(#[from] HyperlaneSignerError), } impl ChainCommunicationError { diff --git a/rust/hyperlane-core/src/rpc_clients/mod.rs b/rust/hyperlane-core/src/rpc_clients/mod.rs index 846e508716..892718918f 100644 --- a/rust/hyperlane-core/src/rpc_clients/mod.rs +++ b/rust/hyperlane-core/src/rpc_clients/mod.rs @@ -3,6 +3,12 @@ pub use self::error::*; #[cfg(feature = "async")] pub use self::fallback::*; +#[cfg(feature = "async")] +pub use self::retry::*; + mod error; #[cfg(feature = "async")] mod fallback; + +#[cfg(feature = "async")] +mod retry; diff --git a/rust/hyperlane-core/src/rpc_clients/retry.rs b/rust/hyperlane-core/src/rpc_clients/retry.rs new file mode 100644 index 0000000000..b5c4e0bd72 --- /dev/null +++ b/rust/hyperlane-core/src/rpc_clients/retry.rs @@ -0,0 +1,51 @@ +use futures::Future; +use std::{pin::Pin, time::Duration}; +use tokio::time::sleep; +use tracing::{instrument, warn}; + +use crate::{ChainCommunicationError, ChainResult}; + +/// Max number of times to retry a call for +pub const DEFAULT_MAX_RPC_RETRIES: usize = 10; + +/// Duration to sleep between retries +pub const RPC_RETRY_SLEEP_DURATION: Duration = Duration::from_secs(2); + +// TODO: Refactor this function into a retrying provider +/// Retry calling a fallible async function a certain number of times, with a delay between each retry +#[instrument(err, skip(f))] +pub async fn call_and_retry_n_times( + mut f: impl FnMut() -> Pin> + Send>>, + n: usize, +) -> ChainResult { + for retry_number in 1..n { + match f().await { + Ok(res) => return Ok(res), + Err(err) => { + warn!(retries=retry_number, error=?err, "Retrying call"); + sleep(RPC_RETRY_SLEEP_DURATION).await; + } + } + } + + // TODO: Return the last error, or a vec of all the error instead of this string error + Err(ChainCommunicationError::CustomError( + "Retrying call failed".to_string(), + )) +} + +/// Retry calling a fallible async function a predefined number of times +#[instrument(err, skip(f))] +pub async fn call_with_retry( + f: impl FnMut() -> Pin> + Send>>, +) -> ChainResult { + call_and_retry_n_times(f, DEFAULT_MAX_RPC_RETRIES).await +} + +/// Retry calling a fallible async function indefinitely, until it succeeds +pub async fn call_and_retry_indefinitely( + f: impl FnMut() -> Pin> + Send>>, +) -> T { + // It's ok to unwrap, because `usize::MAX * RPC_RETRY_SLEEP_DURATION` means billions of years worth of retrying + call_and_retry_n_times(f, usize::MAX).await.unwrap() +} From 0bdabb8abd093eb39355660ab3b7397f814ab945 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Wed, 6 Mar 2024 16:20:42 +0000 Subject: [PATCH 07/19] Deploy agents (#3367) ### Description - Deploys: - all mainnet3 & testnet4 validators to include #3361 - though bc of issues with Cosmos block-by-block indexing, the Cosmos validators are deployed from just prior to #3257 - testnet4 relayer is at tip, mainnet3 relayers which include Cosmos chains are from just prior to Cosmos block-by-block indexing ### Drive-by changes Was unable to deploy to the Neutron context because we don't have a Kathy key for Neutron. Fixed this ### Related issues n/a ### Backward compatibility ### Testing --- .../config/environments/mainnet3/agent.ts | 20 ++++++++++++++++--- .../config/environments/testnet4/agent.ts | 10 +++++----- typescript/infra/config/relayer.json | 2 +- typescript/infra/src/agents/key-utils.ts | 19 ++++++++++-------- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 0734d6fed8..b3b57fa326 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -130,7 +130,8 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '54aeb64-20240206-163119', + // Just prior to Cosmos block-by-block indexing. + tag: '02d5549-20240228-203344', }, gasPaymentEnforcement, metricAppContexts: [ @@ -149,7 +150,19 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '54aeb64-20240206-163119', + tag: 'dd8ac43-20240306-113016', + }, + chainDockerOverrides: { + // Because we're still ironing out issues with recent block-by-block indexing + // for Cosmos chains, and we want to avoid the regression in https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3257 + // that allows validator tasks to silently fail, we use the commit just prior + // to 3257. + [Chains.injective]: { + tag: '02e64c9-20240214-170702', + }, + [Chains.neutron]: { + tag: '02e64c9-20240214-170702', + }, }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -208,7 +221,8 @@ const neutron: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '54aeb64-20240206-163119', + // Just prior to Cosmos block-by-block indexing. + tag: '02d5549-20240228-203344', }, gasPaymentEnforcement: [ { diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index 90dc043953..e07033b662 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -112,7 +112,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'db9ff2d-20240228-143928', + tag: 'dd8ac43-20240306-113016', }, blacklist: [ ...releaseCandidateHelloworldMatchingList, @@ -159,7 +159,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'db9ff2d-20240228-143928', + tag: 'dd8ac43-20240306-113016', }, chains: validatorChainConfig(Contexts.Hyperlane), }, @@ -167,7 +167,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'db9ff2d-20240228-143928', + tag: 'dd8ac43-20240306-113016', }, }, }; @@ -181,7 +181,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'db9ff2d-20240228-143928', + tag: 'dd8ac43-20240306-113016', }, whitelist: [...releaseCandidateHelloworldMatchingList], gasPaymentEnforcement, @@ -194,7 +194,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'db9ff2d-20240228-143928', + tag: 'dd8ac43-20240306-113016', }, chains: validatorChainConfig(Contexts.ReleaseCandidate), }, diff --git a/typescript/infra/config/relayer.json b/typescript/infra/config/relayer.json index 3def0bdaa9..0d943716a7 100644 --- a/typescript/infra/config/relayer.json +++ b/typescript/infra/config/relayer.json @@ -1,7 +1,7 @@ { "mainnet3": { "hyperlane": "0x74cae0ecc47b02ed9b9d32e000fd70b9417970c5", - "neutron": "", + "neutron": "0x03787bc64a4f352b4ad172947473342028513ef3", "rc": "0x09b96417602ed6ac76651f7a8c4860e60e3aa6d0" }, "test": { diff --git a/typescript/infra/src/agents/key-utils.ts b/typescript/infra/src/agents/key-utils.ts index 8302768e65..c008b9afbc 100644 --- a/typescript/infra/src/agents/key-utils.ts +++ b/typescript/infra/src/agents/key-utils.ts @@ -418,7 +418,16 @@ async function persistAddressesLocally( } } if (!relayer) throw new Error('No Relayer found in awsCloudAgentKeys'); - if (!kathy) throw new Error('No Kathy found in awsCloudAgentKeys'); + if (agentConfig.context === Contexts.Hyperlane) { + if (!kathy) throw new Error('No Kathy found in awsCloudAgentKeys'); + await persistRoleAddressesToLocalArtifacts( + Role.Kathy, + agentConfig.runEnv, + agentConfig.context, + kathy, + kathyAddresses, + ); + } await persistRoleAddressesToLocalArtifacts( Role.Relayer, agentConfig.runEnv, @@ -426,13 +435,7 @@ async function persistAddressesLocally( relayer, relayerAddresses, ); - await persistRoleAddressesToLocalArtifacts( - Role.Kathy, - agentConfig.runEnv, - agentConfig.context, - kathy, - kathyAddresses, - ); + await persistValidatorAddressesToLocalArtifacts(multisigValidatorKeys); } From 043f756707792b51367c46ab4d8468f8aae79eb9 Mon Sep 17 00:00:00 2001 From: Lee <6251863+ltyu@users.noreply.github.com> Date: Thu, 7 Mar 2024 03:22:00 -0500 Subject: [PATCH 08/19] Update DockerFile to include ccip-server (#3370) ### Description Fixes Workflow issue due to missing ccip-server package ### Drive-by changes ### Related issues ### Backward compatibility Yes ### Testing --- Dockerfile | 1 + typescript/infra/src/agents/agent.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 4463402489..f40cc6e499 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,6 +15,7 @@ COPY typescript/sdk/package.json ./typescript/sdk/ COPY typescript/helloworld/package.json ./typescript/helloworld/ COPY typescript/cli/package.json ./typescript/cli/ COPY typescript/infra/package.json ./typescript/infra/ +COPY typescript/ccip-server/package.json ./typescript/ccip-server/ COPY solidity/package.json ./solidity/ RUN yarn install && yarn cache clean diff --git a/typescript/infra/src/agents/agent.ts b/typescript/infra/src/agents/agent.ts index 206ede3452..e6afe9f02e 100644 --- a/typescript/infra/src/agents/agent.ts +++ b/typescript/infra/src/agents/agent.ts @@ -48,7 +48,7 @@ export function userIdentifier( return identifier(false, environment, context, role, chainName, index); } -// Doesn't perform any checks on whether the parsed values are valid, +// Does not perform any checks on whether the parsed values are valid, // this is left to the caller. export function parseKeyIdentifier(identifier: string): { environment: string; From 2c2f79cbb62a97d6128b50813fc665257dda44e1 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 7 Mar 2024 11:12:59 +0000 Subject: [PATCH 09/19] Add log for cosmos cursors (#3366) ### Description IGP indexing seemed to not be working. Adding these logs revealed that igp indexing was just super slow... After waiting for 15 mins to do a full local sync based on the hyperlane context db, turns out we're actually successfully indexing igp! Keeping the log for improved troubleshooting in the future. ### Drive-by changes ### Related issues - Fixes https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/3372 ### Backward compatibility ### Testing --- rust/chains/hyperlane-cosmos/src/interchain_gas.rs | 6 +++++- rust/chains/hyperlane-cosmos/src/mailbox.rs | 6 +++++- .../chains/hyperlane-cosmos/src/merkle_tree_hook.rs | 6 +++++- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 13 +++++++++---- rust/config/mainnet3_config.json | 4 ++-- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index c6087bb0bd..60e0e1bb1f 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -212,7 +212,11 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { tokio::spawn(async move { let logs = self_clone .indexer - .get_logs_in_block(block_number, Self::interchain_gas_payment_parser) + .get_logs_in_block( + block_number, + Self::interchain_gas_payment_parser, + "InterchainGasPaymentCursor", + ) .await; (logs, block_number) }) diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 6476da13e8..fcda4e78af 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -361,7 +361,11 @@ impl Indexer for CosmosMailboxIndexer { tokio::spawn(async move { let logs = self_clone .indexer - .get_logs_in_block(block_number, Self::hyperlane_message_parser) + .get_logs_in_block( + block_number, + Self::hyperlane_message_parser, + "HyperlaneMessageCursor", + ) .await; (logs, block_number) }) diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index d55ed45d79..9cab0e9f90 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -293,7 +293,11 @@ impl Indexer for CosmosMerkleTreeHookIndexer { tokio::spawn(async move { let logs = self_clone .indexer - .get_logs_in_block(block_number, Self::merkle_tree_insertion_parser) + .get_logs_in_block( + block_number, + Self::merkle_tree_insertion_parser, + "MerkleTreeInsertionCursor", + ) .await; (logs, block_number) }) diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 9a1efd385c..2a64c257c3 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -3,6 +3,7 @@ use cosmrs::rpc::client::Client; use hyperlane_core::rpc_clients::call_with_retry; use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, LogMeta, H256, U256}; use sha256::digest; +use std::fmt::Debug; use tendermint::abci::{Event, EventAttribute}; use tendermint::hash::Algorithm; use tendermint::Hash; @@ -25,9 +26,10 @@ pub trait WasmIndexer: Send + Sync { &self, block_number: u32, parser: for<'a> fn(&'a Vec) -> ChainResult>, + cursor_label: &'static str, ) -> ChainResult> where - T: Send + Sync + PartialEq + 'static; + T: Send + Sync + PartialEq + Debug + 'static; } #[derive(Debug, Eq, PartialEq)] @@ -122,9 +124,10 @@ impl CosmosWasmIndexer { block: BlockResponse, block_results: BlockResultsResponse, parser: for<'a> fn(&'a Vec) -> ChainResult>, + cursor_label: &'static str, ) -> Vec<(T, LogMeta)> where - T: PartialEq + 'static, + T: PartialEq + Debug + 'static, { let Some(tx_results) = block_results.txs_results else { return vec![]; @@ -231,17 +234,19 @@ impl WasmIndexer for CosmosWasmIndexer { &self, block_number: u32, parser: for<'a> fn(&'a Vec) -> ChainResult>, + cursor_label: &'static str, ) -> ChainResult> where - T: Send + Sync + PartialEq + 'static, + T: Send + Sync + PartialEq + Debug + 'static, { let client = self.provider.rpc().clone(); + debug!(?block_number, ?cursor_label, "Getting logs in block"); let (block, block_results) = tokio::join!( call_with_retry(|| { Box::pin(Self::get_block(client.clone(), block_number)) }), call_with_retry(|| { Box::pin(Self::get_block_results(client.clone(), block_number)) }), ); - Ok(self.handle_txs(block?, block_results?, parser)) + Ok(self.handle_txs(block?, block_results?, parser, cursor_label)) } } diff --git a/rust/config/mainnet3_config.json b/rust/config/mainnet3_config.json index dc078a1ff8..f7683cd30c 100644 --- a/rust/config/mainnet3_config.json +++ b/rust/config/mainnet3_config.json @@ -494,7 +494,7 @@ "contractAddressBytes": 32, "index": { "from": 4000000, - "chunk": 1 + "chunk": 50 }, "blocks": { "reorgPeriod": 1 @@ -533,7 +533,7 @@ "contractAddressBytes": 20, "index": { "from": 58419500, - "chunk": 1 + "chunk": 50 }, "blocks": { "reorgPeriod": 10 From 9736164392ec7b4e86d236cb6e706171e870ffd1 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 7 Mar 2024 13:18:57 +0000 Subject: [PATCH 10/19] fix: log level order, cosmos logging nit (#3374) ### Description Our logging prio order was off, double checked with [this crate](https://docs.rs/log/latest/log/enum.Level.html). Debug logs would be visible at `Info` level according to the previous rules. ### Drive-by changes Removed the debug formatting of a cosmsos log field, so it's no longer surrounded in quotes (bc we'd get `cursor_label: ""InterchainGasPaymentCursor""`) ### Related issues ### Backward compatibility ### Testing --- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 2 +- rust/hyperlane-base/src/settings/trace/mod.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 2a64c257c3..7648e879e0 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -240,7 +240,7 @@ impl WasmIndexer for CosmosWasmIndexer { T: Send + Sync + PartialEq + Debug + 'static, { let client = self.provider.rpc().clone(); - debug!(?block_number, ?cursor_label, "Getting logs in block"); + debug!(?block_number, cursor_label, domain=?self.provider.domain, "Getting logs in block"); let (block, block_results) = tokio::join!( call_with_retry(|| { Box::pin(Self::get_block(client.clone(), block_number)) }), diff --git a/rust/hyperlane-base/src/settings/trace/mod.rs b/rust/hyperlane-base/src/settings/trace/mod.rs index 0866fec0a3..b0640f36ee 100644 --- a/rust/hyperlane-base/src/settings/trace/mod.rs +++ b/rust/hyperlane-base/src/settings/trace/mod.rs @@ -24,7 +24,7 @@ pub enum Level { /// Warn Warn = 2, /// Debug - Debug = 3, + Debug = 4, /// Trace Trace = 5, /// Trace + Additional logs from dependencies @@ -32,7 +32,7 @@ pub enum Level { /// Info #[serde(other)] #[default] - Info = 4, + Info = 3, } impl From for LevelFilter { From 25676064611183a7fb3a9c2ecc2161131dc8ebb9 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Thu, 7 Mar 2024 18:49:43 +0000 Subject: [PATCH 11/19] chore: deploy block-by-block cosmos indexing everywhere (#3378) ### Description Updates the docker images and removes docker overrides ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../config/environments/mainnet3/agent.ts | 26 +++++-------------- .../config/environments/testnet4/agent.ts | 8 +++--- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index b3b57fa326..b3734a7296 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -130,8 +130,8 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - // Just prior to Cosmos block-by-block indexing. - tag: '02d5549-20240228-203344', + // Includes Cosmos block-by-block indexing. + tag: '9736164-20240307-131918', }, gasPaymentEnforcement, metricAppContexts: [ @@ -150,19 +150,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: 'dd8ac43-20240306-113016', - }, - chainDockerOverrides: { - // Because we're still ironing out issues with recent block-by-block indexing - // for Cosmos chains, and we want to avoid the regression in https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3257 - // that allows validator tasks to silently fail, we use the commit just prior - // to 3257. - [Chains.injective]: { - tag: '02e64c9-20240214-170702', - }, - [Chains.neutron]: { - tag: '02e64c9-20240214-170702', - }, + tag: '9736164-20240307-131918', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -185,7 +173,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '6fb50e7-20240229-122630', + tag: '9736164-20240307-131918', }, // whitelist: releaseCandidateHelloworldMatchingList, gasPaymentEnforcement, @@ -197,7 +185,7 @@ const releaseCandidate: RootAgentConfig = { validators: { docker: { repo, - tag: '6fb50e7-20240229-122630', + tag: '9736164-20240307-131918', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.ReleaseCandidate), @@ -221,8 +209,8 @@ const neutron: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - // Just prior to Cosmos block-by-block indexing. - tag: '02d5549-20240228-203344', + // Includes Cosmos block-by-block indexing. + tag: '9736164-20240307-131918', }, gasPaymentEnforcement: [ { diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index e07033b662..0d76116c91 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -112,7 +112,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'dd8ac43-20240306-113016', + tag: '9736164-20240307-131918', }, blacklist: [ ...releaseCandidateHelloworldMatchingList, @@ -159,7 +159,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'dd8ac43-20240306-113016', + tag: '9736164-20240307-131918', }, chains: validatorChainConfig(Contexts.Hyperlane), }, @@ -181,7 +181,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'dd8ac43-20240306-113016', + tag: '9736164-20240307-131918', }, whitelist: [...releaseCandidateHelloworldMatchingList], gasPaymentEnforcement, @@ -194,7 +194,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'dd8ac43-20240306-113016', + tag: '9736164-20240307-131918', }, chains: validatorChainConfig(Contexts.ReleaseCandidate), }, From 78f43c178e71e330c8ba04134ffc95b8c7bad090 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Thu, 7 Mar 2024 14:45:21 -0700 Subject: [PATCH 12/19] Transfer owner and configure default ISM on inEVM native warp route (#3377) ### Description - Updates inEVM INJ warp route ISM ### Backward compatibility Yes ### Testing - See inEVM fork tests --- .github/workflows/test.yml | 3 +++ .../environments/mainnet3/warp/addresses.json | 9 ++++--- typescript/infra/scripts/deploy.ts | 26 +++++++------------ 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0431e5b38e..367fdb85d2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -305,6 +305,9 @@ jobs: - environment: testnet4 chain: sepolia module: core + - environment: mainnet3 + chain: inevm + module: warp steps: - uses: actions/checkout@v3 diff --git a/typescript/infra/config/environments/mainnet3/warp/addresses.json b/typescript/infra/config/environments/mainnet3/warp/addresses.json index 2e38c664a0..c0f9371c34 100644 --- a/typescript/infra/config/environments/mainnet3/warp/addresses.json +++ b/typescript/infra/config/environments/mainnet3/warp/addresses.json @@ -1,8 +1,9 @@ { - "inevm": { - "HypERC20": "0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147" + "injective": { + "router": "inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k" }, - "ethereum": { - "HypERC20Collateral": "0xED56728fb977b0bBdacf65bCdD5e17Bb7e84504f" + "inevm": { + "HypNative": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4", + "router": "0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4" } } diff --git a/typescript/infra/scripts/deploy.ts b/typescript/infra/scripts/deploy.ts index 8026a306aa..e1545c5879 100644 --- a/typescript/infra/scripts/deploy.ts +++ b/typescript/infra/scripts/deploy.ts @@ -23,7 +23,7 @@ import { import { objMap } from '@hyperlane-xyz/utils'; import { Contexts } from '../config/contexts'; -import { aggregationIsm } from '../config/routingIsm'; +import { safes } from '../config/environments/mainnet3/owners'; import { deployEnvToSdkEnv } from '../src/config/environment'; import { deployWithArtifacts } from '../src/deployment/deploy'; import { TestQuerySenderDeployer } from '../src/deployment/testcontracts/testquerysender'; @@ -121,25 +121,19 @@ async function main() { multiProvider, ); const routerConfig = core.getRouterConfig(envConfig.owners); - const plumetestnet = { - ...routerConfig.plumetestnet, - type: TokenType.synthetic, - name: 'Wrapped Ether', - symbol: 'WETH', - decimals: 18, - totalSupply: '0', + const inevm = { + ...routerConfig.inevm, + type: TokenType.native, + interchainSecurityModule: ethers.constants.AddressZero, + owner: safes.inevm, }; - const sepolia = { - ...routerConfig.sepolia, + const injective = { + ...routerConfig.injective, type: TokenType.native, - interchainSecurityModule: aggregationIsm( - 'plumetestnet', - Contexts.Hyperlane, - ), }; config = { - plumetestnet, - sepolia, + inevm, + injective, }; deployer = new HypERC20Deployer( multiProvider, From 3740256d97734a1eb3aaada1dde06982f4c3a203 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Fri, 8 Mar 2024 13:41:50 +0000 Subject: [PATCH 13/19] feat: improve cli test coverage for pi<>core interactions (#3293) --- .github/workflows/test.yml | 14 +- typescript/cli/ci-test.sh | 177 ++++++++++++------ .../cli/examples/fork/anvil-chains.yaml | 21 +++ typescript/cli/examples/fork/ism.yaml | 9 + typescript/cli/examples/fork/warp-tokens.yaml | 26 +++ typescript/helloworld/src/app/app.ts | 2 +- 6 files changed, 185 insertions(+), 64 deletions(-) create mode 100644 typescript/cli/examples/fork/anvil-chains.yaml create mode 100644 typescript/cli/examples/fork/ism.yaml create mode 100644 typescript/cli/examples/fork/warp-tokens.yaml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 367fdb85d2..2761190839 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -226,8 +226,9 @@ jobs: strategy: matrix: include: - - hook: preset_hook_enabled - - hook: configure_hook_enabled + - test-type: preset_hook_enabled + - test-type: configure_hook_enabled + - test-type: pi_with_core_chain steps: - uses: actions/setup-node@v3 with: @@ -284,13 +285,8 @@ jobs: ~/.cargo key: ${{ runner.os }}-cargo-cache-${{ hashFiles('./rust/Cargo.lock') }} - - name: cli e2e tests with preset hook config - run: ./typescript/cli/ci-test.sh false - if: matrix.hook == 'preset_hook_enabled' - - - name: cli e2e tests with configured hook config - run: ./typescript/cli/ci-test.sh true - if: matrix.hook == 'configure_hook_enabled' + - name: cli e2e tests + run: ./typescript/cli/ci-test.sh ${{ matrix.test-type }} env-test: runs-on: ubuntu-latest diff --git a/typescript/cli/ci-test.sh b/typescript/cli/ci-test.sh index 22528dc82c..81f8476679 100755 --- a/typescript/cli/ci-test.sh +++ b/typescript/cli/ci-test.sh @@ -1,18 +1,47 @@ #!/usr/bin/env bash -# NOTE: This script is intended to be run from the root of the repo - -# the first arg to this script is a flag to enable the hook config as part of core deployment -# motivation is to test both the bare bone deployment (included in the docs) and the deployment with the routing over igp hook (which is closer to production deployment) -HOOK_FLAG=$1 -if [ -z "$HOOK_FLAG" ]; then - echo "Usage: ci-test.sh " - exit 1 +# set script location as repo root +cd "$(dirname "$0")/../.." + +TEST_TYPE_PRESET_HOOK="preset_hook_enabled" +TEST_TYPE_CONFIGURED_HOOK="configure_hook_enabled" +TEST_TYPE_PI_CORE="pi_with_core_chain" + +# set the first arg to 'configured_hook' to set the hook config as part of core deployment +# motivation is to test both the bare bone deployment (included in the docs) and the deployment +# with the routing over igp hook (which is closer to production deployment) +TEST_TYPE=$1 +if [ -z "$TEST_TYPE" ]; then + echo "Usage: ci-test.sh " + exit 1 fi +HOOK_FLAG=false +if [ "$TEST_TYPE" == $TEST_TYPE_CONFIGURED_HOOK ]; then + HOOK_FLAG=true +fi + +CHAIN1=anvil1 +CHAIN2=anvil2 +EXAMPLES_PATH=./examples + +# use different chain names and config for pi<>core test +if [ "$TEST_TYPE" == $TEST_TYPE_PI_CORE ]; then + CHAIN1=anvil + CHAIN2=ethereum + EXAMPLES_PATH=./examples/fork +fi + +CHAIN1_CAPS=$(echo "${CHAIN1}" | tr '[:lower:]' '[:upper:]') +CHAIN2_CAPS=$(echo "${CHAIN2}" | tr '[:lower:]' '[:upper:]') + +CHAIN1_PORT=8545 +CHAIN2_PORT=8555 + # Optional cleanup for previous runs, useful when running locally pkill -f anvil -rm -rf /tmp/anvil* +rm -rf /tmp/${CHAIN1}* +rm -rf /tmp/${CHAIN2}* rm -rf /tmp/relayer if [[ $OSTYPE == 'darwin'* ]]; then @@ -22,16 +51,36 @@ if [[ $OSTYPE == 'darwin'* ]]; then fi # Setup directories for anvil chains -for CHAIN in anvil1 anvil2 +for CHAIN in ${CHAIN1} ${CHAIN2} do mkdir -p /tmp/$CHAIN /tmp/$CHAIN/state /tmp/$CHAIN/validator /tmp/relayer chmod -R 777 /tmp/relayer /tmp/$CHAIN done -anvil --chain-id 31337 -p 8545 --state /tmp/anvil1/state --gas-price 1 > /dev/null & -anvil --chain-id 31338 -p 8555 --state /tmp/anvil2/state --gas-price 1 > /dev/null & +# run the PI chain +anvil --chain-id 31337 -p ${CHAIN1_PORT} --state /tmp/${CHAIN1}/state --gas-price 1 > /dev/null & sleep 1 +# use different chain names for pi<>core test +if [ "$TEST_TYPE" == $TEST_TYPE_PI_CORE ]; then + # Fetch the RPC of chain to fork + cd typescript/infra + RPC_URL=$(yarn ts-node scripts/print-chain-metadatas.ts -e mainnet3 | jq -r ".${CHAIN2}.rpcUrls[0].http") + cd ../../ + + # run the fork chain + anvil -p ${CHAIN2_PORT} --state /tmp/${CHAIN2}/state --gas-price 1 --fork-url $RPC_URL --fork-retry-backoff 3 --compute-units-per-second 200 > /dev/null & + + # wait for fork to be ready + while ! cast bn --rpc-url http://127.0.0.1:${CHAIN2_PORT} &> /dev/null; do + sleep 1 + done +else + # run a second PI chain + anvil --chain-id 31338 -p ${CHAIN2_PORT} --state /tmp/${CHAIN2}/state --gas-price 1 > /dev/null & + sleep 1 +fi + set -e echo "{}" > /tmp/empty-artifacts.json @@ -39,58 +88,58 @@ echo "{}" > /tmp/empty-artifacts.json export DEBUG=hyperlane:* DEPLOYER=$(cast rpc eth_accounts | jq -r '.[0]') -BEFORE=$(cast balance $DEPLOYER --rpc-url http://localhost:8545) +BEFORE=$(cast balance $DEPLOYER --rpc-url http://127.0.0.1:${CHAIN1_PORT}) - -echo "Deploying contracts to anvil1 and anvil2" +echo "Deploying contracts to ${CHAIN1} and ${CHAIN2}" yarn workspace @hyperlane-xyz/cli run hyperlane deploy core \ - --targets anvil1,anvil2 \ - --chains ./examples/anvil-chains.yaml \ + --targets ${CHAIN1},${CHAIN2} \ + --chains ${EXAMPLES_PATH}/anvil-chains.yaml \ --artifacts /tmp/empty-artifacts.json \ - $(if [ "$HOOK_FLAG" == "true" ]; then echo "--hook ./examples/hooks.yaml"; fi) \ - --ism ./examples/ism.yaml \ + $(if [ "$HOOK_FLAG" == "true" ]; then echo "--hook ${EXAMPLES_PATH}/hooks.yaml"; fi) \ + --ism ${EXAMPLES_PATH}/ism.yaml \ --out /tmp \ --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ --yes -AFTER_CORE=$(cast balance $DEPLOYER --rpc-url http://localhost:8545) -GAS_PRICE=$(cast gas-price --rpc-url http://localhost:8545) +AFTER_CORE=$(cast balance $DEPLOYER --rpc-url http://127.0.0.1:${CHAIN1_PORT}) +GAS_PRICE=$(cast gas-price --rpc-url http://127.0.0.1:${CHAIN1_PORT}) CORE_MIN_GAS=$(bc <<< "($BEFORE - $AFTER_CORE) / $GAS_PRICE") echo "Gas used: $CORE_MIN_GAS" CORE_ARTIFACTS_PATH=`find /tmp/core-deployment* -type f -exec ls -t1 {} + | head -1` echo "Core artifacts:" echo $CORE_ARTIFACTS_PATH +cat $CORE_ARTIFACTS_PATH AGENT_CONFIG_FILENAME=`ls -t1 /tmp | grep agent-config | head -1` echo "Deploying warp routes" yarn workspace @hyperlane-xyz/cli run hyperlane deploy warp \ - --chains ./examples/anvil-chains.yaml \ + --chains ${EXAMPLES_PATH}/anvil-chains.yaml \ --core $CORE_ARTIFACTS_PATH \ - --config ./examples/warp-tokens.yaml \ + --config ${EXAMPLES_PATH}/warp-tokens.yaml \ --out /tmp \ --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ --yes -AFTER_WARP=$(cast balance $DEPLOYER --rpc-url http://localhost:8545) -GAS_PRICE=$(cast gas-price --rpc-url http://localhost:8545) +AFTER_WARP=$(cast balance $DEPLOYER --rpc-url http://127.0.0.1:${CHAIN1_PORT}) +GAS_PRICE=$(cast gas-price --rpc-url http://127.0.0.1:${CHAIN1_PORT}) WARP_MIN_GAS=$(bc <<< "($AFTER_CORE - $AFTER_WARP) / $GAS_PRICE") echo "Gas used: $WARP_MIN_GAS" echo "Sending test message" yarn workspace @hyperlane-xyz/cli run hyperlane send message \ - --origin anvil1 \ - --destination anvil2 \ + --origin ${CHAIN1} \ + --destination ${CHAIN2} \ --messageBody "Howdy!" \ - --chains ./examples/anvil-chains.yaml \ + --chains ${EXAMPLES_PATH}/anvil-chains.yaml \ --core $CORE_ARTIFACTS_PATH \ --quick \ --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ | tee /tmp/message1 -AFTER_MSG=$(cast balance $DEPLOYER --rpc-url http://localhost:8545) -GAS_PRICE=$(cast gas-price --rpc-url http://localhost:8545) +AFTER_MSG=$(cast balance $DEPLOYER --rpc-url http://127.0.0.1:${CHAIN1_PORT}) +GAS_PRICE=$(cast gas-price --rpc-url http://127.0.0.1:${CHAIN1_PORT}) MSG_MIN_GAS=$(bc <<< "($AFTER_WARP - $AFTER_MSG) / $GAS_PRICE") echo "Gas used: $MSG_MIN_GAS" @@ -98,15 +147,16 @@ MESSAGE1_ID=`cat /tmp/message1 | grep "Message ID" | grep -E -o '0x[0-9a-f]+'` echo "Message 1 ID: $MESSAGE1_ID" WARP_ARTIFACTS_FILE=`find /tmp/warp-deployment* -type f -exec ls -t1 {} + | head -1` -ANVIL1_ROUTER=`cat $WARP_ARTIFACTS_FILE | jq -r ".anvil1.router"` +CHAIN1_ROUTER="${CHAIN1_CAPS}_ROUTER" +declare $CHAIN1_ROUTER=$(cat $WARP_ARTIFACTS_FILE | jq -r ".${CHAIN1}.router") echo "Sending test warp transfer" yarn workspace @hyperlane-xyz/cli run hyperlane send transfer \ - --origin anvil1 \ - --destination anvil2 \ - --chains ./examples/anvil-chains.yaml \ + --origin ${CHAIN1} \ + --destination ${CHAIN2} \ + --chains ${EXAMPLES_PATH}/anvil-chains.yaml \ --core $CORE_ARTIFACTS_PATH \ - --router $ANVIL1_ROUTER \ + --router ${!CHAIN1_ROUTER} \ --quick \ --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ | tee /tmp/message2 @@ -118,28 +168,36 @@ cd ./rust echo "Pre-building validator with cargo" cargo build --bin validator -ANVIL_CONNECTION_URL="http://127.0.0.1" +# set some default agent env vars, used by both validators and relayer +export HYP_CHAINS_${CHAIN1_CAPS}_BLOCKS_REORGPERIOD=0 +export HYP_CHAINS_${CHAIN1_CAPS}_CUSTOMRPCURLS="http://127.0.0.1:${CHAIN1_PORT}" +export HYP_CHAINS_${CHAIN2_CAPS}_BLOCKS_REORGPERIOD=0 +export HYP_CHAINS_${CHAIN2_CAPS}_CUSTOMRPCURLS="http://127.0.0.1:${CHAIN2_PORT}" + VALIDATOR_PORT=9091 -for i in "anvil1 8545 ANVIL1" "anvil2 8555 ANVIL2" +for CHAIN in ${CHAIN1} ${CHAIN2} do + # don't need the second validator for pi<>core test + if [ "$CHAIN" == "$CHAIN2" ] && [ "$TEST_TYPE" == "$TEST_TYPE_PI_CORE" ]; then + echo "Skipping validator for $CHAIN2 due to $TEST_TYPE_PI_CORE test type" + continue + fi + VALIDATOR_PORT=$((VALIDATOR_PORT+1)) - set -- $i - echo "Running validator on $1 on port $VALIDATOR_PORT" + echo "Running validator on $CHAIN on port $VALIDATOR_PORT" export CONFIG_FILES=/tmp/${AGENT_CONFIG_FILENAME} - export HYP_ORIGINCHAINNAME=$1 - export HYP_CHAINS_${3}_BLOCKS_REORGPERIOD=0 + export HYP_ORIGINCHAINNAME=${CHAIN} export HYP_VALIDATOR_INTERVAL=1 - export HYP_CHAINS_${3}_CUSTOMRPCURLS=${ANVIL_CONNECTION_URL}:${2} export HYP_VALIDATOR_TYPE=hexKey export HYP_VALIDATOR_KEY=0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 export HYP_CHECKPOINTSYNCER_TYPE=localStorage - export HYP_CHECKPOINTSYNCER_PATH=/tmp/${1}/validator + export HYP_CHECKPOINTSYNCER_PATH=/tmp/${CHAIN}/validator export HYP_TRACING_LEVEL=debug export HYP_TRACING_FMT=compact export HYP_METRICSPORT=$VALIDATOR_PORT - cargo run --bin validator > /tmp/${1}/validator-logs.txt & + cargo run --bin validator > /tmp/${CHAIN}/validator-logs.txt & done echo "Validator running, sleeping to let it sync" @@ -147,26 +205,37 @@ echo "Validator running, sleeping to let it sync" sleep 15 echo "Done sleeping" -echo "Validator Announcement:" -cat /tmp/anvil1/validator/announcement.json +for CHAIN in ${CHAIN1} ${CHAIN2} +do + # only have one validator announce in pi<>core test + if [ "$CHAIN" == "$CHAIN2" ] && [ "$TEST_TYPE" == "$TEST_TYPE_PI_CORE" ]; then + echo "Skipping validator for $CHAIN2 due to $TEST_TYPE_PI_CORE test type" + continue + fi + + echo "Validator Announcement for ${CHAIN}:" + cat /tmp/${CHAIN}/validator/announcement.json +done echo "Pre-building relayer with cargo" cargo build --bin relayer echo "Running relayer" -export HYP_RELAYCHAINS=anvil1,anvil2 +export CONFIG_FILES=/tmp/${AGENT_CONFIG_FILENAME} +export HYP_RELAYCHAINS=${CHAIN1},${CHAIN2} export HYP_ALLOWLOCALCHECKPOINTSYNCERS=true export HYP_DB=/tmp/relayer export HYP_GASPAYMENTENFORCEMENT='[{"type":"none"}]' -export HYP_CHAINS_ANVIL1_SIGNER_TYPE=hexKey -export HYP_CHAINS_ANVIL1_SIGNER_KEY=0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 -export HYP_CHAINS_ANVIL2_SIGNER_TYPE=hexKey -export HYP_CHAINS_ANVIL2_SIGNER_KEY=0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 -export HYP_METRICSPORT=9091 +export HYP_CHAINS_${CHAIN1_CAPS}_SIGNER_TYPE=hexKey +export HYP_CHAINS_${CHAIN1_CAPS}_SIGNER_KEY=0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 +export HYP_CHAINS_${CHAIN2_CAPS}_SIGNER_TYPE=hexKey +export HYP_CHAINS_${CHAIN2_CAPS}_SIGNER_KEY=0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 +export HYP_METRICSPORT=9090 cargo run --bin relayer > /tmp/relayer/relayer-logs.txt & # This needs to be long to allow time for the cargo build to finish +echo "Waiting for relayer..." sleep 20 echo "Done running relayer, checking message delivery statuses" @@ -176,8 +245,8 @@ do echo "Checking delivery status of $1: $2" yarn workspace @hyperlane-xyz/cli run hyperlane status \ --id $2 \ - --destination anvil2 \ - --chains ./examples/anvil-chains.yaml \ + --destination ${CHAIN2} \ + --chains ${EXAMPLES_PATH}/anvil-chains.yaml \ --core $CORE_ARTIFACTS_PATH \ | tee /tmp/message-status-$1 if ! grep -q "$2 was delivered" /tmp/message-status-$1; then diff --git a/typescript/cli/examples/fork/anvil-chains.yaml b/typescript/cli/examples/fork/anvil-chains.yaml new file mode 100644 index 0000000000..70b889af38 --- /dev/null +++ b/typescript/cli/examples/fork/anvil-chains.yaml @@ -0,0 +1,21 @@ +# Configs for describing chain metadata for use in Hyperlane deployments or apps +# Consists of a map of chain names to metadata +# Schema here: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts +--- +anvil: + chainId: 31337 + domainId: 31337 + name: anvil + protocol: ethereum + rpcUrls: + - http: http://127.0.0.1:8545 + nativeToken: + name: Ether + symbol: ETH + decimals: 18 +ethereum: + rpcUrls: + - http: http://127.0.0.1:8555 + blocks: + confirmations: 1 + estimateBlockTime: 1 diff --git a/typescript/cli/examples/fork/ism.yaml b/typescript/cli/examples/fork/ism.yaml new file mode 100644 index 0000000000..f5eab57405 --- /dev/null +++ b/typescript/cli/examples/fork/ism.yaml @@ -0,0 +1,9 @@ +# A config for a multisig Interchain Security Module (ISM) +# Schema: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/ism/types.ts +# + +--- +anvil: + threshold: 1 # Number: Signatures required to approve a message + validators: # Array: List of validator addresses + - '0xa0ee7a142d267c1f36714e4a8f75612f20a79720' diff --git a/typescript/cli/examples/fork/warp-tokens.yaml b/typescript/cli/examples/fork/warp-tokens.yaml new file mode 100644 index 0000000000..95755bd191 --- /dev/null +++ b/typescript/cli/examples/fork/warp-tokens.yaml @@ -0,0 +1,26 @@ +# A config for a Warp Route deployment +# Typically used with the 'hyperlane deploy warp' command +# +# Token Types: +# native +# collateral +# synthetic +# collateralUri +# syntheticUri +# fastCollateral +# fastSynthetic +--- +base: + chainName: anvil + type: native + # address: 0x123... # Required for collateral types + # isNft: true # If the token is an NFT (ERC721), set to true + # owner: 0x123 # Optional owner address for synthetic token + # mailbox: 0x123 # Optional mailbox address route + # interchainGasPaymaster: 0x123 # Optional interchainGasPaymaster address +synthetics: + - chainName: ethereum + # You can optionally set the token metadata, otherwise the base token's will be used + # name: "MySyntheticToken" + # symbol: "MST" + # totalSupply: 10000000 diff --git a/typescript/helloworld/src/app/app.ts b/typescript/helloworld/src/app/app.ts index 44c1fcceed..be22a55393 100644 --- a/typescript/helloworld/src/app/app.ts +++ b/typescript/helloworld/src/app/app.ts @@ -61,7 +61,7 @@ export class HelloWorldApp extends RouterApp { message, tx, }); - return tx.wait(blocks?.confirmations || 1); + return tx.wait(blocks?.confirmations ?? 1); } async waitForMessageReceipt( From 9abdf7c832f2ba59080cdee339228f27eeaae362 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Fri, 8 Mar 2024 14:33:55 +0000 Subject: [PATCH 14/19] feat: tweak keyfunder params (#3301) resolves https://github.com/hyperlane-xyz/issues/issues/1103 - tune down eth L1 required balance - tune down L2s required balance - improve comment r.e. 5x L1->L2 multiplier - update + tidy up L2Chains types --------- Signed-off-by: Paul Balaji --- .../config/environments/mainnet3/funding.ts | 15 ++--- .../config/environments/testnet4/funding.ts | 9 +-- .../funding/fund-keys-from-deployer.ts | 62 +++++++++++-------- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index f2744eea4b..bd9fee31b2 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -9,7 +9,7 @@ import { environment } from './chains'; export const keyFunderConfig: KeyFunderConfig = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'c037206-20240220-152500', + tag: '402a7d4-20240308-134716', }, // We're currently using the same deployer key as mainnet. // To minimize nonce clobbering we offset the key funder cron @@ -26,20 +26,21 @@ export const keyFunderConfig: KeyFunderConfig = { connectionType: RpcConsensusType.Single, // desired balance config desiredBalancePerChain: { - arbitrum: '3', avalanche: '5', - base: '3', bsc: '5', celo: '3', - ethereum: '5', + ethereum: '0.5', gnosis: '5', inevm: '3', moonbeam: '5', - optimism: '3', polygon: '20', - polygonzkevm: '3', - scroll: '3', viction: '3', + // Funder boosts itself upto 5x balance on L2 before dispersing funds + arbitrum: '0.5', + base: '0.5', + optimism: '0.5', + polygonzkevm: '0.5', + scroll: '0.5', }, desiredKathyBalancePerChain: { arbitrum: '0.1', diff --git a/typescript/infra/config/environments/testnet4/funding.ts b/typescript/infra/config/environments/testnet4/funding.ts index 43228eb1e2..a0efc89347 100644 --- a/typescript/infra/config/environments/testnet4/funding.ts +++ b/typescript/infra/config/environments/testnet4/funding.ts @@ -9,7 +9,7 @@ import { environment } from './chains'; export const keyFunderConfig: KeyFunderConfig = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'c037206-20240220-152500', + tag: '402a7d4-20240308-134716', }, // We're currently using the same deployer key as testnet2. // To minimize nonce clobbering we offset the key funder cron @@ -27,16 +27,17 @@ export const keyFunderConfig: KeyFunderConfig = { // desired balance config desiredBalancePerChain: { alfajores: '5', - arbitrumgoerli: '0.5', bsctestnet: '5', fuji: '5', goerli: '0.5', mumbai: '5', - optimismgoerli: '0.5', plumetestnet: '0.2', + sepolia: '5', + // Funder boosts itself upto 5x balance on L2 before dispersing funds + arbitrumgoerli: '0.5', + optimismgoerli: '0.5', polygonzkevmtestnet: '1', scrollsepolia: '1', - sepolia: '5', }, desiredKathyBalancePerChain: { plumetestnet: '0.05', diff --git a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts index ee4c2da3d5..a768b0d9c8 100644 --- a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts +++ b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts @@ -65,29 +65,36 @@ const nativeBridges = { }, }; -type L2Chain = - | Chains.optimism - | Chains.optimismgoerli - | Chains.arbitrum - | Chains.arbitrumgoerli - | Chains.base; - -const L2Chains: ChainName[] = [ +const ArbNitroChains = [Chains.arbitrum, Chains.arbitrumgoerli] as const; +const OPStackChains = [ + Chains.base, Chains.optimism, Chains.optimismgoerli, - Chains.arbitrum, - Chains.arbitrumgoerli, - Chains.base, +] as const; +const PolygonCDKChains = [ + Chains.polygonzkevm, Chains.polygonzkevmtestnet, +] as const; +const ScrollZkEvmChains = [Chains.scroll, Chains.scrollsepolia] as const; + +type L2Chain = (typeof L2Chains)[number]; +const L2Chains: string[] = [ + ...ArbNitroChains, + ...OPStackChains, + ...PolygonCDKChains, + ...ScrollZkEvmChains, ]; -const L2ToL1: ChainMap = { - optimismgoerli: 'goerli', - arbitrumgoerli: 'goerli', - optimism: 'ethereum', - arbitrum: 'ethereum', - base: 'ethereum', - polygonzkevmtestnet: 'goerli', +const L2ToL1: Record = { + arbitrum: Chains.ethereum, + arbitrumgoerli: Chains.goerli, + base: Chains.ethereum, + optimism: Chains.ethereum, + optimismgoerli: Chains.goerli, + polygonzkevm: Chains.ethereum, + polygonzkevmtestnet: Chains.goerli, + scroll: Chains.ethereum, + scrollsepolia: Chains.sepolia, }; // Missing types declaration for bufio @@ -126,6 +133,9 @@ const MIN_DELTA_DENOMINATOR = ethers.BigNumber.from(10); const RC_FUNDING_DISCOUNT_NUMERATOR = ethers.BigNumber.from(2); const RC_FUNDING_DISCOUNT_DENOMINATOR = ethers.BigNumber.from(10); +// Funder should have desired balance multiplied by this constant +const L2_BRIDGING_MULTIPLIER = 5; + // The balance threshold of the IGP contract that must be met for the key funder // to call `claim()` const igpClaimThresholdPerChain: ChainMap = { @@ -545,13 +555,13 @@ class ContextFunder { this.desiredBalancePerChain[chain], 'ether', ); - // Optionally bridge ETH to L2 before funding the desired key. - // By bridging the funder with 10x the desired balance we save - // on L1 gas. + // When bridging ETH to L2 before funding the desired key, we top up funder + // to a constant multiplier of the desired balance. This reduces our spend + // on L1 gas by reducing the frequency of L1 operations. const bridgeAmount = await this.getFundingAmount( chain, funderAddress, - desiredBalanceEther.mul(5), + desiredBalanceEther.mul(L2_BRIDGING_MULTIPLIER), ); if (bridgeAmount.gt(0)) { await this.bridgeToL2(chain as L2Chain, funderAddress, bridgeAmount); @@ -698,13 +708,13 @@ class ContextFunder { ), }); let tx; - if (l2Chain.includes('optimism') || l2Chain.includes('base')) { + if ((OPStackChains as readonly string[]).includes(l2Chain)) { tx = await this.bridgeToOptimism(l2Chain, amount, to); - } else if (l2Chain.includes('arbitrum')) { + } else if ((ArbNitroChains as readonly string[]).includes(l2Chain)) { tx = await this.bridgeToArbitrum(l2Chain, amount); - } else if (l2Chain.includes('scroll')) { + } else if ((ScrollZkEvmChains as readonly string[]).includes(l2Chain)) { tx = await this.bridgeToScroll(l2Chain, amount, to); - } else if (l2Chain.includes('zkevm')) { + } else if ((PolygonCDKChains as readonly string[]).includes(l2Chain)) { tx = await this.bridgeToPolygonCDK(l2Chain, amount, to); } else { throw new Error(`${l2Chain} is not an L2`); From c2bf423add3c086aff4ef2a248700d2d46b0a685 Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Fri, 8 Mar 2024 11:45:41 -0500 Subject: [PATCH 15/19] Implement message id extraction for Cosmos (#3380) ### Description - Implement message id extraction for `CosmWasmCoreAdapter` - Add `extractMessageIds` method to `MultiProtocolCore` ### Related issues https://github.com/hyperlane-xyz/issues/issues/927 ### Backward compatibility Yes ### Testing Added unit tests --- .changeset/tasty-eyes-grin.md | 5 +++ typescript/sdk/src/core/MultiProtocolCore.ts | 9 ++++- .../core/adapters/CosmWasmCoreAdapter.test.ts | 36 +++++++++++++++++++ .../src/core/adapters/CosmWasmCoreAdapter.ts | 35 ++++++++++++++++-- .../src/core/adapters/SealevelCoreAdapter.ts | 1 - typescript/sdk/src/index.ts | 1 + 6 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 .changeset/tasty-eyes-grin.md create mode 100644 typescript/sdk/src/core/adapters/CosmWasmCoreAdapter.test.ts diff --git a/.changeset/tasty-eyes-grin.md b/.changeset/tasty-eyes-grin.md new file mode 100644 index 0000000000..7268abad75 --- /dev/null +++ b/.changeset/tasty-eyes-grin.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': patch +--- + +Implement message id extraction for CosmWasmCoreAdapter diff --git a/typescript/sdk/src/core/MultiProtocolCore.ts b/typescript/sdk/src/core/MultiProtocolCore.ts index ee0100bf9a..dcc9c00302 100644 --- a/typescript/sdk/src/core/MultiProtocolCore.ts +++ b/typescript/sdk/src/core/MultiProtocolCore.ts @@ -1,6 +1,6 @@ import debug from 'debug'; -import { ProtocolType } from '@hyperlane-xyz/utils'; +import { HexString, ProtocolType } from '@hyperlane-xyz/utils'; import { AdapterClassType, MultiProtocolApp } from '../app/MultiProtocolApp'; import { @@ -59,6 +59,13 @@ export class MultiProtocolCore extends MultiProtocolApp< throw new Error(`No adapter for protocol ${protocol}`); } + extractMessageIds( + origin: ChainName, + sourceTx: TypedTransactionReceipt, + ): Array<{ messageId: HexString; destination: ChainName }> { + return this.adapter(origin).extractMessageIds(sourceTx); + } + async waitForMessagesProcessed( origin: ChainName, destination: ChainName, diff --git a/typescript/sdk/src/core/adapters/CosmWasmCoreAdapter.test.ts b/typescript/sdk/src/core/adapters/CosmWasmCoreAdapter.test.ts new file mode 100644 index 0000000000..686b044f27 --- /dev/null +++ b/typescript/sdk/src/core/adapters/CosmWasmCoreAdapter.test.ts @@ -0,0 +1,36 @@ +import { expect } from 'chai'; + +import { Chains } from '../../consts/chains'; +import { MultiProtocolProvider } from '../../providers/MultiProtocolProvider'; +import { ProviderType } from '../../providers/ProviderType'; + +import { CosmWasmCoreAdapter } from './CosmWasmCoreAdapter'; + +const TX_RECEIPT = JSON.parse( + `{"height":62609917,"transactionHash":"3106A2BECE7FC03EC6F7FD3BC1577B9456C8B481A017A3A51AD7E9D27D9240A7","events":[{"type":"coin_spent","attributes":[{"key":"spender","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up"},{"key":"amount","value":"948228000000000inj"}]},{"type":"coin_received","attributes":[{"key":"receiver","value":"inj17xpfvakm2amg962yls6f84z3kell8c5l6s5ye9"},{"key":"amount","value":"948228000000000inj"}]},{"type":"transfer","attributes":[{"key":"recipient","value":"inj17xpfvakm2amg962yls6f84z3kell8c5l6s5ye9"},{"key":"sender","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up"},{"key":"amount","value":"948228000000000inj"}]},{"type":"message","attributes":[{"key":"sender","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up"}]},{"type":"tx","attributes":[{"key":"fee","value":"948228000000000inj"},{"key":"fee_payer","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up"}]},{"type":"tx","attributes":[{"key":"acc_seq","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up/20"}]},{"type":"tx","attributes":[{"key":"signature","value":"9XC7pL/hEa4PvJQxyAKdLpucpA/t+lNKzqfeSgUYTw9Old05Lbfx95GkIaXnuTOspCvYIZIuLesJ5wQHdL1Ljw=="}]},{"type":"message","attributes":[{"key":"action","value":"/cosmwasm.wasm.v1.MsgExecuteContract"},{"key":"sender","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up"},{"key":"module","value":"wasm"}]},{"type":"coin_spent","attributes":[{"key":"spender","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up"},{"key":"amount","value":"31000000000000000inj"}]},{"type":"coin_received","attributes":[{"key":"receiver","value":"inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k"},{"key":"amount","value":"31000000000000000inj"}]},{"type":"transfer","attributes":[{"key":"recipient","value":"inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k"},{"key":"sender","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up"},{"key":"amount","value":"31000000000000000inj"}]},{"type":"execute","attributes":[{"key":"_contract_address","value":"inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k"}]},{"type":"wasm-hpl_warp_native::transfer-remote","attributes":[{"key":"_contract_address","value":"inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k"},{"key":"sender","value":"inj16paaazy6t2ac02q5t8en099csy7pkyh3hw35up"},{"key":"recipient","value":"0000000000000000000000009a2d8681ffcc45b0c18e72b16fba9b2270b911ed"},{"key":"token","value":"inj"},{"key":"amount","value":"1000000000000000"}]},{"type":"coin_spent","attributes":[{"key":"amount","value":"30000000000000000inj"},{"key":"spender","value":"inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k"}]},{"type":"coin_received","attributes":[{"key":"amount","value":"30000000000000000inj"},{"key":"receiver","value":"inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt"}]},{"type":"transfer","attributes":[{"key":"amount","value":"30000000000000000inj"},{"key":"recipient","value":"inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt"},{"key":"sender","value":"inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k"}]},{"type":"execute","attributes":[{"key":"_contract_address","value":"inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt"}]},{"type":"wasm-mailbox_dispatch_id","attributes":[{"key":"_contract_address","value":"inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt"},{"key":"message_id","value":"afc6cabcf735ac7b13fb4f1a045c4d675ecf8363cac76a21612411e644041af2"}]},{"type":"wasm-mailbox_dispatch","attributes":[{"key":"_contract_address","value":"inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt"},{"key":"destination","value":"2525"},{"key":"message","value":"030000032e00696e6a000000000000000000000000db0ab932dd778c771c85636070d920ae90a66136000009dd00000000000000000000000026f32245fcf5ad53159e875d5cae62aecf19c2d40000000000000000000000009a2d8681ffcc45b0c18e72b16fba9b2270b911ed00000000000000000000000000000000000000000000000000038d7ea4c68000"},{"key":"recipient","value":"00000000000000000000000026f32245fcf5ad53159e875d5cae62aecf19c2d4"},{"key":"sender","value":"000000000000000000000000db0ab932dd778c771c85636070d920ae90a66136"}]},{"type":"execute","attributes":[{"key":"_contract_address","value":"inj1269dxcuyglc8mmecf95lf63elt3cq2tz57ka6h"}]},{"type":"wasm-hpl_hook_merkle::post_dispatch","attributes":[{"key":"_contract_address","value":"inj1269dxcuyglc8mmecf95lf63elt3cq2tz57ka6h"},{"key":"index","value":"814"},{"key":"message_id","value":"afc6cabcf735ac7b13fb4f1a045c4d675ecf8363cac76a21612411e644041af2"}]},{"type":"wasm-hpl_hook_merkle::inserted_into_tree","attributes":[{"key":"_contract_address","value":"inj1269dxcuyglc8mmecf95lf63elt3cq2tz57ka6h"},{"key":"index","value":"814"}]},{"type":"coin_spent","attributes":[{"key":"amount","value":"30000000000000000inj"},{"key":"spender","value":"inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt"}]},{"type":"coin_received","attributes":[{"key":"amount","value":"30000000000000000inj"},{"key":"receiver","value":"inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr"}]},{"type":"transfer","attributes":[{"key":"amount","value":"30000000000000000inj"},{"key":"recipient","value":"inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr"},{"key":"sender","value":"inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt"}]},{"type":"execute","attributes":[{"key":"_contract_address","value":"inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr"}]},{"type":"wasm-igp-core-pay-for-gas","attributes":[{"key":"_contract_address","value":"inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr"},{"key":"dest_domain","value":"2525"},{"key":"gas_amount","value":"250000"},{"key":"gas_refunded","value":"29999999999997500"},{"key":"gas_required","value":"2500"},{"key":"message_id","value":"afc6cabcf735ac7b13fb4f1a045c4d675ecf8363cac76a21612411e644041af2"},{"key":"payment","value":"30000000000000000"},{"key":"sender","value":"inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt"}]},{"type":"wasm-igp-core-post-dispatch","attributes":[{"key":"_contract_address","value":"inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr"},{"key":"message","value":"030000032e00696e6a000000000000000000000000db0ab932dd778c771c85636070d920ae90a66136000009dd00000000000000000000000026f32245fcf5ad53159e875d5cae62aecf19c2d40000000000000000000000009a2d8681ffcc45b0c18e72b16fba9b2270b911ed00000000000000000000000000000000000000000000000000038d7ea4c68000"},{"key":"metadata","value":"0x"}]},{"type":"coin_spent","attributes":[{"key":"amount","value":"29999999999997500inj"},{"key":"spender","value":"inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr"}]},{"type":"coin_received","attributes":[{"key":"amount","value":"29999999999997500inj"},{"key":"receiver","value":"inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k"}]},{"type":"transfer","attributes":[{"key":"amount","value":"29999999999997500inj"},{"key":"recipient","value":"inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k"},{"key":"sender","value":"inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr"}]}],"gasWanted":948228,"gasUsed":695543}`, +); + +describe('CosmWasmCoreAdapter', () => { + let adapter: CosmWasmCoreAdapter; + + it('constructs', () => { + adapter = new CosmWasmCoreAdapter( + Chains.injective, + new MultiProtocolProvider(), + { mailbox: '' }, + ); + expect(adapter).to.be.instanceOf(CosmWasmCoreAdapter); + }); + + it('extracts message IDs', () => { + const messages = adapter.extractMessageIds({ + type: ProviderType.CosmJsWasm, + receipt: TX_RECEIPT, + }); + expect(messages).to.have.length(1); + expect(messages[0].messageId).to.equal( + '0xafc6cabcf735ac7b13fb4f1a045c4d675ecf8363cac76a21612411e644041af2', + ); + expect(messages[0].destination).to.equal('inevm'); + }); +}); diff --git a/typescript/sdk/src/core/adapters/CosmWasmCoreAdapter.ts b/typescript/sdk/src/core/adapters/CosmWasmCoreAdapter.ts index 87517dd6b6..d7187d28a1 100644 --- a/typescript/sdk/src/core/adapters/CosmWasmCoreAdapter.ts +++ b/typescript/sdk/src/core/adapters/CosmWasmCoreAdapter.ts @@ -1,6 +1,6 @@ import { ExecuteInstruction } from '@cosmjs/cosmwasm-stargate'; -import { Address, HexString } from '@hyperlane-xyz/utils'; +import { Address, HexString, assert, ensure0x } from '@hyperlane-xyz/utils'; import { BaseCosmWasmAdapter } from '../../app/MultiProtocolApp'; import { @@ -24,6 +24,11 @@ import { ChainName } from '../../types'; import { ICoreAdapter } from './types'; +const MESSAGE_DISPATCH_EVENT_TYPE = 'wasm-mailbox_dispatch'; +const MESSAGE_DISPATCH_ID_EVENT_TYPE = 'wasm-mailbox_dispatch_id'; +const MESSAGE_ID_ATTRIBUTE_KEY = 'message_id'; +const MESSAGE_DESTINATION_ATTRIBUTE_KEY = 'destination'; + type MailboxResponse = | DefaultHookResponse | RequiredHookResponse @@ -169,8 +174,32 @@ export class CosmWasmCoreAdapter `Unsupported provider type for CosmosCoreAdapter ${sourceTx.type}`, ); } - // TODO: parse mailbox logs and extract message ids - throw new Error('Method not implemented.'); + const dispatchIdEvents = sourceTx.receipt.events.filter( + (e) => e.type === MESSAGE_DISPATCH_ID_EVENT_TYPE, + ); + const dispatchEvents = sourceTx.receipt.events.filter( + (e) => e.type === MESSAGE_DISPATCH_EVENT_TYPE, + ); + assert( + dispatchIdEvents.length === dispatchEvents.length, + 'Mismatched dispatch and dispatch id events', + ); + const result: Array<{ messageId: string; destination: ChainName }> = []; + for (let i = 0; i < dispatchIdEvents.length; i++) { + const idAttribute = dispatchIdEvents[i].attributes.find( + (a) => a.key === MESSAGE_ID_ATTRIBUTE_KEY, + ); + const destAttribute = dispatchEvents[i].attributes.find( + (a) => a.key === MESSAGE_DESTINATION_ATTRIBUTE_KEY, + ); + assert(idAttribute, 'No message id attribute found in dispatch event'); + assert(destAttribute, 'No destination attribute found in dispatch event'); + result.push({ + messageId: ensure0x(idAttribute.value), + destination: this.multiProvider.getChainName(destAttribute.value), + }); + } + return result; } async waitForMessageProcessed( diff --git a/typescript/sdk/src/core/adapters/SealevelCoreAdapter.ts b/typescript/sdk/src/core/adapters/SealevelCoreAdapter.ts index bd5adce441..4c584c2311 100644 --- a/typescript/sdk/src/core/adapters/SealevelCoreAdapter.ts +++ b/typescript/sdk/src/core/adapters/SealevelCoreAdapter.ts @@ -45,7 +45,6 @@ export class SealevelCoreAdapter if (!logs) throw new Error('Transaction logs required to check message delivery'); const parsedLogs = SealevelCoreAdapter.parseMessageDispatchLogs(logs); - if (!parsedLogs.length) throw new Error('Message dispatch log not found'); return parsedLogs.map(({ destination, messageId }) => ({ messageId: ensure0x(messageId), destination: this.multiProvider.getChainName(destination), diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index caa25b340d..ab174c86d2 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -63,6 +63,7 @@ export { TestRecipientConfig, TestRecipientDeployer, } from './core/TestRecipientDeployer'; +export { CosmWasmCoreAdapter } from './core/adapters/CosmWasmCoreAdapter'; export { EvmCoreAdapter } from './core/adapters/EvmCoreAdapter'; export { SealevelCoreAdapter } from './core/adapters/SealevelCoreAdapter'; export { ICoreAdapter } from './core/adapters/types'; From 845f3a70750b20a48dfdbb96656c7266403cbe2a Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 11 Mar 2024 13:46:17 +0000 Subject: [PATCH 16/19] Temporary inEVM gas payment enforcement, add back whitelist to RC config (#3382) ### Description - Stops enforcing gas payments on the inEVM / Injective warp route - Looks like we've been running the RC validator without a whitelist - this ensures it only tries to relay between the helloworld RC ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- solidity/test/test/TestSendReceiver.t.sol | 7 ++++++- .../config/environments/mainnet3/agent.ts | 20 +++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/solidity/test/test/TestSendReceiver.t.sol b/solidity/test/test/TestSendReceiver.t.sol index 4ca8cf666b..a946f7503f 100644 --- a/solidity/test/test/TestSendReceiver.t.sol +++ b/solidity/test/test/TestSendReceiver.t.sol @@ -98,9 +98,14 @@ contract TestSendReceiverTest is Test { vm.assume(blockNumber > 0); vm.roll(blockNumber); + console.log("blockNumber: ", blockNumber); + console.log("blockNumber 1: ", uint256(blockhash(blockNumber - 1))); + console.logBytes32(blockhash(blockNumber - 1)); + // console.log("blockNumber: ", string(blockhash(blockNumber))); + // blockhash(n) = n for forge tests // previousBlockHash() = blockhash(n-1) = n-1 - if (blockNumber % 16 == 1) { + if (uint256(blockhash(blockNumber - 1)) % 16 == 0) { vm.expectRevert("block hash ends in 0"); // blockhash(n-1) ends in 0 } else { vm.expectEmit(true, true, true, false, address(testSendReceiver)); // Process diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index b3734a7296..3d83b0a941 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -25,9 +25,9 @@ import arbitrumTIAAddresses from './warp/arbitrum-TIA-addresses.json'; import injectiveInevmAddresses from './warp/injective-inevm-addresses.json'; import mantaTIAAddresses from './warp/manta-TIA-addresses.json'; -// const releaseCandidateHelloworldMatchingList = routerMatchingList( -// helloWorld[Contexts.ReleaseCandidate].addresses, -// ); +const releaseCandidateHelloworldMatchingList = routerMatchingList( + helloWorld[Contexts.ReleaseCandidate].addresses, +); const repo = 'gcr.io/abacus-labs-dev/hyperlane-agent'; @@ -131,9 +131,17 @@ const hyperlane: RootAgentConfig = { docker: { repo, // Includes Cosmos block-by-block indexing. - tag: '9736164-20240307-131918', + tag: 'c2bf423-20240308-164604', }, - gasPaymentEnforcement, + gasPaymentEnforcement: [ + // Temporary measure to ensure all inEVM warp route messages are delivered - + // we saw some issues with IGP indexing. + { + type: GasPaymentEnforcementPolicyType.None, + matchingList: routerMatchingList(injectiveInevmAddresses), + }, + ...gasPaymentEnforcement, + ], metricAppContexts: [ { name: 'helloworld', @@ -175,7 +183,7 @@ const releaseCandidate: RootAgentConfig = { repo, tag: '9736164-20240307-131918', }, - // whitelist: releaseCandidateHelloworldMatchingList, + whitelist: releaseCandidateHelloworldMatchingList, gasPaymentEnforcement, transactionGasLimit: 750000, // Skipping arbitrum because the gas price estimates are inclusive of L1 From ee1f11b4e451a26c72cd56aae7cbd532075b4791 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Mon, 11 Mar 2024 14:15:01 +0000 Subject: [PATCH 17/19] =?UTF-8?q?fix(agents):=20add=20inevm=20to=20known?= =?UTF-8?q?=20domains=20and=20make=20igp=20indexing=20log=20war=E2=80=A6?= =?UTF-8?q?=20(#3387)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description adds inevm to known domains and makes igp indexing log warn level ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/agents/relayer/src/msg/pending_message.rs | 2 +- rust/hyperlane-core/src/chain.rs | 7 ++++--- solidity/test/test/TestSendReceiver.t.sol | 8 +------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/rust/agents/relayer/src/msg/pending_message.rs b/rust/agents/relayer/src/msg/pending_message.rs index 385c8db736..1294d45922 100644 --- a/rust/agents/relayer/src/msg/pending_message.rs +++ b/rust/agents/relayer/src/msg/pending_message.rs @@ -193,7 +193,7 @@ impl PendingOperation for PendingMessage { .await, "checking if message meets gas payment requirement" ) else { - info!(?tx_cost_estimate, "Gas payment requirement not met yet"); + warn!(?tx_cost_estimate, "Gas payment requirement not met yet"); return self.on_reprepare(); }; diff --git a/rust/hyperlane-core/src/chain.rs b/rust/hyperlane-core/src/chain.rs index d01e061758..9a23774b72 100644 --- a/rust/hyperlane-core/src/chain.rs +++ b/rust/hyperlane-core/src/chain.rs @@ -85,6 +85,7 @@ pub enum KnownHyperlaneDomain { Neutron = 1853125230, Injective = 6909546, + InEvm = 2525, PlumeTestnet = 161221135, @@ -220,7 +221,7 @@ impl KnownHyperlaneDomain { many_to_one!(match self { Mainnet: [ Ethereum, Avalanche, Arbitrum, Polygon, Optimism, BinanceSmartChain, Celo, - Moonbeam, Gnosis, MantaPacific, Neutron, Injective + Moonbeam, Gnosis, MantaPacific, Neutron, Injective, InEvm ], Testnet: [ Goerli, Mumbai, Fuji, ArbitrumGoerli, OptimismGoerli, BinanceSmartChainTestnet, @@ -237,7 +238,7 @@ impl KnownHyperlaneDomain { HyperlaneDomainProtocol::Ethereum: [ Ethereum, Goerli, Sepolia, Polygon, Mumbai, Avalanche, Fuji, Arbitrum, ArbitrumGoerli, Optimism, OptimismGoerli, BinanceSmartChain, BinanceSmartChainTestnet, Celo, Gnosis, - Alfajores, Moonbeam, MoonbaseAlpha, PolygonZkEvmTestnet, LineaGoerli, ScrollSepolia, + Alfajores, Moonbeam, InEvm, MoonbaseAlpha, PolygonZkEvmTestnet, LineaGoerli, ScrollSepolia, Chiado, MantaPacific, PlumeTestnet, Test1, Test2, Test3 ], HyperlaneDomainProtocol::Fuel: [FuelTest1], @@ -254,7 +255,7 @@ impl KnownHyperlaneDomain { HyperlaneDomainTechnicalStack::Other: [ Ethereum, Goerli, Sepolia, Polygon, Mumbai, Avalanche, Fuji, Optimism, OptimismGoerli, BinanceSmartChain, BinanceSmartChainTestnet, Celo, Gnosis, Alfajores, Moonbeam, MoonbaseAlpha, - PolygonZkEvmTestnet, LineaGoerli, ScrollSepolia, Chiado, MantaPacific, Neutron, Injective, + PolygonZkEvmTestnet, LineaGoerli, ScrollSepolia, Chiado, MantaPacific, Neutron, Injective, InEvm, Test1, Test2, Test3, FuelTest1, SealevelTest1, SealevelTest2, CosmosTest99990, CosmosTest99991 ], }) diff --git a/solidity/test/test/TestSendReceiver.t.sol b/solidity/test/test/TestSendReceiver.t.sol index a946f7503f..09b584a8bb 100644 --- a/solidity/test/test/TestSendReceiver.t.sol +++ b/solidity/test/test/TestSendReceiver.t.sol @@ -98,13 +98,7 @@ contract TestSendReceiverTest is Test { vm.assume(blockNumber > 0); vm.roll(blockNumber); - console.log("blockNumber: ", blockNumber); - console.log("blockNumber 1: ", uint256(blockhash(blockNumber - 1))); - console.logBytes32(blockhash(blockNumber - 1)); - // console.log("blockNumber: ", string(blockhash(blockNumber))); - - // blockhash(n) = n for forge tests - // previousBlockHash() = blockhash(n-1) = n-1 + // previousBlockHash() = blockhash(n-1) if (uint256(blockhash(blockNumber - 1)) % 16 == 0) { vm.expectRevert("block hash ends in 0"); // blockhash(n-1) ends in 0 } else { From 2173b8b2629755ed59d92c73df9b1ad955a8d057 Mon Sep 17 00:00:00 2001 From: Paul Balaji Date: Mon, 11 Mar 2024 14:42:00 +0000 Subject: [PATCH 18/19] Revert "feat: tweak keyfunder params" (#3384) Reverts hyperlane-xyz/hyperlane-monorepo#3301 but keeps the value changes --- .../config/environments/mainnet3/funding.ts | 2 +- .../config/environments/testnet4/funding.ts | 2 +- .../funding/fund-keys-from-deployer.ts | 62 ++++++++----------- 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index bd9fee31b2..84d38631cb 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -9,7 +9,7 @@ import { environment } from './chains'; export const keyFunderConfig: KeyFunderConfig = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '402a7d4-20240308-134716', + tag: 'c037206-20240220-152500', }, // We're currently using the same deployer key as mainnet. // To minimize nonce clobbering we offset the key funder cron diff --git a/typescript/infra/config/environments/testnet4/funding.ts b/typescript/infra/config/environments/testnet4/funding.ts index a0efc89347..1e5ce53003 100644 --- a/typescript/infra/config/environments/testnet4/funding.ts +++ b/typescript/infra/config/environments/testnet4/funding.ts @@ -9,7 +9,7 @@ import { environment } from './chains'; export const keyFunderConfig: KeyFunderConfig = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '402a7d4-20240308-134716', + tag: 'c037206-20240220-152500', }, // We're currently using the same deployer key as testnet2. // To minimize nonce clobbering we offset the key funder cron diff --git a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts index a768b0d9c8..ee4c2da3d5 100644 --- a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts +++ b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts @@ -65,36 +65,29 @@ const nativeBridges = { }, }; -const ArbNitroChains = [Chains.arbitrum, Chains.arbitrumgoerli] as const; -const OPStackChains = [ - Chains.base, +type L2Chain = + | Chains.optimism + | Chains.optimismgoerli + | Chains.arbitrum + | Chains.arbitrumgoerli + | Chains.base; + +const L2Chains: ChainName[] = [ Chains.optimism, Chains.optimismgoerli, -] as const; -const PolygonCDKChains = [ - Chains.polygonzkevm, + Chains.arbitrum, + Chains.arbitrumgoerli, + Chains.base, Chains.polygonzkevmtestnet, -] as const; -const ScrollZkEvmChains = [Chains.scroll, Chains.scrollsepolia] as const; - -type L2Chain = (typeof L2Chains)[number]; -const L2Chains: string[] = [ - ...ArbNitroChains, - ...OPStackChains, - ...PolygonCDKChains, - ...ScrollZkEvmChains, ]; -const L2ToL1: Record = { - arbitrum: Chains.ethereum, - arbitrumgoerli: Chains.goerli, - base: Chains.ethereum, - optimism: Chains.ethereum, - optimismgoerli: Chains.goerli, - polygonzkevm: Chains.ethereum, - polygonzkevmtestnet: Chains.goerli, - scroll: Chains.ethereum, - scrollsepolia: Chains.sepolia, +const L2ToL1: ChainMap = { + optimismgoerli: 'goerli', + arbitrumgoerli: 'goerli', + optimism: 'ethereum', + arbitrum: 'ethereum', + base: 'ethereum', + polygonzkevmtestnet: 'goerli', }; // Missing types declaration for bufio @@ -133,9 +126,6 @@ const MIN_DELTA_DENOMINATOR = ethers.BigNumber.from(10); const RC_FUNDING_DISCOUNT_NUMERATOR = ethers.BigNumber.from(2); const RC_FUNDING_DISCOUNT_DENOMINATOR = ethers.BigNumber.from(10); -// Funder should have desired balance multiplied by this constant -const L2_BRIDGING_MULTIPLIER = 5; - // The balance threshold of the IGP contract that must be met for the key funder // to call `claim()` const igpClaimThresholdPerChain: ChainMap = { @@ -555,13 +545,13 @@ class ContextFunder { this.desiredBalancePerChain[chain], 'ether', ); - // When bridging ETH to L2 before funding the desired key, we top up funder - // to a constant multiplier of the desired balance. This reduces our spend - // on L1 gas by reducing the frequency of L1 operations. + // Optionally bridge ETH to L2 before funding the desired key. + // By bridging the funder with 10x the desired balance we save + // on L1 gas. const bridgeAmount = await this.getFundingAmount( chain, funderAddress, - desiredBalanceEther.mul(L2_BRIDGING_MULTIPLIER), + desiredBalanceEther.mul(5), ); if (bridgeAmount.gt(0)) { await this.bridgeToL2(chain as L2Chain, funderAddress, bridgeAmount); @@ -708,13 +698,13 @@ class ContextFunder { ), }); let tx; - if ((OPStackChains as readonly string[]).includes(l2Chain)) { + if (l2Chain.includes('optimism') || l2Chain.includes('base')) { tx = await this.bridgeToOptimism(l2Chain, amount, to); - } else if ((ArbNitroChains as readonly string[]).includes(l2Chain)) { + } else if (l2Chain.includes('arbitrum')) { tx = await this.bridgeToArbitrum(l2Chain, amount); - } else if ((ScrollZkEvmChains as readonly string[]).includes(l2Chain)) { + } else if (l2Chain.includes('scroll')) { tx = await this.bridgeToScroll(l2Chain, amount, to); - } else if ((PolygonCDKChains as readonly string[]).includes(l2Chain)) { + } else if (l2Chain.includes('zkevm')) { tx = await this.bridgeToPolygonCDK(l2Chain, amount, to); } else { throw new Error(`${l2Chain} is not an L2`); From b1bc93bedf3c64c4aa3fd1df4e7b31ba47436d86 Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Tue, 12 Mar 2024 12:38:31 -0400 Subject: [PATCH 19/19] Var renaming for clarity --- .changeset/short-boats-suffer.md | 2 +- typescript/cli/ci-test.sh | 4 +- ...tokens.yaml => warp-route-deployment.yaml} | 0 ...oyment.yaml => warp-route-deployment.yaml} | 0 typescript/cli/src/commands/config.ts | 14 +++---- typescript/cli/src/commands/deploy.ts | 12 +++--- typescript/cli/src/config/warp.ts | 25 ++++++------ typescript/cli/src/deploy/warp.ts | 39 ++++++++++++------- 8 files changed, 54 insertions(+), 42 deletions(-) rename typescript/cli/examples/fork/{warp-tokens.yaml => warp-route-deployment.yaml} (100%) rename typescript/cli/examples/{warp-deployment.yaml => warp-route-deployment.yaml} (100%) diff --git a/.changeset/short-boats-suffer.md b/.changeset/short-boats-suffer.md index ecf110c7bb..6d9e8470d9 100644 --- a/.changeset/short-boats-suffer.md +++ b/.changeset/short-boats-suffer.md @@ -2,4 +2,4 @@ '@hyperlane-xyz/cli': patch --- -Update CLI Warp deployment output shape to new WarpCore config +Update CLI Warp route deployment output shape to new WarpCore config diff --git a/typescript/cli/ci-test.sh b/typescript/cli/ci-test.sh index 02a8116ec0..d0c49ad75b 100755 --- a/typescript/cli/ci-test.sh +++ b/typescript/cli/ci-test.sh @@ -117,7 +117,7 @@ echo "Deploying warp routes" yarn workspace @hyperlane-xyz/cli run hyperlane deploy warp \ --chains ${EXAMPLES_PATH}/anvil-chains.yaml \ --core $CORE_ARTIFACTS_PATH \ - --config ${EXAMPLES_PATH}/warp-deployment.yaml \ + --config ${EXAMPLES_PATH}/warp-route-deployment.yaml \ --out /tmp \ --key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ --yes @@ -146,7 +146,7 @@ echo "Gas used: $MSG_MIN_GAS" MESSAGE1_ID=`cat /tmp/message1 | grep "Message ID" | grep -E -o '0x[0-9a-f]+'` echo "Message 1 ID: $MESSAGE1_ID" -WARP_ARTIFACTS_FILE=`find /tmp/warp-deployment* -type f -exec ls -t1 {} + | head -1` +WARP_ARTIFACTS_FILE=`find /tmp/warp-route-deployment* -type f -exec ls -t1 {} + | head -1` CHAIN1_ROUTER="${CHAIN1_CAPS}_ROUTER" declare $CHAIN1_ROUTER=$(cat $WARP_ARTIFACTS_FILE | jq -r ".${CHAIN1}.router") diff --git a/typescript/cli/examples/fork/warp-tokens.yaml b/typescript/cli/examples/fork/warp-route-deployment.yaml similarity index 100% rename from typescript/cli/examples/fork/warp-tokens.yaml rename to typescript/cli/examples/fork/warp-route-deployment.yaml diff --git a/typescript/cli/examples/warp-deployment.yaml b/typescript/cli/examples/warp-route-deployment.yaml similarity index 100% rename from typescript/cli/examples/warp-deployment.yaml rename to typescript/cli/examples/warp-route-deployment.yaml diff --git a/typescript/cli/src/commands/config.ts b/typescript/cli/src/commands/config.ts index e122ae3d84..5823f3a6ab 100644 --- a/typescript/cli/src/commands/config.ts +++ b/typescript/cli/src/commands/config.ts @@ -9,8 +9,8 @@ import { readMultisigConfig, } from '../config/multisig.js'; import { - createWarpDeployConfig, - readWarpDeployConfig, + createWarpRouteDeployConfig, + readWarpRouteDeployConfig, } from '../config/warp.js'; import { FileFormat } from '../utils/files.js'; @@ -46,7 +46,7 @@ const createCommand: CommandModule = { .command(createChainConfigCommand) .command(createIsmConfigCommand) .command(createHookConfigCommand) - .command(createWarpDeployConfigCommand) + .command(createWarpRouteDeployConfigCommand) .version(false) .demandCommand(), handler: () => log('Command required'), @@ -116,12 +116,12 @@ const createHookConfigCommand: CommandModule = { }, }; -const createWarpDeployConfigCommand: CommandModule = { +const createWarpRouteDeployConfigCommand: CommandModule = { command: 'warp', describe: 'Create a new Warp Route deployment config', builder: (yargs) => yargs.options({ - output: outputFileOption('./configs/warp-deployment.yaml'), + output: outputFileOption('./configs/warp-route-deployment.yaml'), format: fileFormatOption, chains: chainsCommandOption, }), @@ -129,7 +129,7 @@ const createWarpDeployConfigCommand: CommandModule = { const format: FileFormat = argv.format; const outPath: string = argv.output; const chainConfigPath: string = argv.chains; - await createWarpDeployConfig({ format, outPath, chainConfigPath }); + await createWarpRouteDeployConfig({ format, outPath, chainConfigPath }); process.exit(0); }, }; @@ -220,7 +220,7 @@ const validateWarpCommand: CommandModule = { }), handler: async (argv) => { const path = argv.path as string; - readWarpDeployConfig(path); + readWarpRouteDeployConfig(path); logGreen('Config is valid'); process.exit(0); }, diff --git a/typescript/cli/src/commands/deploy.ts b/typescript/cli/src/commands/deploy.ts index 1260cbe6c2..54a34a2533 100644 --- a/typescript/cli/src/commands/deploy.ts +++ b/typescript/cli/src/commands/deploy.ts @@ -3,7 +3,7 @@ import { CommandModule } from 'yargs'; import { log, logGray } from '../../logger.js'; import { runKurtosisAgentDeploy } from '../deploy/agent.js'; import { runCoreDeploy } from '../deploy/core.js'; -import { runWarpDeploy } from '../deploy/warp.js'; +import { runWarpRouteDeploy } from '../deploy/warp.js'; import { ENV } from '../utils/env.js'; import { @@ -134,8 +134,8 @@ const warpCommand: CommandModule = { config: { type: 'string', description: - 'A path to a JSON or YAML file with a warp deployment config.', - default: './configs/warp-deployment.yaml', + 'A path to a JSON or YAML file with a warp route deployment config.', + default: './configs/warp-route-deployment.yaml', }, core: coreArtifactsOption, chains: chainsCommandOption, @@ -146,14 +146,14 @@ const warpCommand: CommandModule = { handler: async (argv: any) => { const key: string = argv.key || ENV.HYP_KEY; const chainConfigPath: string = argv.chains; - const warpDeploymentConfigPath: string | undefined = argv.config; + const warpRouteDeploymentConfigPath: string | undefined = argv.config; const coreArtifactsPath: string | undefined = argv.core; const outPath: string = argv.out; const skipConfirmation: boolean = argv.yes; - await runWarpDeploy({ + await runWarpRouteDeploy({ key, chainConfigPath, - warpDeploymentConfigPath, + warpRouteDeploymentConfigPath, coreArtifactsPath, outPath, skipConfirmation, diff --git a/typescript/cli/src/config/warp.ts b/typescript/cli/src/config/warp.ts index 1cb223e641..794d9bdef6 100644 --- a/typescript/cli/src/config/warp.ts +++ b/typescript/cli/src/config/warp.ts @@ -19,7 +19,7 @@ const ConnectionConfigSchema = { foreignDeployment: z.string().optional(), }; -export const WarpDeployConfigSchema = z.object({ +export const WarpRouteDeployConfigSchema = z.object({ base: z.object({ type: z.literal(TokenType.native).or(z.literal(TokenType.collateral)), chainName: z.string(), @@ -43,17 +43,18 @@ export const WarpDeployConfigSchema = z.object({ .nonempty(), }); -type InferredType = z.infer; +type InferredType = z.infer; // A workaround for Zod's terrible typing for nonEmpty arrays -export type WarpDeployConfig = { +export type WarpRouteDeployConfig = { base: InferredType['base']; synthetics: Array; }; -export function readWarpDeployConfig(filePath: string) { +export function readWarpRouteDeployConfig(filePath: string) { const config = readYamlOrJson(filePath); - if (!config) throw new Error(`No warp deploy config found at ${filePath}`); - const result = WarpDeployConfigSchema.safeParse(config); + if (!config) + throw new Error(`No warp route deploy config found at ${filePath}`); + const result = WarpRouteDeployConfigSchema.safeParse(config); if (!result.success) { const firstIssue = result.error.issues[0]; throw new Error( @@ -63,11 +64,11 @@ export function readWarpDeployConfig(filePath: string) { return result.data; } -export function isValidWarpDeployConfig(config: any) { - return WarpDeployConfigSchema.safeParse(config).success; +export function isValidWarpRouteDeployConfig(config: any) { + return WarpRouteDeployConfigSchema.safeParse(config).success; } -export async function createWarpDeployConfig({ +export async function createWarpRouteDeployConfig({ format, outPath, chainConfigPath, @@ -103,7 +104,7 @@ export async function createWarpDeployConfig({ // TODO add more prompts here to support customizing the token metadata - const result: WarpDeployConfig = { + const result: WarpRouteDeployConfig = { base: { chainName: baseChain, type: baseType, @@ -113,12 +114,12 @@ export async function createWarpDeployConfig({ synthetics: syntheticChains.map((chain) => ({ chainName: chain })), }; - if (isValidWarpDeployConfig(result)) { + if (isValidWarpRouteDeployConfig(result)) { logGreen(`Warp Route config is valid, writing to file ${outPath}`); writeYamlOrJson(outPath, result, format); } else { errorRed( - `Warp config is invalid, please see https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/warp-deployment.yaml for an example`, + `Warp route deployment config is invalid, please see https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/warp-route-deployment.yaml for an example`, ); throw new Error('Invalid multisig config'); } diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index fbb6f2cd19..392bcf7be4 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -23,7 +23,10 @@ import { import { Address, ProtocolType, objMap } from '@hyperlane-xyz/utils'; import { log, logBlue, logGray, logGreen } from '../../logger.js'; -import { WarpDeployConfig, readWarpDeployConfig } from '../config/warp.js'; +import { + WarpRouteDeployConfig, + readWarpRouteDeployConfig, +} from '../config/warp.js'; import { MINIMUM_WARP_DEPLOY_GAS } from '../consts.js'; import { getContext, getMergedContractAddresses } from '../context.js'; import { @@ -35,17 +38,17 @@ import { import { runPreflightChecks } from './utils.js'; -export async function runWarpDeploy({ +export async function runWarpRouteDeploy({ key, chainConfigPath, - warpDeploymentConfigPath, + warpRouteDeploymentConfigPath, coreArtifactsPath, outPath, skipConfirmation, }: { key: string; chainConfigPath: string; - warpDeploymentConfigPath?: string; + warpRouteDeploymentConfigPath?: string; coreArtifactsPath?: string; outPath: string; skipConfirmation: boolean; @@ -57,17 +60,25 @@ export async function runWarpDeploy({ skipConfirmation, }); - if (!warpDeploymentConfigPath || !isFile(warpDeploymentConfigPath)) { - if (skipConfirmation) throw new Error('Warp deployment config required'); - warpDeploymentConfigPath = await runFileSelectionStep( + if ( + !warpRouteDeploymentConfigPath || + !isFile(warpRouteDeploymentConfigPath) + ) { + if (skipConfirmation) + throw new Error('Warp route deployment config required'); + warpRouteDeploymentConfigPath = await runFileSelectionStep( './configs', - 'Warp deployment config', + 'Warp route deployment config', 'warp', ); } else { - log(`Using warp deployment config at ${warpDeploymentConfigPath}`); + log( + `Using warp route deployment config at ${warpRouteDeploymentConfigPath}`, + ); } - const warpRouteConfig = readWarpDeployConfig(warpDeploymentConfigPath); + const warpRouteConfig = readWarpRouteDeployConfig( + warpRouteDeploymentConfigPath, + ); const configs = await runBuildConfigStep({ warpRouteConfig, @@ -85,7 +96,7 @@ export async function runWarpDeploy({ skipConfirmation, }; - logBlue('Warp Deployment plan'); + logBlue('Warp route deployment plan'); await runDeployPlanStep(deploymentParams); await runPreflightChecks({ @@ -102,7 +113,7 @@ async function runBuildConfigStep({ coreArtifacts, skipConfirmation, }: { - warpRouteConfig: WarpDeployConfig; + warpRouteConfig: WarpRouteDeployConfig; multiProvider: MultiProvider; signer: ethers.Signer; coreArtifacts?: HyperlaneContractsMap; @@ -241,7 +252,7 @@ async function executeDeploy(params: DeployParams) { const { configMap, isNft, multiProvider, outPath } = params; const [contractsFilePath, tokenConfigPath] = prepNewArtifactsFiles(outPath, [ - { filename: 'warp-deployment', description: 'Contract addresses' }, + { filename: 'warp-route-deployment', description: 'Contract addresses' }, { filename: 'warp-ui-token-config', description: 'Warp UI token config' }, ]); @@ -262,7 +273,7 @@ async function executeDeploy(params: DeployParams) { } async function fetchBaseTokenMetadata( - base: WarpDeployConfig['base'], + base: WarpRouteDeployConfig['base'], multiProvider: MultiProvider, ): Promise { const { type, name, symbol, chainName, address, decimals } = base;